SOFA 数据透析
2024-08-31 11:19:42
数据透传:
在 RPC调用中,数据的传递,是通过接口方法参数来传递的,需要接口方定义好一些参数允许传递才可以,在一些场景下,我们希望,能够更通用的传递一些参数,比如一些标识性的信息。业务方可能希望,在每一次调用请求中都能够传递一些自定义的信息到下游。甚至也希望下游能够将一些数据传递回来。
数据透传功能,就是指数据不需要以作为方法参数的形式在调用链路中进行传递,而是直接存储到调用上下文中,之后通过 RPC 的内置对象,进行传递,调用双端可从上下文中获取数据而不需要去关注数据的传输过程。
==》SOFARPC 提供的数据透传支持请求数据透传(客户端向服务端)和响应数据透传(服务端向客户端)。
SOFARPC 设计原理
- 用户通过 SOFARPC 提供的 API 进行数据传递设置
- SOFARPC 在调用传输前,将透传的数据进行打包获取
- 进行正常的序列化和反序列化
- SOFARPC 在反序列化时将用户设置的透传数据写回 Context
- 服务端用户即可进行获取使用
数据透传使用例子=====》
接口服务----》
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 + " !";
}
}
sync 调用下的透传:
请求透传数据
- 客户端首先在 main 线程中设置请求透传数据到其调用上下文
RpcInvokeContext.requestBaggage
属性中,之后在调用过程中从requestBaggage
中取出请求透传数据并设置到SofaRequest.requestProps
属性中; - 服务端接收到请求
SofaRequest
对象后,在其调用链中的ProviderBaggageFilter#invoke
方法中会先从SofaRequest.requestProps
中取出请求透传数据并设置到当前服务端线程的调用上下文RpcInvokeContext.requestBaggage
属性中,最后业务代码就可以从调用上下文中获取请求透传数据了。
响应透传数据
- 服务端设置响应透传数据到其调用上下文
RpcInvokeContext.responseBaggage
属性中,之后在ProviderBaggageFilter#invoke
方法中先从responseBaggage
中取出响应透传数据并设置到SofaResponse.responseProps
属性中; - 客户端main线程被唤醒后,先从
SofaResponse.responseProps
中获取响应透传数据,之后将响应透传数据设置到其调用上下文RpcInvokeContext.responseBaggage
中,最后业务代码就可以从调用上下文中获取响应透传数据了。
oneway 调用下的透传
在 oneway 模式下,客户端不接受服务端响应,也不会获取响应透传数据。
future 调用下的透传
客户端获取响应透传数据
future 模式在 SOFARPC 内部会被转化为 callback 的方式进行调用,在 callback 对象中会存储main线程的调用上下文;当客户端接收到响应时,会执行该 callback 对象的回调函数,在其回调函数中,对于响应透传数据,会做如下操作:
- 从
SofaResponse.responseProps
中获取响应透传数据 - 从 callback 对象中获取 main 线程的调用上下文
- 设置响应透传数据到 main 线程的调用上下文
- 将 main 线程上下文拷贝到当前的回调线程中
callback 调用下的透传
最终业务代码中是从回调线程而不是main线程的调用上下文中获取响应透传数据。
最新文章
- django表单验证和跨站伪造csrf
- jquery计算文本字符个数
- 《JavaScript语言精粹》小记
- jQuery学习笔记(四)jQuery中的动画
- Java语法糖1:可变长度参数以及foreach循环原理
- 东大OJ-Max Area
- Sql如何自动定时备份数据库
- CleanAOP实战系列--WPF中MVVM自动更新
- 10款无需编程的App DIY开发工具
- VC编程技巧:IE控件的高级用法
- 动态调用WebService 通用方法Moss 中 传统开发中都可用。
- R语言的一些笔记
- android studio中文乱码的解决方法【转】
- “ddl”有一个无效 SelectedValue,因为它不在项目列表中。
- Redis使用记录-相关资料汇总
- Dynamics CRM2016 站点地图Bug之KnowledgeArticle不显示
- ThreadPoolExecutor系列二——ThreadPoolExecutor 代码流程图
- 【WCF系列】(一)为什么我们需要WCF
- Can DBC文件翻译
- [JS]两个常用的取随机整数的函数
热门文章
- Levenshtein莱文斯坦算法在项目中的应用
- 前端4 — jQuery — 更新完毕
- SpringBoot Logback 日志配置
- 大数据学习day23-----spark06--------1. Spark执行流程(知识补充:RDD的依赖关系)2. Repartition和coalesce算子的区别 3.触发多次actions时,速度不一样 4. RDD的深入理解(错误例子,RDD数据是如何获取的)5 购物的相关计算
- Static data members in C++
- redis入门到精通系列(八):redis的高可用--主从复制详解
- oracle name
- 对于HTML和XML的理解
- SpringBoot中使用JUnit4(入门篇)
- Jenkins动态选择分支/tag