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 支持根据权重对服务进行预热功能,具体地址:预热权重. 引用官方文档: 预热权重功能让客户端机器能够根据服务端的相应权重进行流量的分发.该功能也常被用于集群内少数机器的启动场景. ...
 
随机推荐
- Linux多线程实践(1) --线程理论
			
线程概念 在一个程序里的一个执行路线就叫做线程(thread).更准确的定义是:线程是"一个进程内部的控制序列/指令序列"; 一切进程至少有一个执行线程; 进程 VS. 线程 ...
 - Strategy 设计模式 策略模式 超靠谱原代码讲解
			
先来假设一种情,我们需要向三种不同的客户做出不同的报价,一般来说要肿么设计呢,是不是马上会想到用IF,没有错,对于这种情况,策略模式是最好的选.大家可以这么理解,如果有情况需要用到大量的IF,那你用策 ...
 - Python进阶 函数式编程和面向对象编程等
			
函数式编程 函数:function 函数式:functional,一种编程范式.函数式编程是一种抽象计算机的编程模式. 函数!= 函数式(如计算!=计算机) 如下是不同语言的抽象 层次不同 高阶函数: ...
 - Android APP新的“优雅”退出方式--EventBus大显身手
			
最近在研究eventBus..很多小伙伴不知道他有什么用.. 前篇介绍了EventBus的基本使用 这里简单举一个例子,就是退出APP 转载请注明出处:http://blog.csdn.net/win ...
 - Dynamics CRM2013/2015 禁止欢迎界面(Disable the Welcome Screen)
			
首次打开Dynamic CRM 2013会出现一个欢迎界面如下图,要想它不出现勾选图中的复选框就行,OK下回再打开就没有了. 但是当我们打开F12开发人员工具,清除域的缓存后再次打开CRM,这个欢迎 ...
 - AndroidBinder进程间通信系统-android学习之旅(86)
			
目录 前言及知识准备 Service组件结构 Clinet组件结构 与Binder驱动程序交互 总结 Binder进程间通信实例 问题 本次主要介绍Android平台下Binder进程间通信库.所谓通 ...
 - Javascript和BHO的相互调用简介
			
v:* { } o:* { } w:* { } .shape { }p.MsoNormal,li.MsoNormal,div.MsoNormal { margin: 0cm; margin-botto ...
 - 在VS2012中实现Ext JS的智能提示太简单了
			
Visual Studio 2012太强大了,居然能自己会去提取Ext JS的类的属性和方法,从而实现只能提示.下面就来介绍一下实现这个功能. 在Visual Studio 2012中随便创建一个We ...
 - hive:(group by, having;order by)的使用;group by+多个字段,以及wiki说的group by两种使用限制验证
			
hive> select * from app_data_stats_historical where os='1' group by dt limit 100; 出现结果如下: 2014-01 ...
 - Erlang Rebar 使用指南之四:依赖管理
			
Erlang Rebar 使用指南之四:依赖管理 全文目录: https://github.com/rebar/rebar/wiki 本章链接: https://github.com/rebar/re ...