五、 上下文隐式传参
1. 特性说明
可以通过RpcContext上的setAttachment和getAttachment在服务消费方和提供方之间进行参数的隐式传递。
背景
上下文信息是RPC框架很重要的一个功能,使用RpcContext可以为单次调用指定不同配置。如分布式链路追踪场景,其实现原理就是在全链路的上下文中维护一个 traceId,Consumer和Provider通过传递traceId来连接一次RPC调用,分别上报日志后可以在追踪系统中串联并展示完整的调用流程。这样可以更方便地发现异常,定位问题。
Dubbo中的RpcContext是一个ThreadLocal的临时状态记录器,当接收到RPC请求,或发起RPC请求时,RpcContext的状态都会变化。比如:A调B,B调C,则B机器上,在B调C之前,RpcContext记录的是A和B的信息,在B调C之后,RpcContext记录的是B和C的信息。
在Dubbo 3中,RpcContext被拆分为四大模块(ServerContext、ClientAttachment、ServerAttachment和ServiceContext)。
它们分别承担了不同的指责:
• ServiceContext:在Dubbo内部使用,用于传递调用链路上的参数信息,如invoker对象等。
• ClientAttachment:在Client端使用,往ClientAttachment中写入的参数将被传递到Server端。
• ServerAttachment:在Server端使用,从ServerAttachment中读取的参数是从Client中传递过来的。
• ServerContext:在Client端和Server端使用,用于从Server端回传Client端使用,Server端写入到ServerContext的参数在调用结束后可以在Client端的ServerContext获取到。
如上图所示,消费端发起调用的时候可以直接通过Method Invoke向远程的服务发起调用,同时消费端往RpcClientAttachment写入的数据会连同Invoke的参数信息写入到Invocation中。
消费端的Invocation经过序列化后通过网络传输发送给服务端,服务端解析Invocation生成Method Invoke的参数和RpcServerAttachment,然后发起真实调用。
在服务端处理结束之后,Method Response结果会连同RpcServiceContext一起生成Result对象。
服务端的Result结果对象经过序列化后通过网络传输发送回消费端,消费端解析Result生成Method Response结果和RpcServiceContext,返回真实调用结果和上下文给消费端。
注:path,group,version,dubbo,token,timeout几个key是保留字段,请使用其它值。
2. 使用场景
内部系统通过Dubbo调用时,traceId如何透传到服务提供方。
《Apache Dubbo微服务开发从入门到精通》——高级功能——五、 上下文隐式传参(下):https://developer.aliyun.com/article/1224998