04 dubbo服务间的调用,怎么实现的

vvEcho 2026-01-19 20:53:00
Categories: Tags:

生产端

1
2
3
4
5
6
7
8
9
10
11
12
public interface OrderService {
OrderResult createOrder(CreateOrderReq req);
}
@DubboService(version = "1.0.0", timeout = 3000)
public class OrderServiceImpl implements OrderService {

@Override
public OrderResult createOrder(CreateOrderReq req) {
// 真实业务逻辑
return new OrderResult();
}
}

扫描DubboService

1.服务启动时,spring扫描 @DubboService注解
2.创建ServiceConfig(服务配置对象)
3.接下来是服务暴露,serviceConfig.export();这个方法内部非常复杂,但逻辑可以压缩成 3 步

消费方

1
2
3
4
@DubboReference
private OrderService orderService;

orderService.createOrder(req);

Spring 启动时:创建代理
@DubboReference → ReferenceBean

1
2
3
4
5
6
/** 本质是方法调用被拦截,转成rpc调用 */
class OrderServiceProxy implements OrderService {
public Result createOrder(Req req) {
return invoker.invoke(new RpcInvocation(...));
}
}

具体流程如下图:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@DubboReference

Proxy(JDK / Javassist)

Invoker

Filter(超时 / 重试 / 限流)

Cluster(Failover)

LoadBalance

Netty Client

TCP

Netty Server

Wrapper 调用实现类

返回 Result