Dubbo实践篇1——Dubbo+Zookeeper项目搭建(Windows实现)

在我的博客《应用服务框架的演变历史》提到了一套经典的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

《Dubbo实践篇1——Dubbo+Zookeeper项目搭建(Windows实现)》 正常启动界面

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

2.dubbo控制后台的搭建

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

《Dubbo实践篇1——Dubbo+Zookeeper项目搭建(Windows实现)》 目录结构

如果是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管理后台,如果有一下异常:

《Dubbo实践篇1——Dubbo+Zookeeper项目搭建(Windows实现)》 zk为正常启动

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

《Dubbo实践篇1——Dubbo+Zookeeper项目搭建(Windows实现)》 dubbo管理后台界面

二、单体应用服务化改造

1.单体应用启动

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

《Dubbo实践篇1——Dubbo+Zookeeper项目搭建(Windows实现)》 edu-demo项目源码

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

  • jdbc配置

    《Dubbo实践篇1——Dubbo+Zookeeper项目搭建(Windows实现)》 数据源配置修改

  • mysql脚本初始化,路径在源码地中已提供

    《Dubbo实践篇1——Dubbo+Zookeeper项目搭建(Windows实现)》 初始化脚本及位置

配置好tomcat后即可进行访问

《Dubbo实践篇1——Dubbo+Zookeeper项目搭建(Windows实现)》 登录界面图

2.服务化改造

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

《Dubbo实践篇1——Dubbo+Zookeeper项目搭建(Windows实现)》 拆分三大模块

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

《Dubbo实践篇1——Dubbo+Zookeeper项目搭建(Windows实现)》 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实践篇1——Dubbo+Zookeeper项目搭建(Windows实现)》 dubbo后台查看服务

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

    原文作者:YitaiCloud
    原文地址: https://www.jianshu.com/p/cb9373c1ddba
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞