调用上下文

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

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

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