【手把手系列】 springboot集成dubbo
本教程用于springboot与dubbo的集成,阅读前请确保你已熟悉相关理论知识,并对java基础知识、环境搭建有一定的了解。本教程不再叙述如何安装JDK、配置环境变量、软件安装及启动等过程。欢迎评论及拍砖。
需准备的环境:(windows系统)
- JDK 1.8.0_131
- Apache-maven 3.3.9
- Apache-zookeeper 3.4.13
- Apache-tomcat 7.0.57
- IntelliJ IDEA
通过spring初始化工具,新建spring-boot项目,创建3个模块,分别命名为:
- producer(生产者模块)
- consumer(消费者模块)
- api(公用接口封装模块)
项目结构图如下:
图1 - 项目结构示意图主POM文件
POM引入包如下,我这里放在了主POM中,只需引入web模块、test模块、dubbo和zookeeper(如果不用ZK注册中心,可以不用引入):
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- dubbo依赖 -->
<dependency>
<groupId>com.alibaba.spring.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.3.3</version>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
</dependencies>
api模块
定义接口ITestService
,定义方法say,代码如下:
public interface ITestService {
String say(String username);
}
producer模块
application.yml
中定义端口server.port=8101(改成yml的书写格式)
在resources下创建dubbo.properties
文件,内容如下:
dubbo.container=logback,spring
dubbo.application.logger=slf4j
dubbo.application.name=dubbo-producer
dubbo.application.owner=dev
dubbo.registry.address=zookeeper://localhost:2181
dubbo.provider.retries=0
dubbo.provider.timeout=10000
dubbo.consumer.check=false
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
dubbo.service.shutdown.wait=30000
dubbo.protocol.host=
dubbo.protocol.accesslog=${accesslog}
在resources下创建config/dubbo-provider.xml
文件,内容如下:
<dubbo:application name="${dubbo.application.name}"/>
<!--公共配置在dubbo.properties-->
<dubbo:provider timeout="5000" delay="-1" loadbalance="leastactive" retries="0"
cluster="failfast" threadpool="fixed" threads="400"/>
<!-- 对外提供的服务 -->
<dubbo:service interface="com.hifun.dubbo.service.ITestService" ref="testService" version="1.0.0"/>
定义接口实现类TestServiceImpl
实现ITestService
,代码如下:
@Service("testService")
public class TestServiceImpl implements ITestService {
@Override
public String say(String username) {
return "hello " + username;
}
}
定义Application启动类DubboProducerApplication
,代码如下:
@SpringBootApplication
@PropertySource("classpath:dubbo.properties")
@ImportResource("classpath:config/*.xml")
public class DubboProducerApplication {
public static void main(String[] args) {
SpringApplication.run(DubboProducerApplication.class, args);
}
}
启动生产者,确认启动成功。
consumer模块
application.yml
中定义端口server.port=8102(改成yml的书写格式)
在resources下创建dubbo.properties
文件,内容与producer模块一致即可。
在resources下创建config/dubbo-consumer.xml
文件,内容如下:
<!-- 消费方应用信息,用于计算依赖关系 -->
<dubbo:application name="${dubbo.application.name}"/>
<dubbo:registry address="${dubbo.registry.address}" />
<dubbo:reference interface="com.hifun.dubbo.service.ITestService"
id="testService" retries="0" timeout="6000" version="1.0.0"/>
定义对外服务接口类TestController
,用于提供外部接口服务,代码如下:
@RestController
public class TestController {
@Autowired
private ITestService testService;
@RequestMapping(value = "/hello/{username}")
public String hello(@PathVariable String username) {
System.out.println("testService--->" + (testService instanceof ITestService));
return testService.say(username);
}
}
定义Application启动类DubboConsumerApplication
,代码如下:
@SpringBootApplication
@PropertySource("classpath:dubbo.properties")
@ImportResource("classpath:config/*.xml")
public class DubboClientApplication {
public static void main(String[] args) {
SpringApplication.run(DubboClientApplication.class, args);
}
}
启动消费者,确认启动成功。
浏览器访问地址http://localhost:8102/hello/123, 打印出”hello 123”则表示访问正常。
admin模块
服务治理管理端,dubbo-2.6.1版本之后不再有dubbo-admin,因此需要在之前的版本打包安装,我用的是2.5.4版本。GITHUB地址:dubbo-2.5.4源码。下载后打成war包(mvn package),将dubbo-admin-2.5.4-SNAPSHOT.war放到tomcat的webapps目录下,启动tomcat。
浏览器访问dubbo-admin,输入账号密码root,出现如下界面,表示本地启动成功。
图2 - dubbo-admin注意事项
- 生产者和消费者启动成功,但在浏览器访问controller外放的接口时,出现如下报错:
com.alibaba.dubbo.rpc.RpcException: No provider available from registry localhost:2181 for service com.hifun.dubbo.service.ITestService on consumer xxx.xxx.xxx.xxx use dubbo version 2.6.0, may be providers disabled or not registered ?
原因: producer通过<dubbo:service/>
配置提供dubbo服务,consumer通过<dubbo:reference/>
配置指向dubbo服务接口。若配置version属性,则需保持配置一致;否则均不做配置。 - 生产者和消费者之间互通的接口应放置在独立模块,便于两个模块引入和调用。
- 参照网上其他的教程,生产者可以不是web项目,只需Application保持启动状态即可。
- 其他问题遇到后再追加。
如果有哪里写的不对或者可以改进的地方,欢迎留言探讨。如果需要转载,请帮忙评论并附上原文地址https://www.jianshu.com/p/ce77f6038b8b。万分感激。