代码地址:
spirngboot_dubbo_base:https://github.com/kevindai007/springboot_dubbo_base
spirngboot_dubbo_server:https://github.com/kevindai007/springboot_dubbo_Server
spirngboot_dubbo_consumer:https://github.com/kevindai007/springboot_dubbo_Consumer
前段时间在springboot中继承了dubbo、zookeeper,期间遇到了不少坑,下面一起来看看怎么集成,怎么避免坑
- 首先简单介绍一下dubbo,dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案;zookeeper是dubbo推荐的注册中心(这两个在此不做展开讲解,有兴趣的朋友可以自己了解一下)
- 安装zookeeper:从官网上下载zookeeper的安装包:http://mirror.bit.edu.cn/apache/zookeeper/;下载后放到Linux服务器上,然后进入conf文件夹,复制zoo_sample.cfg文件命名为zoo.cfg,然后到bin文件夹输入命令zkServer.sh start启动zookeeper,如图
新建dubbo_base工程(dubbo_base工程主要是为了给dubbo_consumer、dubbo_seerver提供依赖),免得写重复代码;新建一个工程,如下图
工程很简单,只定义了一个MsgService的接口,然后把工程打成jar包以提供给其他工程依赖注意这里可能会产生第一个坑:自己的工程打成的jar包如何被其他maven工程依赖?
拿我这个工程举例,当我打好jar包之后,找到maven仓库地址
然后在maven仓库中,按照工程的groupId、artifactId、version新建路径存放jar包,如下图
新建springboot_dubbo_server工程,工程结构如下
其中DubboServerApplication.java为springboot的启动类,MsgServiceImpl为服务的实现类,application.properties为springboot的配置文件,dubbo-server.xml为dubbo的配置文件
dubbo-server.xml如下(这里列出主要配置,详细的见github工程):<!-- 提供方应用名称信息,这个相当于起一个名字,可以从dubbo管理页面比较清晰看出是哪个应用暴露出来的 --> <dubbo:application name="dubboServer"></dubbo:application> <dubbo:annotation package="com.kevindai.*" /> <!-- 使用zookeeper注册中心暴露服务地址 --> <dubbo:registry address="zookeeper://192.168.17.107:2181" check="false" subscribe="false" register=""></dubbo:registry> <!-- 要暴露的服务接口 --> <dubbo:service interface="com.kevindai.service.MsgService" ref="msgService" />
pom文件在此不列出,可参考github上的内容
这里又会有几个坑:- dubbo与springboot的spring冲突,因此需要移除dubbo中的spring引用,代码如下
<dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.5.3</version> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring</artifactId> </exclusion> </exclusions> </dependency>
- zookeeper与springboot的日志文件冲突,需要移除zookeeper的日志引用
<dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.6</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> <exclusion> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </exclusion> </exclusions> </dependency>
- zk客户端依赖问题
<!-- zk客户端,不加的话启动会报 java.lang.NoClassDefFoundError: org/I0Itec/zkclient/exception/ZkNoNodeException --> <!--一开始我依赖的是这个包,但启动时总是报错,后来发现是包的问题,换了依赖包之后一切正常 --> <!--<dependency>--> <!--<groupId>com.101tec</groupId>--> <!--<artifactId>zkclient</artifactId>--> <!--<version>0.10</version>--> <!--</dependency>--> <dependency> <groupId>com.github.sgroschupf</groupId> <artifactId>zkclient</artifactId> <version>0.1</version> </dependency>
新建springboot_dubbo_consumer工程
dubbo-consumer.xml主要配置如下
<dubbo:annotation package="com.kevindai.*" /> <dubbo:application name="dubboConsumer"></dubbo:application> <!-- 使用zookeeper注册中心暴露服务地址 --> <dubbo:registry address="zookeeper://192.168.17.107:2181" check="false"></dubbo:registry> <!-- 要引用的服务 --> <dubbo:reference interface="com.kevindai.service.MsgService" id="msgService"></dubbo:reference>
在使用时,直接使用即可(能够使用MsgService是因为依赖了springboot_dubbo_base,能够注入成功则要感谢dubbo),
到这里已经完成了,网上搜了搜好像还没有这么通俗详细的文章,自己也踩了不少坑,特此记录下来,希望能帮助各位同学