请求上下文包括一次调用相关的属性,列如调用的地址,调用方的应用名,超时时间等属性和用户在接口定义的参数之外传递自定义的数据。

设置和获取本次调用上下文

com.taobao.hsf.util.RequestCtxUtil 提供设置和获取调用上下文的静态方法,基于 ThreadLocal 工作, getXXX 操作会将 XXX 属性从当前 ThreadLocal 变量中 remove ,仅作用于当前线程的单次调用。具体属性的设置和获取如下。

客户端

方法 说明
setRequestTimeout() 设置单次调用的超时时间
setUserId() 设置本次调用的单元化服务的 userId(泛化调用中需要通过此方法配置)
getProviderIp() 获取【最近一次】调用的服务端的 ip
setTargetServerIp(String ip) 设置当前线程下一次调用的目标服务器 Ip(此 ip 必须包含在内存已提供服务的地址列表里)
setDirectTargetServerIp(String targetIp) 设置当前线程下一次调用的目标服务器 ip(绕过注册中心,忽略内存里的地址列表)

服务端

方法 说明
getClientIp() 服务端获取调用方 IP
getAppNameOfClient() 服务端获取调用方的应用名
isHttpRequest() 是否是 http 调用
getHttpHeader(String key) 获取 http 请求的 header 属性

传递自定义请求上下文

RpcContext 提供一种不修改接口,向服务端额外传递数据的方式。参数可以是自定义的 DO 或者基本类型。要保证对端也有该对应的类型,并且可以能够被序列化。

客户端发起调用前,设置上下文。

//setup context before rpc call
RPCContext rpcContext = RPCContext.getClientContext();
rpcContext.putAttachment("tetantId", "123");

//rpc call,context 也会传到远端
 orderService.queryOrder(1L);

服务端业务方法内,获取上下文。

//get context data
RPCContext rpcContext = RPCContext.getServerContext();
String myContext = (String)rpcContext.getAttachment("tetantId");