最近在公司用到阿里的dubbo做RPC分布式服务化,记录一下项目服务环境搭建的一些过程,方便后来的同行可以少走些弯路,欢迎大家一起交流分享。
一、环境准备
6台机器如下:
用到的软件如下:
jdk-7u79-linux-x64.rpm、zookeeper-3.3.6-2181、apache-tomcat-7.0.57.tar.gz、dubbo-admin.war。
说明:zookeeperA、zookeeperB、zookeeperC上都安装jdk-7u79-linux-x64.rpm和zookeeper-3.3.6-2181。
tomcat(dubbo-provider)、tomcat(dubbo-consumer)、tomcat(dubbo-admin) 上都安装jdk-7u79-linux-x64.rpm、apache-tomcat-7.0.57.tar.gz。
在tomcat(dubbo-provider)这台机器上部署web-provider服务化的接口。
在tomcat(dubbo-consumer)上部署web-consumer服务消费的项目。
dubbo-provider和dubbo-consumer都可以分别集群化部署,增强服务的安全性和健壮性等。
tomcat(dubbo-admin) 部署dubbo的管理后台dubbo-admin.war
========================================================================
二、zookeeper分布式集群安装配置
(zookeeper服务器最好是奇数个,因为选举时以过半数即通过)
在zookeeperA上操作:
# cd zookeeper-3.3.6-2181/conf
# mv zoo_sample.cfg zoo.cfg
# vi zoo.cfg
修改配置为如下:
其中server.A=B:C:D的A是集群节点ID,B是机器IP或域名,C是节点数据交互端口,D是重新选举时用的选举端口。还有dataDir不能用相对地址,不然会导致zookeeper启动失败,而且dataDir对应的目录必须存在。
在zookeeper根目录下创建数据目录data
#mkdir ../data
在数据目录data下新建服务器id文件myid
# vi myid
写入服务器集群标识符号:103 并保存。
在zookeeperB、zookeeperC上做zookeeperA同样的操作,唯一不同的是设置myid文件值分别为104、105.
在zookeeperA、zookeeperB、zookeeperC上安装配置完后,分别启动zookeeper:
zookeeper常用命令:
./zkServer.sh start 启动zookeeper服务
./zkServer.sh stop 停止zookeeper服务
./zkServer.sh restart 重启zookeeper服务
./zkServer.sh status 查看zookeeper服务启动状态
./zkCli.sh -server ${leader_address}:2888 连接进入zookeeper客户端命令行,${leader_address}必须是leader
如下:
========================================================================
三、dubbo-provider服务提供者
这里的provider是用springmvc+spring+mybatis+mysql搭建的项目,spring中整合了dubbo,项目结构如下:
注:一定要把服务提供方的需要暴露的接口CountService.java单独打成jar包,导入到服务消费方。
dubbo关键依赖包:
spring依赖包,netty-3.2.10.Final.jar,dubbo-2.5.3.jar,javassist-3.9.0.GA.jar,zkclient-0.1.jar,zookeeper-3.4.6.jar
关键配置spring-provider.xml配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd" default-lazy-init="true">
<bean id="countService" class="com.web.service.impl.CountServiceImpl"/>
<!--提供方应用名,用于计算依赖关系,不是匹配条件,不要与消费方一样 -->
<dubbo:application name="${dubbo.name}"/> <!-- 使用multicast广播注册中心暴露发现服务地址 -->
<dubbo:registry protocol="zookeeper" address="${dubbo.address}"/>
<dubbo:protocol name="dubbo" port="2888" />
<!-- ============================对外暴露提供调用的服务 ==============================-->
<dubbo:service interface="com.web.service.CountService" ref="countService" />
</beans>
========================================================================
四、dubbo-consumer服务消费者
这里的consumer也是用springmvc+spring+mybatis+mysql搭建的项目,spring中整合了dubbo,项目结构如下:
dubbo关键依赖包:
spring依赖包,netty-3.2.10.Final.jar,dubbo-2.5.3.jar,javassist-3.9.0.GA.jar,zkclient-0.1.jar,zookeeper-3.4.6.jar
关键配置spring-consumer.xml配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd" default-lazy-init="true">
<!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->
<dubbo:application name="${dubbo.name}"/> <!-- 使用multicast广播注册中心暴露发现服务地址 -->
<dubbo:registry protocol="zookeeper" address="${dubbo.address}"/> <!-- 生成远程服务代理,可以和本地bean一样使用demoService -->
<!-- ============================begin User Module ==============================-->
<dubbo:reference id="countService" interface="com.web.service.CountService" timeout="5000" check="false"/>
消费形式可以直接在控制层或服务层直接调用provider提供的远程方法,RPC远程过程调用。
========================================================================
五、dubbo-admin服务管理后台
下载dubbo-admin,
直接解压并修改WEB-INF下的dubbo.properties为:
dubbo.registry.address=zookeeper://192.168.1.104:2181
dubbo.admin.root.password=root
dubbo.admin.guest.password=guest
重命名项目名为:ROOT,删除tomcat中webapp下默认的项目,把ROOT部署到tomcat,(注:tomcat8不兼容,只能是tomcat7或tomcat6).
然后在浏览器访问项目:http://192.168.1.107
在弹出框输入dubbo管理后台的账号密码即可登录如下:
可以看到刚刚部署上去的provider和consumer两个项目,这个控制台可以做好些监控和管理。
========================================================================
六、项目测试
可以看到consumer直接调用provider的远程方法,可以成功返回数据。后面要扩展暴露多个服务可以直接在dubbo.xml配置文件里面配置,同时要调用多个服务也一样在consumer的dubbo.xml里面配置即可像本地方法一样调用远程方法。另外,provider和consumer可以分别做集群部署,提高可靠性和可用性。