Dubbo实践篇1——Dubbo+Zookeeper项目搭建(W
在我的博客《应用服务框架的演变历史》提到了一套经典的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两个账号,密码等同于账号。
二、单体应用服务化改造
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文件
修改注册中心的地址:
<!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->
<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)》。