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

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

com.taobao.hsf.util.RequestCtxUtil提供设置和获取调用上下文的静态方法,基于ThreadLocal工作,getXXX操作会将XXX属性从当前ThreadLocal变量中remove,仅作用于当前线程的单次调用。具体属性的设置和获取如下:
  • 客户端
    方法 说明
    setRequestTimeout() 设置单次调用的超时时间。
    setUserId() 设置本次调用的单元化服务的User ID(泛化调用中需要通过此方法配置)。
    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");