Dubbo初体验

摘要

  • 官网地址,官网有完整的资料以帮助使用者快速熟悉dubbo,不过目前相关下载地址已经失效,代码已经迁移到github,请参看下面的代码地址,自行编译打包

dubbo代码地址

git、maven、jdk、tomcat、nexus请自行安装,我安装的版本如下

git version 2.9.3
Apache Maven 3.3.9
java version “1.8.0_31”
tomcat version 8.5.4
nexus version 2.5.0-04

编译打包

以dubbo2.8.4为例

发布dubbo2.8.4到nexus的3rd party仓库

  • 登录nexus,设置3rd party的Deployment Policy=Allow Redeploy(在Configuration中配置)

  • vi ~/.m2/settings.xml,在servers中增加如下配置

1
2
3
4
5
<server>
<id>thirdparty</id>
<username>admin</username>
<password>admin123</password>
</server>
  • 修改dubbox的pom.xml,增加如下配置

1
2
3
4
5
6
<distributionManagement>
<repository>
<id>thirdparty</id>
<url>http://192.168.36.49:8080/nexus/content/repositories/thirdparty/</url>
</repository>
</distributionManagement>
  • mvn clean package deploy -Dmaven.test.skip=true

发布dubbo2.5.4到nexus的3rd party仓库

  • 因为目前2.5.4是Snapshots版本,所以不能直接发布到3rd party中,如果要发布到3rd party,需要修改pom.xml,去掉版本号中的Snapshots,比如在intellij IDEA中,使用快捷键Command+Shift+R;

dubbo包含四个组件

  • Provider: 暴露服务的服务提供方。这里我们自己提供(基于2.8.4);

  • Consumer: 调用远程服务的服务消费方。这里我们自己提供(基于2.8.4);

  • Registry: 服务注册与发现的注册中心。这里使用zookeeper;

  • Monitor: 统计服务的调用次调和调用时间的监控中心。这里介绍两个,一个是dubbo提供的dubbo-monitor-simple,另一个是第三方对dubbo-monitor-simple的改进版本:改版的monitor(基于2.8.4)


下面分别介绍:顺序为Registry,Provider,Consumer,Monitor。


ZooKeeper Registry注册中心

官网地址

下载安装

1
2
3
4
$ wget http://apache.fayea.com/zookeeper/zookeeper-3.4.9/zookeeper-3.4.9.tar.gz
$ tar zxvf zookeeper-3.4.9.tar.gz
$ cd zookeeper-3.4.9
$ cp conf/zoo_sample.cfg conf/zoo.cfg

配置

$ vi conf/zoo.cfg

1
2
3
4
5
6
tickTime=2000
initLimit=10
syncLimit=5
#实际上只需要配置dataDir,这里修改为自己的存储目录
dataDir=/usr/local/zookeeper-3.4.9/data
clientPort=2181

集群配置

  • 分别在两台主机上按上述方法安装zookeeper,比如两台主机的IP分别为192.168.37.144、192.168.37.143;

  • 分别在两台主机的zoo.cfg中增加如下配置

1
2
server.1=192.168.37.144:2555:3555
server.2=192.168.37.143:2555:3555
  • 在144主机的dataDir指定的目录(/usr/local/zookeeper-3.4.9/data)下创建文件myid

vi myid
设置内容为1 #就是zoo.cfg中server.后面对应的数字

  • 同理将143的myid文件中内容设置为2

开放端口

  • 两台主机分别开放2181,2555,3555端口
    vi /etc/sysconfig/iptablse,加入如下内容

1
2
3
4
#zookeeper
-A INPUT -p tcp -m state --state NEW -m tcp --dport 2181 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 2555 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 3555 -j ACCEPT
  • 重启iptables

启动与关闭zookeeper

./bin/zkServer.sh start
./bin/zkServer.sh stop

查看在zookeeper中注册的信息

echo dump | nc 192.168.37.144 2181
OR
telnet 192.168.37.144 2188
dump


关于Provider&Consumer,阿里官方的实例很详细了,网上也有很多资料,这里只做简单的说明,示例项目依赖于dubbo2.8.4,spring替换为4.3.3,使用中并未见异常,示例源码地址:https://github.com/hanqunfeng/DubboStudy


Provider 服务提供者

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
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-4.3.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

<!-- 一个项目中只能有一个dubbo:application配置项 -->
<dubbo:application name="demo-provider" owner="hanqf" organization="dubbox"/>

<!-- 使用zookeeper注册中心暴露服务地址-->
<dubbo:registry
address="zookeeper://192.168.37.144:2181?backup=192.168.37.143:2181" timeout="50000"/>

<!-- 用dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="dubbo" port="20880"/>

<!-- 声明需要暴露的服务接口 服务实现类是通过注解注册的,所以此处不需要声明实现类 -->
<dubbo:service interface="web.function.demo.service.DemoService" ref="demoService"/>
<dubbo:service interface="web.function.demo.service.Demo2Service" ref="demo2Service"/>

<!-- 启用monitor服务,只有配置这个,才会主动向monitor推送信息 -->
<dubbo:monitor protocol="registry" />
</beans>
  • 不同的Provider之间可以使用相同的应用名称(比如这里是name=“demo-provider”),因为注册的服务只基于服务所在服务器的ip地址和dubbo协议开放的端口号,两者有一个不相同即可,但是不建议这样做。

  • 对于提供相同服务的Provider,也就是副本(同一个war包,部署到不同主机),则可以不去修改name,但是对于提供不同服务的Provider,不要使用相同的name,这样不便于在monitor中查看。

  • 对于同一个Provider,要在同一台主机中部署(同一个war包,部署到同一台主机),则需要修改duboo协议端口,比如示例代码中的dubbo-provider和dubbo-provider02,因为两者提供相同的服务,所以应用名称相同,但是因为都在本机部署,所以一个用20880,一个使用20881

Consumer 服务消费者

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
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-4.3.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

<dubbo:application name="demo-consumer" owner="hanqf" organization="dubbox"/>

<!-- 设置check的缺省值,如果配置中有显式的声明,如:<dubbo:reference check="true"/>,不会受影响 -->
<!-- 关闭所有服务的启动时检查,注意:如果关闭某个服务的启动时检查,需要在指定的服务单独配置check="false" -->
<dubbo:consumer check="false" />

<dubbo:registry protocol="zookeeper"
address="192.168.37.144:2181,192.168.37.143:2181" timeout="50000"/>

<!-- 用dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="dubbo" port="20880"/>

<!-- 声明需要暴露的服务接口 -->
<dubbo:reference interface="web.function.demo.service.DemoService" id="demoService" timeout="50000"/>
<dubbo:reference interface="web.function.demo.service.Demo2Service" id="demo2Service" timeout="50000"/>

<dubbo:monitor protocol="registry" />
</beans>
  • Consumer和Provider如果部署在同一台主机,可以使用相同的dubbo协议端口,两者不受影响


关于相关配置属性的说明,还是参考官方资料吧,在dubbo源码中已经包含了Consumer和Provider的示例,可以作为参考。


Monitor

dubbo-monitor-simple 简易监控中心

  • dubbo项目源码中已经自带了一个Monitor,就是dubbo-monitor-simple,使用maven编译后,会在dubbox/dubbo-simple/dubbo-monitor-simple/target下生成dubbo-monitor-simple-2.8.4-assembly.tar.gz

  • 将dubbo-monitor-simple-2.8.4-assembly.tar.gz拷贝的合适的地方并解压

1
2
3
$ tar -zxvf dubbo-monitor-simple-2.8.4-assembly.tar.gz
$ cd dubbo-monitor-simple-2.8.4
$ vi conf/dubbo.properties
  • 主要修改zookeeper地址、端口、绘图目录(该目录必须手工创建,比如这里是/Users/hanqunfeng/monitor):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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.37.144:2181?backup=192.168.37.143:2181
#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=8085
dubbo.jetty.directory=/Users/hanqunfeng/monitor
dubbo.charts.directory=${dubbo.jetty.directory}/charts
dubbo.statistics.directory=/Users/hanqunfeng/monitor/statistics
dubbo.log4j.file=logs/dubbo-monitor-simple.log
dubbo.log4j.level=WARN
  • 启动与关闭

./bin/start.sh
./bin/stop.sh

  • 浏览器访问 http://localhost:8085 ,图表中的效果是注册了Provider,Consumer的效果

改版的monitor(基于2.8.4)

  • 特点:使用mysql作为数据存储,界面使用bootstrap进行优化

  • 下载

1
2
$ git clone http://git.oschina.net/handu/dubbo-monitor
$ cd dubbo-monitor
  • 配置
    vi src/main/resources/application.properties,修改zookeeper地址,端口,数据库信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
dubbo.application.name=dubbo-monitor
dubbo.application.owner=hanqunfeng
dubbo.registry.address=zookeeper://192.168.37.144:2181?backup=192.168.37.143:2181
dubbo.protocol.port=6060

# Database Settings
db.url=jdbc:mysql://127.0.0.1:3306/monitor?prepStmtCacheSize=517&cachePrepStmts=true&autoReconnect=true&characterEncoding=utf-8
db.username=root
db.password=password
db.maxActive=500

# System Manager
manager.username=admin
manager.password=admin
  • 数据库初始化

  • 创建monitor数据库

  • 执行sql目录下的create.sql

  • 打包
    mvn clean package -Dmaven.test.skip=true

基于本地nexus编译打包时,提示找不到jetbrick-template-2.0.10.jar,去maven中央仓库下载再上传到nexus中吧。


最后说一下dubbo-admin,这个是dubbo官方提供的dubbo管理控制台
官方说明:管理控制台为内部裁剪版本,开源部分主要包含:路由规则,动态配置,服务降级,访问控制,权重调整,负载均衡,等管理功能。


dubbo-admin 管理控制台

dubbo项目源码中有一个模块叫做dubbo-admin

cd dubbox/dubbo-admin/src/main/webapp/WEB-INF
vi dubbo.properties
配置dubbo.registry.address=zookeeper://192.168.37.144:2181?backup=192.168.37.143:2181
编译打包,将生成的dubbo-admin-2.8.4.war部署到tomcat