构建基于Dubbo的分布式项目

使用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单体/集群

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
  关于${user.home}的解释 操作系统用户为 wusc,系统用户目录为/home/wusc
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 简易监控中心就能查看到对应的报表数据

 

 

 

 

猜你喜欢

转载自zjjndnr.iteye.com/blog/2388981