请求上下文包括一次调用相关的属性,例如调用的地址,调用方的应用名,超时时间等属性和用户在接口定义的参数之外传递自定义的数据。
设置和获取本次调用上下文
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");