Dubbo远程远程调用处会传递参数,还会传递RpcContext
在 Dubbo 中,当服务 A(客户端)远程调用服务 B(服务端)时,除了方法参数外,RpcContext 中的附加信息(attachments) 会被自动传递给服务 B。这是 RpcContext 实现跨服务元数据传递的核心机制。
具体说明
-
传递内容
RpcContext中通过setAttachment(key, value)设置的键值对(附加信息)会被传递,而其他信息(如本地地址、超时设置等)仅在当前端有效,不会传递到对端。例如:
// 服务 A(客户端)设置附加信息 RpcContext.getContext() .setAttachment("traceId", "123456") // 会被传递到服务 B .setLocalHost("10.0.0.1"); // 仅本地可见,不会传递 -
传递时机
当 A 调用 B 时,Dubbo 框架会在底层将RpcContext中的附加信息编码到 RPC 请求中,与方法参数一起发送给 B。服务 B 接收到请求后,会将这些附加信息解码并注入到自身线程的RpcContext中,供 B 读取。 -
双向传递
- 客户端 → 服务端:A 设置的附加信息会传递到 B。
- 服务端 → 客户端:B 也可以通过
setAttachment设置信息,在响应时传递回 A,A 调用完成后可从自身RpcContext中获取。
验证示例
服务 A(客户端)代码
public class ServiceAClient {
@Reference(interfaceClass = ServiceB.class)
private ServiceB serviceB;
public void callServiceB() {
// 设置附加信息
RpcContext.getContext().setAttachment("traceId", "trace-123");
// 调用服务 B
serviceB.doSomething("param1");
// 获取服务 B 返回的附加信息
String serverInfo = RpcContext.getContext().getAttachment("serverInfo");
System.out.println("服务 B 返回的信息:" + serverInfo);
}
}
服务 B(服务端)代码
public class ServiceBImpl implements ServiceB {
@Override
public void doSomething(String param) {
// 获取服务 A 传递的附加信息
String traceId = RpcContext.getContext().getAttachment("traceId");
System.out.println("收到 traceId:" + traceId); // 输出:收到 traceId:trace-123
// 向服务 A 传递附加信息
RpcContext.getContext().setAttachment("serverInfo", "服务 B 处理完成");
}
}
总结
- 会传递:
RpcContext中的attachments(通过setAttachment设置的键值对)会随 RPC 调用自动在客户端和服务端之间传递。 - 用途:这一机制常用于传递分布式追踪 ID、认证信息、临时配置等非业务参数,是 Dubbo 实现服务治理的重要扩展点。
- 注意:传递的数据需是可序列化的简单类型(如字符串、数字),避免传递大量数据影响性能。
872

被折叠的 条评论
为什么被折叠?



