Dubbo 学习笔记

发布于:2025-07-15 ⋅ 阅读:(16) ⋅ 点赞:(0)

一、什么是 Dubbo?

Dubbo 是阿里开源的分布式 RPC 服务框架,支持高性能远程调用、自动注册与发现、负载均衡、故障容错等功能。

Dubbo 的核心解决问题:

  • 服务治理
  • 服务注册与发现
  • 高性能远程调用(基于 Netty)
  • 可插拔的协议和序列化方式
  • 健康检查、负载均衡、限流、降级等

二、Dubbo 架构组成

+---------+        +--------------+        +----------+
| Consumer| <----> | Registry(如ZK)| <--> | Provider |
+---------+        +--------------+        +----------+
    │                   │                       │
    │ <--- 获取服务 ---- │ <---- 注册服务 ------- │
    │ --- 远程调用 ----> │                       │

Dubbo 主要角色说明:

组件 描述
Provider 提供服务的生产者
Consumer 消费服务的调用者
Registry 服务注册中心(如 ZooKeeper)
Monitor 监控服务调用情况(可选)
Container Dubbo 服务启动容器

三、快速入门:使用 Dubbo + SpringBoot

1. 引入依赖

<!-- dubbo -->
<dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo-spring-boot-starter</artifactId>
    <version>3.2.0</version>
</dependency>

<!-- zk 注册中心 -->
<dependency>
    <groupId>org.apache.curator</groupId>
    <artifactId>curator-recipes</artifactId>
    <version>5.4.0</version>
</dependency>

2. 定义公共接口模块(api)

public interface UserService {
    String getUsername(Long id);
}

3. 服务提供者

@DubboService
public class UserServiceImpl implements UserService {
    public String getUsername(Long id) {
        return "User_" + id;
    }
}

4. 服务消费者

@DubboReference
private UserService userService;

public void test() {
    System.out.println(userService.getUsername(123L));
}

5. application.yml 配置

dubbo:
  application:
    name: user-service
  registry:
    address: zookeeper://127.0.0.1:2181
  protocol:
    name: dubbo
    port: 20880

四、Dubbo 核心原理简析

4.1 服务注册与发现

  • 启动时,Provider 向 Registry 注册服务
  • Consumer 启动后,从注册中心拉取 Provider 地址
  • 调用时通过 Netty 连接远程 Provider 执行方法

4.2 通信协议(Dubbo 协议)

  • 默认使用 Dubbo 协议(TCP + 自定义二进制协议)
  • 可选:rest、http、rmi、hessian、webservice

4.3 序列化方式

  • 默认:Hessian2
  • 推荐:FastJson、Kryo、FST、Protobuf(性能更高)

五、Dubbo 调用流程详解

Consumer 调用 -> 代理类 -> Cluster -> LoadBalance -> Invoker -> Netty 客户端 -> Provider 端 NettyServer -> 反射执行服务方法 -> 返回结果
  • Proxy:生成接口的代理类(JDK 动态代理)
  • Cluster:聚合多个 Invoker,容错逻辑在这
  • Invoker:具体的远程调用执行者
  • Protocol:协议封装 + 解封装
  • NettyClient/Server:底层通信框架

六、Dubbo SPI(插件扩展机制)

Dubbo 全部基于 SPI 架构设计,允许你动态扩展协议、序列化、负载均衡等。

6.1 如何自定义 SPI 扩展?

  1. 定义接口

  2. 创建实现类

  3. META-INF/dubbo 中注册:

    com.example.MyInterface=impl1,impl2
    
  4. 使用 @SPI@Adaptive 注解实现自动注入


七、Dubbo 负载均衡策略

策略名称 描述
Random(默认) 随机选择一个服务,权重可调
RoundRobin 轮询策略
LeastActive 最少活跃调用数优先
ConsistentHash 一致性哈希,同一参数落到同一提供者上

配置方式:

dubbo:
  consumer:
    loadbalance: roundrobin

八、Dubbo 集群容错策略

策略 描述
Failover 默认,失败自动重试(适合读操作)
Failfast 失败立即报错(适合写操作)
Failsafe 忽略异常(适合日志等不敏感操作)
Failback 失败后记录,后台重试
Forking 并行调用多个,只取第一个返回的结果
Broadcast 广播调用所有服务(适合通知类服务)

配置方式:

dubbo:
  consumer:
    cluster: failfast

九、服务治理功能

  • 服务降级:配置熔断策略
  • 服务限流:防止雪崩
  • 服务灰度发布:灰度路由机制
  • 注册中心同步状态监控:可视化管理界面(Dubbo Admin)
  • 服务动态配置:支持动态规则(Tag、Routing、Mock)

十、Dubbo 常见问题

问题 解决方案
服务调用报错 no provider Provider 没有注册,或端口没开放,检查 zk 与服务
服务引用失败 @DubboReference 写法、Spring 扫描路径问题
调用慢 网络、注册中心堵塞、Provider 内部处理慢
多注册中心 支持配置多个 registry.address

参考资源


网站公告

今日签到

点亮在社区的每一天
去签到