数据透传:
在 RPC调用中,数据的传递,是通过接口方法参数来传递的,需要接口方定义好一些参数允许传递才可以,在一些场景下,我们希望,能够更通用的传递一些参数,比如一些标识性的信息。业务方可能希望,在每一次调用请求中都能够传递一些自定义的信息到下游。甚至也希望下游能够将一些数据传递回来。
数据透传功能,就是指数据不需要以作为方法参数的形式在调用链路中进行传递,而是直接存储到调用上下文中,之后通过 RPC 的内置对象,进行传递,调用双端可从上下文中获取数据而不需要去关注数据的传输过程。
==》SOFARPC 提供的数据透传支持请求数据透传(客户端向服务端)和响应数据透传(服务端向客户端)。
数据透传使用例子=====》
public interface HelloService {
String sayHello(String string);
}
public class HelloServiceImpl implements HelloService {
@Override
public String sayHello(String string) {
// 获取请求透传数据并打印
System.out.println("service receive reqBag -> " + RpcInvokeContext.getContext().getRequestBaggage("req_bag"));
// 设置响应透传数据到当前线程的上下文中
RpcInvokeContext.getContext().putResponseBaggage("resp_bag", "s2c");
return "hello " + string + " !";
}
}
RpcInvokeContext.requestBaggage
属性中,之后在调用过程中从requestBaggage
中取出请求透传数据并设置到SofaRequest.requestProps
属性中;SofaRequest
对象后,在其调用链中的 ProviderBaggageFilter#invoke
方法中会先从SofaRequest.requestProps
中取出请求透传数据并设置到当前服务端线程的调用上下文RpcInvokeContext.requestBaggage
属性中,最后业务代码就可以从调用上下文中获取请求透传数据了。RpcInvokeContext.responseBaggage
属性中,之后在ProviderBaggageFilter#invoke
方法中先从responseBaggage
中取出响应透传数据并设置到SofaResponse.responseProps
属性中;SofaResponse.responseProps
中获取响应透传数据,之后将响应透传数据设置到其调用上下文RpcInvokeContext.responseBaggage
中,最后业务代码就可以从调用上下文中获取响应透传数据了。在 oneway 模式下,客户端不接受服务端响应,也不会获取响应透传数据。
future 模式在 SOFARPC 内部会被转化为 callback 的方式进行调用,在 callback 对象中会存储main线程的调用上下文;当客户端接收到响应时,会执行该 callback 对象的回调函数,在其回调函数中,对于响应透传数据,会做如下操作:
SofaResponse.responseProps
中获取响应透传数据最终业务代码中是从回调线程而不是main线程的调用上下文中获取响应透传数据。
手机扫一扫
移动阅读更方便
你可能感兴趣的文章