Ⅰ 分布式事務解決方案ServiceComb - Omega源碼閱讀與分享
ServiceComb已經是Apache的頂級項目,包含兩個組件,即 alpha 和 omega。
源碼地址:https://github.com/apache/servicecomb-pack
alpha 是事務協調中心,保存事務日誌,通過日誌協調各個分支
demo 裡面項目的各框架的例子:spring和bbo saga tcc
docs 設計文檔,最先應該熟悉的。
omega 負責與alpha通訊,子事務邏輯
pack-contracts gRPC通訊介面定義文件,通過中間文件生成客戶端與服務端面代碼,讓開發者不必關心通訊過程
web 用angular寫的web界面,可以查看事務的狀態。
我們主要關注的alpha和omega的代碼,gRPC知識是通訊基礎非常重要,最好先了解gRPC和probuf、Kyro序列化對閱讀源碼
還是很有幫助的。但通訊部分只是簡單帶過。
GlobalTxId全局事務ID標記子事務是否同屬性一個事務中
ParentTxId 父類的事務ID
localTxId子事務Id
Omega會面向切面編程的方式,向程序中注入相應的邏輯,初始化事務上下文OmegaContext,在事務處理的過程中向alpha報告事務狀態,
實現saga協調協議和TCC協調協議,下面就是omega客戶端要配置了三個信息
omega.enable=true或@EnableOmega的作用只標記開啟Omega,Omega在SpringBoot上初始化過程:
OmegaSpringAutoConfiguration 通過@Configuration,在Spring框架啟動時載入並配置
OmegaSpringConfig
作用:初始化各Bean,IdGenerator用來生成子事務Id Saga的事件Sender Tcc事件Sender回調CallbackContext
TransactionAspectConfig
對@SagaStart @Compensable註解AOP的切面編程對象初始
Omega內部機制:SagaStartAspect @SagaStart的AOP切面編程
TransactionAspect對@Compensable註解AOP切面編程
成功場景下,每個事務都會有開始和對應的結束事件。
TransactionAspect=>DefaultRecovery=>CompensableInterceptor
封裝了通訊組件:bbo fegin resttemplate servicecomb實現的通訊
這些組件各自通訊的基礎上,在服務之間相互調用時,把globalTxId和localTxId傳遞過去,並注入Context中
如:omega-transport->omega-transport-resttemplate
RestTemplateConfig 配置攔截器
:把當前的上下文的globalTxId和localTxId放到請求里
TransactionHandlerInterceptor 服務提供者,把resttemplate傳遞過來的globalTxId和localTxId放到當前上下文里,
pack-contracts->pack-contract-grpc
gRPC的介面服務定義文件:GrpcCommon.proto GrpcTccEvent.protogrpcTxEvent.proto:這些文件在protobuf命令直接編譯成java代碼。
如何使用請看:proto文件gRpc基礎
謝謝能看到最後的人:我分享我是怎麼閱讀源碼的。源碼閱讀不能一上來就找到main入口一行一行的看。最先應該了解基本的組成架構、和用到了哪些技術棧,如果還用了你從來沒見的技術,建議先去學習這門新的技術,再回頭來看代碼,熟悉了各模塊相對應的功能後。我會找到一個切入口,猜一下它的實現方式,再根據猜測,帶著疑問,去找答案。如果對整個項目的模塊不是很清楚,最好先把源碼里的Demo正常的運行。通過這樣的簡單學習,一步步的深入。有的代碼的抽象是比較復雜的。可先跳過,當你對整個結構都非常了解了,這時再回頭去讀剩下的難點。最後有個總結有個對比就是最好結果。