目录
一、什么是Dubbo?
二、SpringBoot整合Dubbo
1、父工程引入依赖
2、各个Dubbo服务子模块引入依赖
3、服务提供者
(1)启动类添加注解@EnableDubbo
(2)服务类添加注解@DubboService
(3)配置文件配置dubbo的信息
4、服务的消费者
(1)启动类添加注解@EnableDubbo
(2)接口层通过注解@DubboReference将远程服务注入
(3)配置文件配置dubbo的信息
Spring Boot是一款用于简化Java应用程序开发的框架,它提供了快速构建、易于配置和扩展的特性。Dubbo是一个高性能、轻量级的开源RPC框架,它支持多种传输协议和序列化方式,并可以实现服务之间的远程调用。本文将介绍如何使用Spring Boot整合Dubbo,快速搭建一个简单的分布式应用。
一、什么是Dubbo?
Apache Dubbo是一款RPC服务开发框架,用于解决微服务架构下的服务治理与通信问题,官方提供了 Java、Golang等多语言SDK实现。使用Dubbo开发的微服务原生具备相互之间的远程地址发现与通信能力, 利用Dubbo提供的丰富服务治理特性,可以实现诸如服务发现、负载均衡、流量调度等服务治理诉求。Dubbo被设计为高度可扩展,用户可以方便的实现流量拦截、选址的各种定制逻辑。
在云原生时代,Dubbo 相继衍生出了 Dubbo3、Proxyless Mesh 等架构与解决方案,在易用性、超大规模微服务实践、云原生基础设施适配、安全性等几大方向上进行了全面升级。
二、SpringBoot整合Dubbo
1、父工程引入依赖
<!-- Dubbo -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-bom</artifactId>
<version>${dubbo.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency><dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-dependencies-zookeeper-curator5</artifactId>
<version>${dubbo.version}</version>
<type>pom</type>
</dependency>
2、各个Dubbo服务子模块引入依赖
<!-- dubbo -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>3.0.9</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-dependencies-zookeeper-curator5</artifactId>
<type>pom</type>
<exclusions>
<exclusion>
<artifactId>slf4j-reload4j</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
<version>3.0.9</version>
</dependency>
3、服务提供者
(1)启动类添加注解@EnableDubbo
@EnableDubbo是Dubbo框架中的一个重要注解,主要用于激活Dubbo的自动配置和启动类上,开启Dubbo的支持。
@SpringBootApplication
@EnableDubbo
public class ProviderApp {
public static void main(String[] args) {
SpringApplication.run(ProviderApp.class, args);
System.out.println("Hello World!");
}
}
(2)服务类添加注解@DubboService
@DubboService是Dubbo框架中用于服务提供方的一个重要注解。它的主要作用是将服务接口的实现类注册到注册中心,使其能够被服务消费方发现和调用。@DubboService支持设置当前服务的版本号、重试次数、超时时间、负载均衡策略等信息。如下,就是设置了该服务的版本为1.0.0,负载均衡策略为轮询,重试次数为3,
服务调用的超时时间为3000毫秒。Dubbo的负载均衡除了内置了轮询策略之外,还内置了如下一些常用的负载均衡策略:
- 加权随机(random)
默认算法,默认权重相同。所以,在权重相同的情况下,会在在服务提供者中随机选择一个来处理请求。该策略的优点是实现简单,能够较好地平均分配请求。缺点是在服务提供者数量较多时,可能无法保证每个提供者分配到的请求量完全均匀。
- 最少活跃优先 + 加权随机(leastactive)
活跃数是指每个服务提供者都有一个“活跃数”,表示当前正在处理的请求数量。当一个请求到达时,活跃数加一,请求处理完毕时,活跃数减一。最少活跃优先便是指在分配新请求时,优先选择活跃数最小的服务提供者。这样,性能较好的服务提供者(处理速度快,活跃数下降快)可以处理更多请求,而性能较差的提供者则自然接收较少请求。而当在选出活跃数最少的提供者后,如果存在多个活跃数相同的提供者,则根据它们的权重进行随机选择。权重越大,被选中的概率就越高。该策略的核心思想其实就是能者多劳的思想。该策略的优点是能够有效避免将请求发送到负载较高或响应较慢的服务提供者上。缺点是需要实时监控每个提供者的活跃请求数,增加了一定的系统开销。
- 最短响应优先 + 加权随机(shortestresponse)
该策略从多个服务提供者中选择出响应时间最短的一个或多个来处理请求。当存在多个响应时间相同的服务提供者时,根据它们的权重进行加权随机选择。该策略的优点是能够灵活地应对服务提供者的性能变化,并优化请求处理速度。缺点是实现较为复杂,需要实时监控服务提供者的响应时间和计算权重。
- 一致性哈希(consistenthash)
根据某个一致性哈希算法,确定请求应该发送到哪个服务提供者。该策略的优点是能够在服务提供者动态变更时,最大限度地减少对已分配请求的影响。缺点是算法较为复杂,实现和维护成本较高。
@DubboService(version = "1.0.0", loadbalance = "roundrobin", retries = 3, timeout = 3000)
public class TestDubboServiceImpl implements TestDubboService {
@Override
public String sayHello(String name) {
return "hello," + name;
}
@Override
public ZhuoYe getZuoYe() {
ZhuoYe zuoYe = new ZhuoYe();
zuoYe.setName("zhuoye-1")
.setDescription("帅呆了!!!");
return zuoYe;
}
}
(3)配置文件配置dubbo的信息
dubbo:
application:
name: dubbo-springboot-demo-provider #当前应用名称
protocol:
name: dubbo #协议名称
port: -1 #配置为-1,则会分配一个没有被占用的端口
registry:
address: zookeeper://192.168.190.129:2181 #注册中心地址,这里选择zookeeper作为注册中心,也是官方推荐的
timeout: 10000 #连接到注册中心的超时时间10S,时间太多可能很容易注册失败,默认5s
更多的配置可以参考官方文档 。
4、服务的消费者
(1)启动类添加注解@EnableDubbo
@SpringBootApplication
@EnableDubbo
public class ProviderApp {
public static void main(String[] args) {
SpringApplication.run(ProviderApp.class, args);
System.out.println("Hello World!");
}
}
(2)接口层通过注解@DubboReference将远程服务注入
@DubboReference
是 Dubbo 提供的一个用于引用远程服务的注解,它通常用在服务消费者的实现类中,用于标记一个远程服务的引用。这个注解会将指定的远程服务连接到本地的某个接口上,使得你可以像调用本地接口一样调用远程服务。@DubboReferencee也支持设置当前服务的版本号、重试次数、超时时间、负载均衡策略等信息。而且@DubboReference
注解中设置的属性会覆盖 @DubboService
注解中的相应属性。也就是说当我们在@DubboReference
和@DubboService
中都设置了相同的属性,那么@DubboReference
中的属性值将优先生效。通过覆盖属性,可以根据不同的场景或需求灵活地调整服务引用的配置。例如,在开发环境中可能需要较短的超时时间以快速检测问题,而在生产环境中可能需要更长的超时时间以确保稳定性。
@RestController
@RequestMapping("dubbo")
public class TestDubboController {
@DubboReference(version = "1.0.0",timeout = 1000,loadbalance="leastactive",retries = 2)
private TestDubboService testDubboService;
@GetMapping("hello")
public String hello(String name) {
return testDubboService.sayHello(name);
}
@GetMapping("getZhuoye")
public ZhuoYe getZhuoye() {
return testDubboService.getZuoYe();
}
}
(3)配置文件配置dubbo的信息
dubbo:
application:
name: dubbo-springboot-demo-comsumer
protocol:
name: dubbo
port: -1
registry:
address: zookeeper://192.168.190.129:2181
timeout: 10000