深入理解Java SOA 架构Dubbo系列—— 第二回 搭建dubbo-demo环境
2017-09-13 11:53
1196 查看
本文目的
阶段一 基于本地调用的dubbo框架
阶段二 基于Zookeeper注册中心的dubbo框架
相关资料
基于本地调用的dubbo代码框架
基于注册中心的dubbo代码框架
一旦提到某某架构,可能很多人的第一感觉就是:这个东西很复杂,很难实际操作。其实不然,只要获得对的资料,搭建自己的dubbo框架并不是一件难事,不过由于历史原因,很多资料过于老旧,引用的文档也已经被废弃,所以从零搭建自己的Dubbo框架,可能会遇到不少问题,如果不是老司机,很容易翻车中途放弃。
本文的目的就是一步一步带您搭建出一个可用于生产环境的Dubbo代码框架。这个过程,会分三个步骤完成。
改造官方Demo,精简demo项目,使得工程最后仅包括一个 service-provider,和 service-consumer 。Provider是服务提供者,通过开放Http端口,等待请求到来。Consumer 是服务调用着,通过Http请求调用服务。这个阶段,调用仅仅是本地调用,我们只有一个服务提供者,和一个服务消费者,消费者通过指定本地URL的方式调用提供者。
service-consumerHTTP Local Callservice-provider
但是dubbo框架不仅仅调用本地服务,它更强大的是,利用注册中心,调用远端服务,同时提供一系列的机制,实现服务发现,负载均衡等。注册中心的实现有很多中,本文采用Zookeeper作为注册中心,注册中心的工作原理大概可以用下面的时序图描述:
consumerconsumerRegistery (ZK)Registery (ZK)providerprovider注册服务查找服务服务调用调用返回
该图只是最简单的情况,真实场景中,会有
1b3ee
多个服务提供者,也会有多个消费者,组成交叉式的调用关系。
然后,我们会安装服务监控器,dubbo-monitor-simple, 有了它,所有的服务提供者和消费者的状态,都可以一览无遗。
monitor还有会把调用统计数据,用各种丰富的表格展示出来,真实屌炸天的东西。
好吧,那就开始吧!
唯一官网:dubbo.io
源代码:https://github.com/alibaba/dubbo
1. GitHub 上Clone最新代码:
2
3
4
2. 导入demo工程
2.1拷贝项目
如果按照官方例子,导入所有的工程,并不是很好的方案,在实际生产环境下,我们也不希望维护那么多类库工程。所以这里我只拷贝demo工程到另外一个目录下。
2
这里涉及到的目录结构如下dubbo-demodubbo-demo-apidubbo-demo-providerdubbo-demo-consumerpom.xml
其中api工程声明了 Service 提供的接口,provider 实现了 api 接口,并对外开放http端口,consumer依赖 api 工程,但是不会直接依赖provider工程。 这种可以让消费者仅仅依赖api工程,而不需要对provider工程的依赖,也是松耦合的经典。
2.2修改POM文件
在这里我们会修改 dubbo-demo 根pom,去掉它的parent设置,让它成为独立的工程,同时配置它所依赖的项目。
简而言之,就是去掉
2
中的内容,然后修改后的pom头部如下:
2
3
4
5
修改相关依赖,核心思想就是把dubbo源代码中根pom的相关依赖复制过来,并且最重要的,加上
2
3
4
5
通过这样的方式,你已经把dubbo通过maven依赖的方式放在工程里了,完全不需要用引入官方工程的方式做项目依赖。
在Eclispe中(笔者使用的是,STS),File - Import - Exisiting Maven Projects
的方式导入工程。
3. 修复依赖工程不存在的错误
刚刚导入的consumer 和 provider工程可能会有如下错误:
可以在项目依赖中,删除这些项目,其实他们已经不需要了。
4. 导出conf目录
对于consumer 和 provider工程,有一个很重要的文件,dubbo.properties, 默认情况下,dubbo框架会加载这个文件,这个文件打包在
需要手动导出这个目录到Classpath,否则程序运行找不到dubbo配置文件。
5. 修改 dubbo.properties
该文件中,定义了注册中心,是一个不生效的地址,所以要把它禁止掉。这个文件的配置十分重要,后续出现的相关配置会再次提到这个文件,可以参考dubbo.io 获取更多关于配置的详细描述。
2
3
4
5
注释掉那些默认的注册地址,把它改成N/A. 在测试环境中,也需要修改这个文件
6. 运行DemoProvider.main
如果工程没有其他问题,可以启动服务。如果成功会在Console中打印
7. 运行 Consumer.main
在运行支持有一件事,要处理,否则会出现无法找到服务。
打开文件:
会看到一行引用声明:
2
在Consumer工程中,正是用这样声明的方式定义所需的微服务的,它通过ProxyFactoryBean的方式,封装了内部真正的实现。这个细节后面会深入探讨。
这里的问题是,我们没有启动注册中心,所以会出现服务不能被调用的异常。所以这里,在声明中,指定我们要调用的服务URL,修改成如下:
2
3
然后启动:DemoConsumer.main
如果一切顺利,会出现如下输出。
2
3
4
到这里,一份完全基于本地调用,禁用了注册中心的微服务程序框架就建立起来了。其实在开发环境下,我们完全可以仅仅使用基于本地的调用,在测试环节和生产环节,可以通过替换配置文件的方式采用注册中心的方式部署。 本地调用方式更方便调试。采用注册中心的方式开发,如果采用统一注册中心,程序员A做本地开发,可能会调用其他人的程序,如果每人用不同的注册中心,这样会提高开发成本,毕竟开发过程中,我只希望我的 Consumer 调用我本地的 Provider.
关于官方给出的三种注册中心安装方法, 本文将使用Zookeeper作为 registry center.
1. 安装 Zookeeper
2
3
4
5
6
7
8
9
10
11
12
13
2. 配置 Zookeeper 注册中心
修改所有的 dubbo.properties, 之前我们使用 N/A 禁用了注册中心,现在我们使用zookeeper的方式。
2
再次启动服务,这次Console输出的log有很多不同,说明已经是通过Zookeeper注册中心了。
2
3
4
5
6
7
8
9
10
11
12
13
14
15
同样的方式修改consumer工程的 dubbo 配置,然后我们启动consumer的main.
不过在此之前,我们是调用的本地服务,指明了服务的URL,这里我们要把这个指定去掉,通过注册中心找到服务。
所以修改 service 引用如下:
2
启动DemoConsumer.main
2
3
4
其实,如果对zookeeper的原理少有了解的话,可以进入 zkclient查看当前节点.
2
其实服务的Provider定义,就是在zookeeper节点的数据上。
3. 配置监控中心
当服务的提供者有很多,而消费者也有很多的时候,管理这些服务会十分棘手,所以官方提供了一个Monitor项目,通过配置,启动后,可以在浏览器中,查看服务提供者和消费者的所有状态。
可以使用 mvn 在 dubbo 根目录方式执行 install 的方式生产 dubbo-monitor-simple. 然后解压。
2
3
4
5
6
7
启动后,可以通过 127.0.0.1:8088 直接访问监控中心。
里面也可以查询所有服务调用的状态,并且提供图表的方式
到这里,dubbo-demo 的代码框架就搭建完成了。运行程序可以使用官方打包的方式,在部署的时候更为方便。
接下来,在后续的文章里,笔者会通过阅读源代码的方式,分析dubbo核心的实现原理。
阶段一 基于本地调用的dubbo框架
阶段二 基于Zookeeper注册中心的dubbo框架
相关资料
基于本地调用的dubbo代码框架
基于注册中心的dubbo代码框架
本文目的
一旦提到某某架构,可能很多人的第一感觉就是:这个东西很复杂,很难实际操作。其实不然,只要获得对的资料,搭建自己的dubbo框架并不是一件难事,不过由于历史原因,很多资料过于老旧,引用的文档也已经被废弃,所以从零搭建自己的Dubbo框架,可能会遇到不少问题,如果不是老司机,很容易翻车中途放弃。本文的目的就是一步一步带您搭建出一个可用于生产环境的Dubbo代码框架。这个过程,会分三个步骤完成。
阶段一 基于本地调用的dubbo框架
改造官方Demo,精简demo项目,使得工程最后仅包括一个 service-provider,和 service-consumer 。Provider是服务提供者,通过开放Http端口,等待请求到来。Consumer 是服务调用着,通过Http请求调用服务。这个阶段,调用仅仅是本地调用,我们只有一个服务提供者,和一个服务消费者,消费者通过指定本地URL的方式调用提供者。service-consumerHTTP Local Callservice-provider
阶段二 基于Zookeeper注册中心的dubbo框架
但是dubbo框架不仅仅调用本地服务,它更强大的是,利用注册中心,调用远端服务,同时提供一系列的机制,实现服务发现,负载均衡等。注册中心的实现有很多中,本文采用Zookeeper作为注册中心,注册中心的工作原理大概可以用下面的时序图描述:consumerconsumerRegistery (ZK)Registery (ZK)providerprovider注册服务查找服务服务调用调用返回
该图只是最简单的情况,真实场景中,会有
1b3ee
多个服务提供者,也会有多个消费者,组成交叉式的调用关系。
然后,我们会安装服务监控器,dubbo-monitor-simple, 有了它,所有的服务提供者和消费者的状态,都可以一览无遗。
monitor还有会把调用统计数据,用各种丰富的表格展示出来,真实屌炸天的东西。
好吧,那就开始吧!
相关资料
唯一官网:dubbo.io 源代码:https://github.com/alibaba/dubbo
基于本地调用的dubbo代码框架
1. GitHub 上Clone最新代码:cd ~ git clone https://github.com/alibaba/dubbo.git dubbo git checkout master or: git checkout -b dubbo-2.4.01
2
3
4
2. 导入demo工程
2.1拷贝项目
如果按照官方例子,导入所有的工程,并不是很好的方案,在实际生产环境下,我们也不希望维护那么多类库工程。所以这里我只拷贝demo工程到另外一个目录下。
cp -R ./dubbo/dubbo-demo ./ cd dubbo-demo1
2
这里涉及到的目录结构如下dubbo-demodubbo-demo-apidubbo-demo-providerdubbo-demo-consumerpom.xml
其中api工程声明了 Service 提供的接口,provider 实现了 api 接口,并对外开放http端口,consumer依赖 api 工程,但是不会直接依赖provider工程。 这种可以让消费者仅仅依赖api工程,而不需要对provider工程的依赖,也是松耦合的经典。
2.2修改POM文件
在这里我们会修改 dubbo-demo 根pom,去掉它的parent设置,让它成为独立的工程,同时配置它所依赖的项目。
简而言之,就是去掉
<parent> </parent>1
2
中的内容,然后修改后的pom头部如下:
<groupId>com.alibaba</groupId> <version>2.5.4-SNAPSHOT</version> <artifactId>dubbo-demo</artifactId> <packaging>pom</packaging> <name>${project.artifactId}</name>1
2
3
4
5
修改相关依赖,核心思想就是把dubbo源代码中根pom的相关依赖复制过来,并且最重要的,加上
<dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.5.3</version> </dependency>1
2
3
4
5
通过这样的方式,你已经把dubbo通过maven依赖的方式放在工程里了,完全不需要用引入官方工程的方式做项目依赖。
在Eclispe中(笔者使用的是,STS),File - Import - Exisiting Maven Projects
的方式导入工程。
3. 修复依赖工程不存在的错误
刚刚导入的consumer 和 provider工程可能会有如下错误:
可以在项目依赖中,删除这些项目,其实他们已经不需要了。
4. 导出conf目录
对于consumer 和 provider工程,有一个很重要的文件,dubbo.properties, 默认情况下,dubbo框架会加载这个文件,这个文件打包在
src/main/assembly/conf1
需要手动导出这个目录到Classpath,否则程序运行找不到dubbo配置文件。
5. 修改 dubbo.properties
该文件中,定义了注册中心,是一个不生效的地址,所以要把它禁止掉。这个文件的配置十分重要,后续出现的相关配置会再次提到这个文件,可以参考dubbo.io 获取更多关于配置的详细描述。
#dubbo.registry.address=multicast://224.5.6.7:1234 #dubbo.registry.address=zookeeper://127.0.0.1:2181 #dubbo.registry.address=redis://127.0.0.1:6379 #dubbo.registry.address=dubbo://127.0.0.1:9090 dubbo.registry.address=N/A1
2
3
4
5
注释掉那些默认的注册地址,把它改成N/A. 在测试环境中,也需要修改这个文件
src/test/resources/dubbo.properties1
6. 运行DemoProvider.main
如果工程没有其他问题,可以启动服务。如果成功会在Console中打印
[2016-09-13 23:14:37] Dubbo service server started!1
7. 运行 Consumer.main
在运行支持有一件事,要处理,否则会出现无法找到服务。
打开文件:
src/main/resources/META-INF/spring/dubbo-demo-consumer.xml1
会看到一行引用声明:
<dubbo:reference id="demoService" interface= "com.alibaba.dubbo.demo.DemoService"/>1
2
在Consumer工程中,正是用这样声明的方式定义所需的微服务的,它通过ProxyFactoryBean的方式,封装了内部真正的实现。这个细节后面会深入探讨。
这里的问题是,我们没有启动注册中心,所以会出现服务不能被调用的异常。所以这里,在声明中,指定我们要调用的服务URL,修改成如下:
<dubbo:reference id="demoService" url="dubbo://localhost:20880/com.alibaba.dubbo.demo.DemoService" interface="com.alibaba.dubbo.demo.DemoService" />1
2
3
然后启动:DemoConsumer.main
如果一切顺利,会出现如下输出。
[2016-09-13 23:14:37] Dubbo service server started! [08:10:24] Hello world0, request from consumer: /192.168.0.100:62146 [08:10:26] Hello world1, request from consumer: /192.168.0.100:62146 [08:10:28] Hello world2, request from consumer: /192.168.0.100:621461
2
3
4
到这里,一份完全基于本地调用,禁用了注册中心的微服务程序框架就建立起来了。其实在开发环境下,我们完全可以仅仅使用基于本地的调用,在测试环节和生产环节,可以通过替换配置文件的方式采用注册中心的方式部署。 本地调用方式更方便调试。采用注册中心的方式开发,如果采用统一注册中心,程序员A做本地开发,可能会调用其他人的程序,如果每人用不同的注册中心,这样会提高开发成本,毕竟开发过程中,我只希望我的 Consumer 调用我本地的 Provider.
基于注册中心的dubbo代码框架
关于官方给出的三种注册中心安装方法, 本文将使用Zookeeper作为 registry center.1. 安装 Zookeeper
cd ~ 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/conf cp zoo_sample.cfg zoo.cfg vi zoo.cfg - edit: dataDir=/Users/Vic/data/zookeeper cd .. [~/zookeeper-3.4.9]$ ./bin/zkServer.sh start ZooKeeper JMX enabled by default Using config: /Users/Vic/zookeeper-3.4.9/bin/../conf/zoo.cfg Starting zookeeper ... STARTED1
2
3
4
5
6
7
8
9
10
11
12
13
2. 配置 Zookeeper 注册中心
修改所有的 dubbo.properties, 之前我们使用 N/A 禁用了注册中心,现在我们使用zookeeper的方式。
dubbo.registry.address=zookeeper://127.0.0.1:2181 #dubbo.registry.address=N/A1
2
再次启动服务,这次Console输出的log有很多不同,说明已经是通过Zookeeper注册中心了。
[14/09/16 09:08:13:013 CST] main INFO zookeeper.ZooKeeper: Client environment:os.arch=x86_64 [14/09/16 09:08:13:013 CST] main INFO zookeeper.ZooKeeper: Client environment:os.version=10.11.6 [14/09/16 09:08:13:013 CST] main INFO zookeeper.ZooKeeper: Client environment:user.name=Vic [14/09/16 09:08:13:013 CST] main INFO zookeeper.ZooKeeper: Client environment:user.home=/Users/Vic [14/09/16 09:08:13:013 CST] main INFO zookeeper.ZooKeeper: Client environment:user.dir=/Users/Vic/dubbo/dubbo-demo/dubbo-demo-provider [14/09/16 09:08:13:013 CST] main INFO zookeeper.ZooKeeper: Initiating client connection, connectString=127.0.0.1:2181 sessionTimeout=30000 watcher=org.I0Itec.zkclient.ZkClient@1c32386d [14/09/16 09:08:13:013 CST] main-SendThread() INFO zookeeper.ClientCnxn: Opening socket connection to server /127.0.0.1:2181 [14/09/16 09:08:13:013 CST] main-SendThread(localhost:2181) INFO zookeeper.ClientCnxn: Socket connection established to localhost/127.0.0.1:2181, initiating session [14/09/16 09:08:13:013 CST] main-SendThread(localhost:2181) INFO zookeeper.ClientCnxn: Session establishment complete on server localhost/127.0.0.1:2181, sessionid = 0x1572635168a0000, negotiated timeout = 30000 [14/09/16 09:08:13:013 CST] main-EventThread INFO zkclient.ZkClient: zookeeper state changed (SyncConnected) [14/09/16 09:08:13:013 CST] main INFO zookeeper.ZookeeperRegistry: [DUBBO] Register: dubbo://192.168.0.100:20880/com.alibaba.dubbo.demo.DemoService?anyhost=true&application=demo-provider&dubbo=2.5.3&interface=com.alibaba.dubbo.demo.DemoService&loadbalance=roundrobin&methods=sayHello&owner=william&pid=4539&side=provider×tamp=1473815263007, dubbo version: 2.5.3, current host: 127.0.0.1 [14/09/16 09:08:13:013 CST] main INFO zookeeper.ZookeeperRegistry: [DUBBO] Subscribe: provider://192.168.0.100:20880/com.alibaba.dubbo.demo.DemoService?anyhost=true&application=demo-provider&category=configurators&check=false&dubbo=2.5.3&interface=com.alibaba.dubbo.demo.DemoService&loadbalance=roundrobin&methods=sayHello&owner=william&pid=4539&side=provider×tamp=1473815263007, dubbo version: 2.5.3, current host: 127.0.0.1 [14/09/16 09:08:13:013 CST] main INFO zookeeper.ZookeeperRegistry: [DUBBO] Notify urls for subscribe url provider://192.168.0.100:20880/com.alibaba.dubbo.demo.DemoService?anyhost=true&application=demo-provider&category=configurators&check=false&dubbo=2.5.3&interface=com.alibaba.dubbo.demo.DemoService&loadbalance=roundrobin&methods=sayHello&owner=william&pid=4539&side=provider×tamp=1473815263007, urls: [empty://192.168.0.100:20880/com.alibaba.dubbo.demo.DemoService?anyhost=true&application=demo-provider&category=configurators&check=false&dubbo=2.5.3&interface=com.alibaba.dubbo.demo.DemoService&loadbalance=roundrobin&methods=sayHello&owner=william&pid=4539&side=provider×tamp=1473815263007], dubbo version: 2.5.3, current host: 127.0.0.1 [14/09/16 09:08:13:013 CST] main INFO container.Main: [DUBBO] Dubbo SpringContainer started!, dubbo version: 2.5.3, current host: 127.0.0.1 [2016-09-14 09:08:13] Dubbo service server started!1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
同样的方式修改consumer工程的 dubbo 配置,然后我们启动consumer的main.
不过在此之前,我们是调用的本地服务,指明了服务的URL,这里我们要把这个指定去掉,通过注册中心找到服务。
所以修改 service 引用如下:
<dubbo:reference id="demoService" interface="com.alibaba.dubbo.demo.DemoService" />1
2
启动DemoConsumer.main
[14/09/16 12:57:03:003 CST] main INFO zookeeper.ZookeeperRegistry: [DUBBO] Notify urls for subscribe url provider://10.0.1.46:20880/com.alibaba.dubbo.demo.DemoService?anyhost=true&application=demo-provider&category=configurators&check=false&dubbo=2.5.3&interface=com.alibaba.dubbo.demo.DemoService&loadbalance=roundrobin&methods=sayHello&owner=william&pid=11433&side=provider×tamp=1473829023222, urls: [empty://10.0.1.46:20880/com.alibaba.dubbo.demo.DemoService?anyhost=true&application=demo-provider&category=configurators&check=false&dubbo=2.5.3&interface=com.alibaba.dubbo.demo.DemoService&loadbalance=roundrobin&methods=sayHello&owner=william&pid=11433&side=provider×tamp=1473829023222], dubbo version: 2.5.3, current host: 127.0.0.1 [14/09/16 12:57:03:003 CST] main INFO container.Main: [DUBBO] Dubbo SpringContainer started!, dubbo version: 2.5.3, current host: 127.0.0.1 [2016-09-14 12:57:03] Dubbo service server started! [12:57:10] Hello world0, request from consumer: /10.0.1.46:560781
2
3
4
其实,如果对zookeeper的原理少有了解的话,可以进入 zkclient查看当前节点.
ls /dubbo/*.DemoService/providers [dubbo%3A%2F%2F10.0.1.46%3A20880%2Fcom.alibaba.dubbo.demo.DemoService%3Fanyhost%3Dtrue%26application%3Ddemo-provider%26dubbo%3D2.5.3%26interface%3Dcom.alibaba.dubbo.demo.DemoService%26loadbalance%3Droundrobin%26methods%3DsayHello%26owner%3Dwilliam%26pid%3D11433%26side%3Dprovider%26timestamp%3D1473829023222]1
2
其实服务的Provider定义,就是在zookeeper节点的数据上。
3. 配置监控中心
当服务的提供者有很多,而消费者也有很多的时候,管理这些服务会十分棘手,所以官方提供了一个Monitor项目,通过配置,启动后,可以在浏览器中,查看服务提供者和消费者的所有状态。
可以使用 mvn 在 dubbo 根目录方式执行 install 的方式生产 dubbo-monitor-simple. 然后解压。
cd ./dubbo-monitor-simple-2.5.3/conf edit dubbo.properties dubbo.registry.address=zookeeper://127.0.0.1:2181 dubbo.jetty.port=8088 //配置访问端口 ../bin/start.sh1
2
3
4
5
6
7
启动后,可以通过 127.0.0.1:8088 直接访问监控中心。
里面也可以查询所有服务调用的状态,并且提供图表的方式
到这里,dubbo-demo 的代码框架就搭建完成了。运行程序可以使用官方打包的方式,在部署的时候更为方便。
接下来,在后续的文章里,笔者会通过阅读源代码的方式,分析dubbo核心的实现原理。
相关文章推荐
- 深入理解Java SOA 架构Dubbo系列—— 第二回 搭建dubbo-demo环境
- 深入理解Java SOA 架构Dubbo系列—— 第一回 结缘
- 深入理解Java SOA 架构Dubbo系列—— 第一回 结缘
- 深入理解java虚拟机之一window下编译OpenJDK环境搭建
- 深入理解索引系列1:环境搭建
- Dubbo系列-2.环境搭建和入门Demo
- 深入理解Tomcat系列之二:源码调试环境搭建(转)
- 深入理解Tomcat系列之二:源码调试环境搭建
- 【Java学习系列】第1课--Java环境搭建和demo运行
- 深入理解Tomcat系列之一:系统架构(转)
- 深入理解java虚拟机系列(一):java内存区域与内存溢出异常
- 【小白的java成长系列】——windows下搭建和配置java环境
- Mysql数据库环境搭建及Java访问简单demo
- 深入理解Tomcat系列之一:系统架构
- 深入理解javascript原型和闭包系列 系深入理解javascript原型和闭包(17)——补充:上下文环境和作用域的关系
- java2---java环境---jdk,jre(2):深入理解JDK、JRE
- RHEL环境搭建--Nginx|Tomcat|Java|Dubbo|RabbitMQ|Redis|Nexus|MySQL
- 黑马程序员——Java大概理解、环境搭建和个人心得
- Selenium 2 系列学习一: JAVA环境搭建(IDEA)
- 深入理解java虚拟机系列(一):java内存区域与内存溢出异常