使用Dubbo对传统项目工程进行服务化改造
1.使用Dubbo进行规模服务化前的工程结构优化
1.1 使用Dubbo是为了实现系统的分布式服务化
1.2 分布式服务架构的项目特点:
(1)多个服务
(2)多种类型的工程
(3)工程间需要相互调用
(4)如何实现工程间解耦?(高内聚、低耦合)
(5)工程该怎样拆分?
(6)如何对大量的工程进行合理有效管理?(高级篇:持续集成)
1.3原单工程项目:样例工程:传统的单工程项目(edu-demo)
使用技术:Maven,J-UI,Struts2,Spring3,MyBatis3,Druid,MySQL5.6
只有一个用户信息表(增、删除、查、改)
1.4改造后工程结构:
edu-common-parent(Maven父配置)
edu-common (公共工程)
edu-common-config (公共配置工程)
edu-common-core (公共core工程)
edu-common-web (公共web工程)
edu-facade-user(用户服务接口)
edu-service-user(用户服务实现)
edu-web-boss(服务消费者)
1.5 dubbo开发技术的使用
2.架构
• 节点角色说明:
•Provider: 暴露服务的服务提供方
•Consumer: 调用远程服务的服务消费方
•Registry: 服务注册与发现的注册中心
•Monitor: 统计服务的调用次数和调用时间的监控中心
•Container: 服务运行容器
调用关系说明:
0. 服务容器负责启动,加载,运行服务提供者。
1. 服务提供者在启动时,向注册中心注册自己提供的服务。
2. 服务消费者在启动时,向注册中心订阅自己所需的服务。
3. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
4. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
5. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
注册中心:可选方案:zookeeper、Redis
1、建议使用dubbo-2.3.3以上版本的使用zookeeper注册中心客户端
2、Zookeeper是Apache Hadoop的子项目,强度相对较好,建议生产环境使用该注册中心。
3、Dubbo未对Zookeeper服务器端做任何侵入修改,只需安装原生的Zookeeper服务器即可,
所有注册中心逻辑适配都在调用Zookeeper客户端时完成。
3.部署环境规划
组件 | 说明 | IP | port |
edu-web-boss | consumer | 192.168.1.111+192.168.1.112 | 8081 |
edu-service-user | provider | 192.168.1.111+192.168.1.112 | 8082 |
zookeeper-3.4.6 | 注册中心 | 192.168.1.106/107/108 | 2181-2182-2183 |
MySQL5.6 | 数据库 | 192.168.1.122 | 3306 |
这里把未分布式前的tomcat7变成:tomcat7-server1 tomcat7-server2
[root@edu-web-01 src]# mv tomcat7 tomcat7-server1
[root@edu-web-01 src]# cp -r tomcat7-server1 tomcat7-server2
修改tomcat7-server2的相关端口:
shutdown 端口:8005 主要负责启动关闭.
ajp端口:8009 主要负责通过ajp均衡(常用于apache和tomcat整合)
http端口:8081 可以通过web页面直接访问(nginx+tomcata整合)
#注* 如果tomcat1三个端口分别为:8005 8009 8081 ,那么tomcat2端口在此基础上都+1,即为:8006 8010 8082
4.安装Zookeeper单体/集群
注册中心集群/dubbo配置:<dubbo:registry address="zookeeper://192.168.1.106:2181?backup=192.168.1.107:2182,192.168.1.108:2183" />
5.安装Dubbo管控台
注:Dubbo管控台可以对注册到 zookeeper 注册中心的服务或服务消费者进行管理,但管控台是否正常对Dubbo服务没有影响,管控台也不需要高可用,因此可以单节点部署。
环境:
IP: 192.168.1.111 部署容器:dubbo-admin-tomcat 端口:8090
操作步骤:
(1) 下载(或上传)最新版的 Tomcat7(apache-tomcat-7.0.57.tar.gz)到 /usr/local/
(2)解压:$ tar -zxvf apache-tomcat-7.0.57.tar.gz
$ mv apache-tomcat-7.0.57 dubbo-admin-tomcat
注:这里因为共用服务器的的原因,修改端口信息:
#注* 如果tomcat1三个端口分别为:8005 8009 8080 ,那么tomcat2端口在此基础上都+10,即为:8015 8019 8090
(3) 移除/usr/local/tools/dubbo-admin-tomcat/webapps 目录下的所有文件:$ rm -rf *
(4)上传 Dubbo 管理控制台程序 dubbo-admin-2.5.3.war到/usr/local/dubbo-admin-tomcat/webapps
(5)解压并把目录命名为 ROOT:$ unzip dubbo-admin-2.5.3.war -d ROOT ,把 dubbo-admin-2.5.3.war 移到/home/wusc/tools 目录备份 $ mv dubbo-admin-2.5.3.war /home/wusc/tools
(6)配置 dubbo.properties:$ vi ROOT/WEB-INF/dubbo.properties
dubbo.registry.address=zookeeper://192.168.1.106:2181?backup=192.168.1.107:2182,192.168.1.108:2183
dubbo.admin.root.password=wusc.123
dubbo.admin.guest.password=wusc.123
这里意思是: root 密码 wusc.123 ; guest 密码 wusc.123
(以上密码在正式上生产前要修改)
(7)防火墙开启 8090 端口,用 root 用户修改/etc/sysconfig/iptables,
# vi /etc/sysconfig/iptables
增加:
# Firewall configuration written by system-config-securitylevel
# Manual customization of this file is not recommended.
*filter
## zookeeper
## dubbo-admin-tomcat:8090
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8090 -j ACCEPT
COMMIT
重启防火墙:# service iptables restart
(8) 启动 Tomat7-测试
$ /usr/local/src/dubbo-admin-tomcat/bin/startup.sh
浏览 http://192.168.1.111:8090/
(9)配置部署了 Dubbo 管控台的 Tomcat 开机启动:
在虚拟主机中编辑/etc/rc.local 文件,加入:
su - root -c '/usr/local/dubbo-admin-tomcat/bin/startup.sh'
11、应用链接到注册中心群集的测试。 (请看视频)
12、注册中心高可用集群的测试。 (请看视频)
提 示: 下 一节,注册中心集群的 链接 测试, 多 注册中心 集 群的 升级迁移。
多 注册中心 集 群的 升级迁移:从单节点迁移到集群上
!!!!!!!!!!!!!!!!!!!可能需要部署高可用的服务,才能演示,所以先看MQ集群!!!!!!!!!!!!!!!!!!!!!!!!!
6.使用Servlet 容器运行(Tomcat 、Jetty 等)
按照环境的设置部署项目,并测试
可以 Tomat 内存设置:
$ vi /usr/local/src/tomcat7-server1/bin/catalina.sh
#!/bin/sh
JAVA_OPTS='-Xms128m -Xmx512m -XX:PermSize=128m'
#启动
/usr/local/src/tomcat7-server2/bin/startup.sh & tail -f /usr/local/src/tomcat7-server2/logs/catalina.out
/usr/local/src/tomcat7-server1/bin/startup.sh & tail -f /usr/local/src/tomcat7-server1/logs/catalina.out
#停止
/usr/local/src/tomcat7-server2/bin/shutdown.sh & tail -f /usr/local/src/tomcat7-server2/logs/catalina.out
/usr/local/src/tomcat7-server1/bin/shutdown.sh & tail -f /usr/local/src/tomcat7-server1/logs/catalina.out
注:这个存在问题;
7.使用Maven构建Dubbo服务的可执行jar包 / 在Linux操作系统上手工部署Dubbo服务
不建议使用的Dubbo 服务的运行方式:
1 、使用Servlet 容器运行(Tomcat 、Jetty 等) 缺点:增加复杂性(端口、管理) 浪费资源(内存)
2 、自建Main 方法类来运行(Spring 容器) 缺点: Dobbo 本身提供的高级特性没用上,自已编写启动类可能会有缺陷
建议使用的Dubbo服务运行方式
3 、使用Dubbo 框架提供的Main 方法类来运行(Spring 容器)
( 优点:框架本身提供(com.alibaba.dubbo.container.Main) )
( 可实现优雅关机(ShutdownHook) )
注意点: spring-context.xml <import resource="classpath:spring/spring-xxx.xml" />
打包要点:
pom.xml 集合dubbo官方文档SpringContainer自动加载/META-INF/spring下的配置,需要转移配置文件
<!-- 结合com.alibaba.dubbo.container.Main -->
<resource>
<targetPath>${project.build.directory}/classes/META-INF/spring</targetPath>
<directory>src/main/resources/spring</directory>
<filtering>true</filtering>
<includes>
<include>spring-context.xml</include>
</includes>
</resource>
<!-- 打包jar文件时,配置manifest文件,加入lib包的jar依赖 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<classesDirectory>target/classes/</classesDirectory>
<archive>
<manifest>
<mainClass>com.alibaba.dubbo.container.Main</mainClass>
<!-- 打包时 MANIFEST.MF文件不记录的时间戳版本 -->
<useUniqueVersions>false</useUniqueVersions>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
</manifest>
<manifestEntries>
<Class-Path>.</Class-Path>
</manifestEntries>
</archive>
</configuration>
</plugin>
分别先构建:1.edu-common-paret 2.edu-common 3.edu-common-config 4.edu-common-core 5.edu-facade-user 6.edu-service-user
可以将edu-service-user.jar和lib包放到一个目录下,在本地CMD切换到目录 java -jar edu-service-user.jar可启动
部署要点:
IP:同tomcat的环境设置一样,选择部署目录:/usr/server
1.部署目录规范:
# mkdir -p /usr/server/edu/service/user
当然其他分布式服务,可以有:
# mkdir -p /usr/server/edu/service/account
# mkdir -p /usr/server/edu/service/order
# mkdir -p /usr/server/edu/service/queue
2.手工维护Dubbo服务:上传文件启动
# cd /usr/server/edu/service/user
# 上传
# 启动
java -jar edu-service-user.jar &
kill PID
kill -9 PID
3.自定义Dubbo服务维护的Shell脚本
脚本命名规范:
/usr/server/edu/service/xxx/service-xxx.sh
例如:/usr/server/edu/service/user/service-user.sh
#上传文件到 /usr/server/edu/service/user/
#设置启动权限:chmod 755 ./service-user.sh
效果:
cd /usr/server/edu/service/user/
./service-user.sh start
./service-user.sh stop
./service-user.sh restart
配置文件见附件 service-user.sh
4.服务维护注意事项(结合自定义的Shell脚本)
(1) 脚本规范---------尽可能通用
(2) 守护进程
(3) 内存调优设置-----按需调整
(4) 日志处理---------只保留应用Log4j输出的日志
(5) 避免服务冲突 ----进程名、端口
(6) 避免进程误杀-----全匹配
8.Tomcat 中 部署 web应用
见第6点
9.Dubbo 监控中心的介绍与简易监控中心的安装
Dubbo 监控中心的介绍
作用:负责统计各服务的调用次数,调用时间等,统计先在内存汇总后每分钟一次发送到监控中心服务器,并报表展示,为服务的运维采集数据。
监控中心是可选的:不是必须的,对提供者和调用者不影响
监控中心可自定义扩展:(1)个性化运维监控的需求:服务健康状态,服务的压力和性能状况,告警通知以便及时处理 (2)接口:到官方文档上具体看
简易监控中心的安装
作用:可以看到服务访问记录,成功次数,失败次数等等
安装包:
dubbo-monitor-simple-2.5.3-assembly.tar.gz
dubbo-monitor-simple-2.5.3-sources.jar
安装在:192.168.1.111:8091
安装步骤:
1.上传dubbo-monitor-simple-2.5.3-assembly.tar.gz到/root
2. 解压文件并修改文件名称:
# tar -zxvf ./dubbo-monitor-simple-2.5.3-assembly.tar.gz ;
# mv dubbo-monitor-simple-2.5.3 dubbo-monitor
# cd dubbo-monitor
3.编辑 dubbo.properties
# vi conf/dubbo.properties
dubbo-monitor 的配置文件内容如下:
dubbo.container=log4j,spring,registry,jetty
dubbo.application.name=simple-monitor
dubbo.application.owner=
#dubbo.registry.address=multicast://224.5.6.7:1234
dubbo.registry.address=zookeeper://192.168.1.106:2181?backup=192.168.1.107:2182,192.168.1.108:2183
#dubbo.registry.address=redis://127.0.0.1:6379
#dubbo.registry.address=dubbo://127.0.0.1:9090
dubbo.protocol.port=7070
dubbo.jetty.port=8091
dubbo.jetty.directory=${user.home}/monitor
dubbo.charts.directory=${dubbo.jetty.directory}/charts
dubbo.statistics.directory=${user.home}/monitor/statistics
dubbo.log4j.file=logs/dubbo-monitor-simple.log
dubbo.log4j.level=WARN
dubbo-monitor 的安装目录为:/home/wusc/dubbo-monitor
dubbo-monitor 的配置文件为:/home/wusc/dubbo-monitor/conf/dubbo.properties
我用的root用户则:
dubbo-monitor 的安装目录为:/root/dubbo-monitor
dubbo-monitor 的配置文件为:/root/dubbo-monitor/conf/dubbo.properties
看上面配置文件中标红的的 3 行内容:
理解${user.home}这个变量的意思则可,${user.home}指的就是启动 dubbo-monitor 程序的操作系统用户目录。我们这里用的是 wusc 用户,那么就是/home/wusc 目录(如果是 root 用户启动,那就是/root)。
此时,配置中 3 个目录的绝对路径为:
dubbo.jetty.directory=/home/wusc/monitor
dubbo.charts.directory=/home/wusc/monitor/charts
dubbo.statistics.directory=/home/wusc/monitor/statistics
我用的root用户,则:
dubbo.jetty.directory=/root/monitor
dubbo.charts.directory=/root/monitor/charts
dubbo.statistics.directory=/root/monitor/statistics
4.打开防火墙,配置文件中8091和7070端口
# vi /etc/sysconfig/iptables
增加:
# Firewall configuration written by system-config-securitylevel
# Manual customization of this file is not recommended.
*filter
## zookeeper
## dubbo-admin-tomcat:8090
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8091 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 7070 -j ACCEPT
COMMIT
重启防火墙:# service iptables restart
5.启动
# cd /root/dubbo-monitor/bin
# ./start.sh &
注:启动时当内存不足时无法启动
在 Dubbo 服务提供者和服务消费者中的 spring 配置文件中增加以下配置:
<!-- 监控中心配置 -->
<!-- 监控中心协议,如果为protocol="registry",表示从注册中心发现监控中心地址,否则直连监控中心 -->
<!-- 直连监控中心服务器地址,如:address="192.168.3.71:7070" -->
<dubbo:monitor protocol= "registry" />
2.添加完以上配置后,重新构建部署 Dubbo 服务和服务消费者应用
重新启动 dubbo-monitor 简易监控中心,此时就会看到以上 3 个目录会被创新,并在目录里面有相应的服务接口调用的报表数据。
此时再进入 Dubbo 简易监控中心就能查看到对应的报表数据