美文网首页架构社区我爱编程
Dubbo实践篇1——Dubbo+Zookeeper项目搭建(W

Dubbo实践篇1——Dubbo+Zookeeper项目搭建(W

作者: 千淘萬漉 | 来源:发表于2018-05-20 10:59 被阅读173次

    在我的博客《应用服务框架的演变历史》提到了一套经典的MVC框架体系,java里的实现方式是Spring +Struts +MyBatis +Tomcat,这种垂直应用架构体系有着天然的不足,当垂直应用越来越多,应用之间的交互不可避免,这时需要将核心业或公共的API抽取出来,可以作为独立的公共服务给其他调用者消费,实现服务的共享和重用,于是有了分布式的服务框架的需求,而目前较为成熟和广泛商用的开源分布式架构就是Dubbo+zookeeper技术

    本文以一个传统EDU管理后台应用来进行服务化改造,一步步进行服务的拆分和改造,将一个垂直的单体应用改造成一个基于windows开发环境下的dubbo+zk分布式服务,所需要的基本环境如下:

    dubbo、zk网盘下载地址:https://pan.baidu.com/s/1par3lEUFELpZRJ-xPme1gQ
    项目github开源地址:https://github.com/tisonkong/edu-dubbo

    一、搭建zk+dubbo环境

    1.zookeeper环境搭建

    zk解压到指定目录下,解压后,将con文件夹下的zoo_sample.cfg拷贝一份,重命名为zoo.cfg,注意修改cfg的内容如下,根据自己的目录来修改:

    # example sakes.
    dataDir=d:\\project\\zookeeper\\data
    dataLogDir=d:\\project\\zookeeper\\logs
    # the port at which the clients will connect
    

    windows系统下会使用zkServer.cmd开启,所以在bin目录下找到zkServer.cmd,双击开启,我们可以看到他的端口为2181


    正常启动界面

    如果启动后出现闪退,可以在zkServer.cmd文末添加“pause”,启动后会打印报错信息。

    2.dubbo控制后台的搭建

    下载好dubbo的war包后,添加到tomcat7的webapp/ROOT目录下,最好是复制一个tomcat7目录,将原来的ROOT文件都干掉,解压到当前目录:


    目录结构

    如果是window下安装,在apache-tomcat-7.0.88\webapps\ROOT\WEB-INF目下修改dubbo-admin.properties文件如下:

    dubbo.registry.address=zookeeper://127.0.0.1:2181
    dubbo.admin.root.password=root
    dubbo.admin.guest.password=guest
    

    启动好zk后,进入bin目录点击startup.bat,启动dubbo管理后台,如果有一下异常:


    zk为正常启动

    报zkEventThread异常需要重启zookeeper客户端,如果是URI异常,则是JDK版本不对,需要改为jdk7才能正常启动。正常启动后可在浏览器输入:http://localhost:8080/进行访问,有root和guest两个账号,密码等同于账号。

    dubbo管理后台界面

    二、单体应用服务化改造

    1.单体应用启动

    以上工作是进行的分布式环境的准备,接下来就要对一个实际后台应用进行模块拆分,单体应用的项目结构如下:


    edu-demo项目源码

    如果想要在本地启动该项目需要修改两处地方。

    • jdbc配置


      数据源配置修改
    • mysql脚本初始化,路径在源码地中已提供


      初始化脚本及位置

    配置好tomcat后即可进行访问


    登录界面图

    2.服务化改造

    将原来项目中的中心化的代码进行拆分,拆分的原则是基于MVC三层,web层的应用拆分到edu-web-boss中,实体类及接口的实现放到edu-facade-user中来,而edu-service-user则是业务逻辑层以及接口的实现类。


    拆分三大模块

    2.1 web服务消费者的修改
    web模块中的controller承担了服务消费者的角色,需要调用rpc远程服务,此处需要配置dubbo-consumer文件

    image.png

    修改注册中心的地址:

        <!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->
        <dubbo:application name="edu-web-boss" />
    
        <!-- 使用zookeeper注册中心暴露服务地址 -->
        <!-- 注册中心地址 -->
        <dubbo:registry protocol="zookeeper" address="127.0.0.1:2181" />
        
        <!-- 用户服务接口 -->
        <dubbo:reference interface="wusc.edu.facade.user.service.PmsUserFacade" id="pmsUserFacade" check="false" />
    
    

    2.2 服务发布者的修改
    此处需要修改的是对于数据源的访问,发布者来实现dao层的逻辑。

    jdbc.url=jdbc\:mysql\://127.0.0.1\:3306/edu_demo?useUnicode\=true&characterEncoding\=utf-8
    jdbc.username=root
    jdbc.password=root
    

    dubbo-provider配置文件也要进行服务中心的注册:

        <!-- 提供方应用信息,用于计算依赖关系 -->
        <dubbo:application name="gw-service-user" />
    
        <!-- 使用zookeeper注册中心暴露服务地址 -->
        <dubbo:registry protocol="zookeeper" address="127.0.0.1:2181" />
    
        <!-- 用dubbo协议在20880端口暴露服务 -->
        <dubbo:protocol name="dubbo" port="20880" />
            
        <!-- 用户服务接口 -->
        <dubbo:service interface="wusc.edu.facade.user.service.PmsUserFacade" ref="pmsUserFacade" />
    

    3.项目启动
    首先启动zk和dubbo客户端,然后启动服务发布者,需要在项目找到edu-service-user下的Test文件夹,服务发布者的注册是通过一个main()方法来实现的:

    public class DubboProvider {
        
        private static final Log log = LogFactory.getLog(DubboProvider.class);
    
        public static void main(String[] args) {
            try {
                ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring/spring-context.xml");
                context.start();
            } catch (Exception e) {
                log.error("== DubboProvider context start error:",e);
            }
            synchronized (DubboProvider.class) {
                while (true) {
                    try {
                        DubboProvider.class.wait();
                    } catch (InterruptedException e) {
                        log.error("== synchronized error:",e);
                    }
                }
            }
        }
    }
    

    启动了main方法后,然后启动edu的web功能,服务消费者就可以通过zk来远程调用注册的服务,这个时候可以在dubbo后台看到,有两个服务在运行,一方为服务的提供者,一方为服务的调用者:


    dubbo后台查看服务

    至此完成了基于传统项目的服务化改造,此次是在本机环境上搭建起来的分布式服务,基于开发环境这样的做法比较便捷,但是在生产环境来说,zk和dubbo都需要搭建在linux上,有时候还需要搭建zk集群,这个可以作为下一步学习的方向。详情可参考第二篇文章《Dubbo实践篇2——传统项目的持续优化(基于Linux)》

    相关文章

      网友评论

      本文标题:Dubbo实践篇1——Dubbo+Zookeeper项目搭建(W

      本文链接:https://www.haomeiwen.com/subject/raoodftx.html