对dubbo的一些理解和简单使用记录

图片和内容总结来自:Dubbo 介绍 | Apache Dubbo

简单介绍

Dubbo是一款高性能、轻量级的Java RPC框架。它可以用于构建分布式服务架构,简化不同服务之间的远程调用过程。Dubbo支持多种协议和序列化方式,可以轻松地与Spring Boot进行集成。Dubbo提供了服务治理、负载均衡、容错、路由、降级等丰富的特性,可以帮助我们构建健壮的分布式系统。

在使用Dubbo时,我们可以将服务提供者注册到注册中心,消费者通过注册中心查找到服务提供者的地址,然后进行远程调用。Dubbo提供了多种负载均衡策略,例如随机、轮询、一致性哈希等,可以根据实际场景进行选择。此外,Dubbo还支持容错机制,例如超时、失败重试、熔断等,可以提高系统的可靠性和稳定性。

工作原理

service-discovery

服务发现包含提供者、消费者和注册中心三个参与角色,其中,Dubbo 提供者实例注册 URL 地址到注册中心,注册中心负责对数据进行聚合,Dubbo 消费者从注册中心读取地址列表并订阅变更,每当地址列表发生变化,注册中心将最新的列表通知到所有订阅的消费者实例。

Dubbo 使用 JDK 动态代理或者字节码增强技术,生成一个代理类,该代理类实现了本地接口,具有本地接口的所有方法。在调用本地接口方法时,会通过代理类的 invoke 方法将请求转发到远程服务提供者上,服务提供方接收到请求后,会根据请求中的服务接口名和方法名,找到对应的实现类和方法,并将请求消息反序列化成参数列表,最终调用服务实现类的方法,并将执行结果序列化成响应消息返回给客户端。

简单使用

  • 引入依赖

    配置Dubbo相关依赖:在pom.xml文件中添加Dubbo相关依赖,例如dubbo-spring-boot-starterdubbo等。

    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
    12
    public 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.propertiesapplication.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.propertiesapplication.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等等,过于复杂。


对dubbo的一些理解和简单使用记录
https://cason.work/2023/04/06/对dubbo的一些理解和简单使用记录/
作者
Cason Mo
发布于
2023年4月6日
许可协议