SOFA 源码分析 — 链路数据透传

前言
SOFA—RPC 支持数据链路透传功能,官方解释:
链路数据透传功能支持应用向调用上下文中存放数据,达到整个链路上的应用都可以操作该数据。 使用方式如下,可分别向链路的 request 和 response 中放入数据进行透传,并可获取到链路中相应的数据。
使用方式:
RpcInvokeContext.getContext().putRequestBaggage("key_request","value_request");
RpcInvokeContext.getContext().putResponseBaggage("key_response","value_response");
RpcInvokeContext.getContext().getAllRequestBaggage("key_request");
RpcInvokeContext.getContext().getAllRequestBaggage("key_response");
源码分析
从这个 4 句代码开始看。
关键类: RpcInvokeContext,该类是一个 基于ThreadLocal的面向业务开发者使用的上下文传递对象。
内部维护了一个 ThreadLocal 对象。
protected static final ThreadLocal<RpcInvokeContext> LOCAL = new ThreadLocal<RpcInvokeContext>();
value 是一个 RpcInvokeContext 对象。
当调用 getContext 的时候,就会从当前线程获取 RpcInvokeContext 对象。
该类定义了以下属性:
- boolean BAGGAGE_ENABLE 是否开启上下文透传功能,关闭后,会提高性能
- Integer timeout 用户自定义超时时间,单次调用生效
- String targetURL 用户自定义对方地址,单次调用生效
- String targetGroup 用户自定义对方分组
- SofaResponseCallback responseCallback 用户自定义Callback,单次调用生效
- ResponseFuture<?> future
- ConcurrentMap<String, Object> map 自定义属性
- Map<String, String> requestBaggag 请求上的透传数据
- Map<String, String> responseBaggage 响应上的透传数据
知道了基本的数据结构,再看看上面的几个方法:
- putRequestBaggage()
- putResponseBaggage()
- getAllRequestBaggage()
- getAllRequestBaggage()
其实都是从 Map 中获取数据,不过,貌似官方的例子有点问题,后面两个例子不对。没有 key 。待我提个 issue。

总结
这个功能让我想到了我在公司项目中使用的 CurrentUser 功能,也是使用的 ThreadLocal,将用户的信息存在线程中,这样就不必将常用数据在方法参数中传递了,省了很多事。只不过异步的时候,可能会有点问题,需要手动将 ThreadLocal 传递到异步线程中。
不过,我没有使用手动传递,我是这么设计的:自定义线程池和线程工厂,线程工厂创建线程的时候,会将主线程的 ThreadLocal 复制到异步线程中,并自定义了线程类,在 finally 块中删除 ThreadLocal,非常完美的一个设计。这样就不必每次手动传递并手动删除了。
好了,这个功能还是很简单的。但非常实用,不过要是能加上我上面设计的那个功能就好啦! 哈哈!
SOFA 源码分析 — 链路数据透传的更多相关文章
- 11.源码分析---SOFARPC数据透传是实现的?
先把栗子放上,让大家方便测试用: Service端 public static void main(String[] args) { ServerConfig serverConfig = new S ...
- SOFA 源码分析 —— 服务引用过程
前言 在前面的 SOFA 源码分析 -- 服务发布过程 文章中,我们分析了 SOFA 的服务发布过程,一个完整的 RPC 除了发布服务,当然还需要引用服务. So,今天就一起来看看 SOFA 是如何引 ...
- HDFS源码分析之数据块及副本状态BlockUCState、ReplicaState
关于数据块.副本的介绍,请参考文章<HDFS源码分析之数据块Block.副本Replica>. 一.数据块状态BlockUCState 数据块状态用枚举类BlockUCState来表示,代 ...
- jQuery 源码分析(十) 数据缓存模块 data详解
jQuery的数据缓存模块以一种安全的方式为DOM元素附加任意类型的数据,避免了在JavaScript对象和DOM元素之间出现循环引用,以及由此而导致的内存泄漏. 数据缓存模块为DOM元素和JavaS ...
- SOFA 源码分析 —— 服务发布过程
前言 SOFA 包含了 RPC 框架,底层通信框架是 bolt ,基于 Netty 4,今天将通过 SOFA-RPC 源码中的例子,看看他是如何发布一个服务的. 示例代码 下面的代码在 com.ali ...
- SOFA 源码分析 — 调用方式
前言 SOFARPC 提供了多种调用方式满足不同的场景. 例如,同步阻塞调用:异步 future 调用,Callback 回调调用,Oneway 调用. 每种调用模式都有对应的场景.类似于单进程中的调 ...
- SOFA 源码分析 — 自动故障剔除
前言 集群中通常一个服务有多个服务提供者.其中部分服务提供者可能由于网络,配置,长时间 fullgc ,线程池满,硬件故障等导致长连接还存活但是程序已经无法正常响应.单机故障剔除功能会将这部分异常的服 ...
- SOFA 源码分析 — 负载均衡和一致性 Hash
前言 SOFA 内置负载均衡,支持 5 种负载均衡算法,随机(默认算法),本地优先,轮询算法,一致性 hash,按权重负载轮询(不推荐,已被标注废弃). 一起看看他们的实现(重点还是一致性 hash) ...
- SOFA 源码分析 — 预热权重
前言 SOFA-RPC 支持根据权重对服务进行预热功能,具体地址:预热权重. 引用官方文档: 预热权重功能让客户端机器能够根据服务端的相应权重进行流量的分发.该功能也常被用于集群内少数机器的启动场景. ...
随机推荐
- Java 8新特性探究(三)泛型的目标类型推断
简单理解泛型 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.通俗点将就是"类型的变量".这种类型变量可以用在类.接口和方法 ...
- iOS中 UIToolBar 技术分享
UIToolBar存在于UINavigationController导航栏控制器中,而且默认被隐藏.当设置UIToolBar显示,或者存在UITabBarController且tabbar被隐藏的时候 ...
- Socket编程实践(6) --TCP服务端注意事项
僵尸进程处理 1)通过忽略SIGCHLD信号,避免僵尸进程 在server端代码中添加 signal(SIGCHLD, SIG_IGN); 2)通过wait/waitpid方法,解决僵尸进程 sign ...
- 海量数据挖掘MMDS week2: 频繁项集挖掘 Apriori算法的改进:基于hash的方法
http://blog.csdn.net/pipisorry/article/details/48901217 海量数据挖掘Mining Massive Datasets(MMDs) -Jure Le ...
- 高性能C++网络库libtnet实现:http
HTTP libtnet提供了简单的http支持,使用也很简单. 一个简单的http server: void onHandler(const HttpConnectionPtr_t& con ...
- C语言实现的猜数字小游戏(主要是对于自定义函数的运用)
#include <stdio.h> #include <stdlib.h> #include<time.h>//加上此头文件的作用是什么?另外不加的话有什么影响? ...
- CSDN_投票评选_JS_分析脚本
作者: 铁锚 日期: 2013年12月31日 如题, 使用说明如下: 1. 原创图书 http://special.csdn.net/book2013/yc.html 2. 引进图书 http://s ...
- (三十二)DatePicker和自定义键盘
DatePicker通过设置Locale属性可以设置语言(注意手机语言也会影响到它的显示). 如果通过代码创建DatePicker,又要设置属性,使用下面的代码,注意locale是个枚举,初始化要填写 ...
- Android 添加library的时候出错添加不上
在向android工程中导入library的时候,会和出现导入不成功,打开查看添加library界面,会发现你添加的library的路径出现D:/work/...?类似的情况,但是别的工程使用的时候又 ...
- 蘑菇街Android组件与插件化
插件化的基石 -- apk动态加载 随着我街业务的蓬勃发展,产品和运营随时上新功能新活动的需求越来越强烈,经常可以听到"有个功能我想周x上,行不行".行么?当然是不行啦,上新功能得 ...