Springboot与Dubbo整合
基于 dubbo-spring-boot-starter整合方式
定义接口
public interface DemoService {
String sayHello(String name);
}
添加maven依赖
<dependencies>
<dependency>
<!--common存放公共的接口类和实体的模块-->
<artifactId>common</artifactId>
<groupId>com.heron</groupId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--监控包,引入主体依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--处理properties ,xml配置文件的时候使用-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
<!-- Dubbo Spring Boot Starter -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.6</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
</dependency>
<!--Curator是Netflix公司开源的一套Zookeeper客户端框架-->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>2.13.0</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.5.5</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
服务提供者
@Service(version = "1.0.0") //dubbo的注解
public class DefaultDemoServiceImpl implements DemoService {
@Value("${dubbo.application.name}")
private String serviceName;
public String sayHello(String name) {
System.out.println("收到请求···");
return String.format("[%s] : Hello, %s", serviceName, name);
}
}
@EnableAutoConfiguration
public class ProviderServiceApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderServiceApplication.class,args);
}
}
provider配置
spring:
application:
name: dubbo-provider-demo #应用名 ,也是dubbo.application.name默认的值
dubbo:
scan:
base-packages: com.heron.impl #dubbo扫描的@Service注解作为服务组件的基础包
protocol:
name: dubbo #通讯使用的协议
port: 12321 #配置 -1 就是随机端口
registry:
address: zookeeper://127.0.0.1:2181 #注册中心地址
消费者
@RestController
@EnableAutoConfiguration
public class ConsumerApplication {
private final Logger logger = LoggerFactory.getLogger(getClass());
@Reference(version = "${consumer.service.version}", url = "${consumer.service.url}")
private DemoService demoService;
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class);
}
@GetMapping("/hello")
public String runner() {
logger.info(demoService.sayHello("mercyblitz"));
return "comsumer info ";
}
}
消费者配置
spring:
application:
name: dubbo-consumer-sample
dubbo:
registry:
address: zookeeper://127.0.0.1:2181
check: true
consumer:
methods:
- name:
consumer:
service:
version: 1.0.0
server:
port: 8090
这种方式使用@Reference 注入调用服务,@Service暴露服务 @EnableAutoConfiguration 启动启动服务
分别启动 zookeeper ,provider ,comsumer ,访问http://localhost:8080/hello即可。
整合优缺点
优点: 使用starter整合的方式简单方便,只需要很少的配置即可。
缺点:无法控制到方法这一粒度层次,例如以下例子,就没有对应的method注解
<dubbo:service interface="com.heron.DemoService" ....">
<dubbo:method name="sayHello" timeout="1000"></dubbo:method>
</dubbo:service>
还有像多注册中心等。另外dubbo官方文档的配置参数都是基于xml的配置,没有关于注解使用的介绍,对应使用者来说相对不够便利。
SpringBoot中使用xml配置 — 推荐
- 配置
依赖与上面保持一致,但是去掉dubbo-spring-boot-starter的依赖,引入xml文件来定义注册中心和暴露服务,不再使用注解。
以provider为例,引入 provider.xml 文件,配置如下
<?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://dubbo.apache.org/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
<!-- 提供方应用信息,用于计算依赖关系 -->
<dubbo:application name="dubbo-provider-demo" />
<!-- 使用multicast广播注册中心暴露服务地址 -->
<dubbo:registry address="zookeeper://127.0.0.1:2181" />
<!-- 用dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="dubbo" port="12321" />
<!-- 声明需要暴露的服务接口 -->
<dubbo:service interface="com.heron.service.DemoService" ref="demoService" />
<!-- 和本地bean一样实现服务 -->
<bean id="demoService" class="com.heron.impl.DefaultDemoServiceImpl" />
<!-- 包扫描的形式,配合注解暴露服务-->
<!--<dubbo:annotation package="com.heron" /> -->
</beans>
启动类:
@ImportResource(value = {"classpath:provider.xml"})
@SpringBootApplication
public class ProviderServiceApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderServiceApplication.class,args);
try {
System.in.read(); //阻塞main方法,防止退出
} catch (IOException e) {
e.printStackTrace();
}
}
}
其余的编写服务的方式,都一样。值得注意的是,如果没有引入springboot的web依赖,main方法启动完成后会自动退出,所以这里增加了 System.in.read()阻塞main方法,防止退出。 也可以引入springboot的web模块,这样有了tomcat容器就可以在容器中运行。