对dubbo的一些理解和简单使用记录
图片和内容总结来自:Dubbo 介绍 | Apache Dubbo
简单介绍
Dubbo是一款高性能、轻量级的Java RPC框架。它可以用于构建分布式服务架构,简化不同服务之间的远程调用过程。Dubbo支持多种协议和序列化方式,可以轻松地与Spring Boot进行集成。Dubbo提供了服务治理、负载均衡、容错、路由、降级等丰富的特性,可以帮助我们构建健壮的分布式系统。
在使用Dubbo时,我们可以将服务提供者注册到注册中心,消费者通过注册中心查找到服务提供者的地址,然后进行远程调用。Dubbo提供了多种负载均衡策略,例如随机、轮询、一致性哈希等,可以根据实际场景进行选择。此外,Dubbo还支持容错机制,例如超时、失败重试、熔断等,可以提高系统的可靠性和稳定性。
工作原理
服务发现包含提供者、消费者和注册中心三个参与角色,其中,Dubbo 提供者实例注册 URL 地址到注册中心,注册中心负责对数据进行聚合,Dubbo 消费者从注册中心读取地址列表并订阅变更,每当地址列表发生变化,注册中心将最新的列表通知到所有订阅的消费者实例。
Dubbo 使用 JDK 动态代理或者字节码增强技术,生成一个代理类,该代理类实现了本地接口,具有本地接口的所有方法。在调用本地接口方法时,会通过代理类的 invoke 方法将请求转发到远程服务提供者上,服务提供方接收到请求后,会根据请求中的服务接口名和方法名,找到对应的实现类和方法,并将请求消息反序列化成参数列表,最终调用服务实现类的方法,并将执行结果序列化成响应消息返回给客户端。
简单使用
引入依赖
配置Dubbo相关依赖:在
pom.xml
文件中添加Dubbo相关依赖,例如dubbo-spring-boot-starter
、dubbo
等。1
2
3
4
5
6
7
8
9
10<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>${dubbo.version}</version>
</dependency>服务提供者
1
2
3
4
5
6
7
8
9
10
11
12public interface ProvideService {
String test(String text);
}
//实现Dubbo服务接口:编写Dubbo服务接口的实现类
@DubboService
public class ProvideServiceImpl implements ProvideService {
public String test(String text) {
System.out.println(text);
return text;
}
}在
application.properties
或application.yml
中配置Dubbo服务提供者信息和注册中心地址和协议1
2
3
4
5
6
7# Dubbo服务提供者配置
dubbo.application.name=dubbo-provide
dubbo.registry.protocol=zookeeper
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
# Dubbo注册中心配置
dubbo.registry.address=zookeeper://127.0.0.1:2181打成jar包发不到maven仓库并启动服务
服务消费者
引入包含ProvideService服务的依赖
1
2
3
4
5
6
7
8
9@Component
public class ConsumerService {
@DubboReference
private ProvideService provideService;
public String test(String text) {
return provideService.test(text)
}
}在
application.properties
或application.yml
中配置Dubbo注册中心地址和协议1
2
3# Dubbo注册中心配置
dubbo.registry.protocol=zookeeper
dubbo.registry.address=zookeeper://127.0.0.1:2181
一些问题
为什么使用rpc框架,而不是用http?
在异构系统(跨语言和跨平台),HTTP具有更好的兼容性,因为HTTP是一种通用的协议,几乎所有的编程语言和操作系统都支持HTTP协议,因为Dubbo支持更严格的通信协议和类型约束,而不是所有的编程语言和操作系统都支持相同的RPC协议。
RPC适合用在企业内部,要求使用同一套注册中心进行服务治理,如果是跨组织,或者跨公司,这种情况只能用更加通用的HTTP进行通信。
Dubbo在并发连接数较高时表现更好,因为Dubbo使用长连接和TCP协议,而HTTP协议每次请求都要建立连接,在每次连接的过程中需要额外的时间开销和数据传输量。但是,在低并发量和小数据量的情况下,HTTP的开销相对较小。
rpc具有以下优点:
性能好:RPC在传输效率上通常比HTTP更高,此外,RPC可以使用更紧凑的数据格式,如Protocol Buffers和Thrift,可以更有效地利用网络带宽和存储空间。
安全性:目前,Dubbo等RPC框架主要应用在企业内部之间的系统调用,而内部系统之间调用的话安全性就更有保障一些。
调用简单:RCP可以帮我们像调用本地方法一样调用远程代码,而HTTP调用需要拼接Body、Header等等,过于复杂。