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

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

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