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 源码分析 — 链路数据透传的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 枚举(enum) 详细用法
- 下一篇: 算法学习-求两个整数的最大公约数