最近dubbo项目重新维护,让人忍不住想了解一下。
本文参考dubbo官方实例实现了一个简单的demo。使用Spring配置文件,zookeeper作为注册器。
1. 项目结构
hello-dubbo-api
: 公共api接口,provider暴露此接口,consumer调用此接口hello-dubbo-provider
: 实现api中的接口,对外提供服务hello-dubbo-consumer
: 调用api中的接口
2.父pom依赖管理
首先在父pom中引入dependencyManagement和公共依赖:
|
|
3. dubbo-api
新建子模块,作为api,不需要特别的pom依赖引入,只是定义一个简单的接口:
4. dubbo-provider
新建子模块,作为服务提供者。
首先引入api,dubbo和zookeeper依赖,注意解决日志冲突:
其中dubbo的依赖中包含了相关的Spring依赖,如果项目本身使用Spring容器,推荐单独指定Spring依赖。
provider需要实现api接口,对外提供服务:
接下来是dubbo相关的Spring配置文件:
dubbo默认使用log4j作为日志输出,此处我们想使用slf4j代替,需要在dubbo.properties
中指定日志类型:
然后添加logback.xml:
最后是一个启动类:
5. dubbo-consumer
新建子模块,作为api接口调用者。同样导入dubbo-provider中的pom依赖,dubbo.properties和logback.xml。
然后是dubbo相关的Spring配置文件:
最后是启动类,像使用本地service服务一样,调用api接口:
6. 测试
我们首先启动一台provider和一台consumer,可以看到两者正常调用。
这时,我们更换provider的端口到20881再启动一台provider,可以看到,consumer收到一个notify,zookeeper中注册的地址多了,部分请求被分发到新的节点。
然后我们再启动两台consumer,模拟多个调用者,可以看到请求被分发到两个provider上。
负载均衡的策略还没有研究。
本项目使用zookeeper作为注册中心,此时zookeeper注册节点情况如下(图中使用的工具是ZooInspector.jar):
当增删节点时,都会有notify通知,提供服务发现。
完整的项目代码在github上:hello-dubbo