简介
获取上下文信息
RpcContext 可以使数据在Rpc调用间使消费者和提供者之间隐式的传递参数。
服务提供方使用RpcContext.getContext().getAttachments();获取参数。
服务器消费方使用RpcContext.getContext().setAttachment(); 传递参数。
RpcContext本质上是一个ThreadLocal,当接收到RPC请求或发起RPC请求时,RpcContext的状态会变化。比如A调用B,B再调用C,则B机器上,在B调用C之前,RpcContext记录的是A调用B的信息,在B调用C之后,RpcContext记录的是B调用C.
ThreadLocal:ThreadLocal是线程局部变量,所谓的线程局部变量,就是仅仅只能被本线程访问,不能在线程之间进行共享访问的变量。
通常情况下RpcContext不会单独拿出来使用而是配合着dubbo拦截器来一起使用原因主要有两个:
- 统一入口设置参数,节省代码方便维护
- 解决一次完整请求调用涉及多次rpc调用时获取不到上下文中设置的参数值.
如果拦截的方法使用了异步处理,同个线程上下文下可能获取不到值,这时候dubbo拦截器获取值设置进上下文可能是空的,这一点需要注意.
import com.alibaba.dubbo.rpc.*; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class BaseDubboContextFilter implements Filter { private static final Logger logger = LoggerFactory.getLogger(BaseDubboContextFilter.class); public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException { String rpcDsAttachment = RpcContext.getContext().getAttachment("rpcDsAttachment"); if (StringUtils.isNotBlank(rpcDsAttachment)) { System.out.println(rpcDsAttachment); } else { RpcContext.getContext().setAttachment("rpcDsAttachment", "1"); } return invoker.invoke(invocation); } }