Dubbo

Apache Dubbo 是阿里巴巴开源的高性能 Java RPC 框架,提供服务注册发现、负载均衡、容错、流量治理等完整微服务能力,支持多协议(Dubbo、Triple/gRPC、REST)。

整体架构

┌──────────┐   1.注册       ┌──────────────┐
│ Provider │──────────────►│   Registry   │
│  (服务端) │               │(Nacos/Zk等)│
└──────────┘               └──────┬───────┘
     ▲                            │ 2.订阅/通知
     │ 4.invoke(RPC调用)         ▼
     │                     ┌──────────────┐
┌──────────┐   3.refer      │   Consumer   │
│ Monitor  │◄──────────────│  (调用方)   │
│(监控中心)│               └──────────────┘
└──────────┘
角色职责
Provider服务提供方,暴露接口
Consumer服务消费方,调用远程接口
Registry注册中心,维护服务地址列表
Monitor统计调用次数、响应时间

支持协议

协议说明适用场景
Dubbo默认,单一长连接,NIOJava 内部服务,高并发小包
Triple兼容 gRPC(HTTP/2 + Protobuf)跨语言、与 gRPC 互通
RESTHTTP/JSON对外暴露、前端调用

快速开始

定义接口(API 模块)

public interface OrderService {
    Order getOrder(Long orderId);
    List<Order> listByUser(Long userId);
}

Provider 端

<dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo-spring-boot-starter</artifactId>
    <version>3.x.x</version>
</dependency>
@DubboService(version = "1.0", group = "order")
public class OrderServiceImpl implements OrderService {
    @Override
    public Order getOrder(Long orderId) { ... }
}
dubbo:
  application:
    name: order-provider
  registry:
    address: nacos://127.0.0.1:8848
  protocol:
    name: dubbo
    port: 20880

Consumer 端

@Component
public class OrderClient {
    @DubboReference(version = "1.0", group = "order",
                    loadbalance = "roundrobin",
                    timeout = 3000, retries = 2)
    private OrderService orderService;
 
    public Order query(Long id) {
        return orderService.getOrder(id);
    }
}

负载均衡策略

策略说明配置值
随机(默认)按权重随机选择random
轮询按权重轮询roundrobin
最少活跃调用选最少并发的提供者leastactive
一致性 Hash相同参数打到同一节点consistenthash
P2C两次随机取最优p2c

容错机制

机制说明适用场景
Failover(默认)失败重试其他节点读操作
Failfast失败立即报错写操作(防重复)
Failsafe失败忽略,返回空日志、通知等非关键
Failback失败后台定时重试消息通知
Forking并行调用多节点,取最快响应实时性要求高
Broadcast广播所有节点缓存刷新
@DubboReference(cluster = "failfast", retries = 0)
private OrderService orderService;

服务治理

路由规则(条件路由)

# 将 gray=true 的请求路由到 tag=gray 的 Provider
conditions:
  - from:
      match: gray=true
    to:
      match: tag=gray

流量权重(灰度发布)

# 90% 流量到 v1,10% 到 v2
- match:
    attachments:
      traffic-split: v2
  route:
    - weight: 10
      match: version=2.0

Triple 协议(gRPC 兼容)

dubbo:
  protocol:
    name: tri     # 使用 Triple 协议
    port: 50051

Triple 基于 HTTP/2,可与标准 gRPC 客户端互操作,并支持流式调用:

@DubboService
public class OrderServiceImpl implements OrderService {
    public void listStream(Long userId, StreamObserver<Order> observer) {
        orders.forEach(observer::onNext);
        observer.onCompleted();
    }
}

相关链接