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

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

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");