.net core 自帶分布式事務的微服務開源框架JMS


事務的統一性是微服務的一個重點問題,簡潔有效的控制事務,更是程序員所需要的。JMS的誕生,就是為了更簡單、更有效的控制事務。

先看一段調用微服務的代碼: 

            using (var ms = new JMSClient())
            {
                //調用用戶信息微服務,創建新用戶
                var uis = ms.GetMicroService<UserInfoService>();
                var userid = uis.CreateUser();

                //調用銀行微服務,創建用戶的銀行賬號
                var bks = tran.GetMicroService<BankService>();
                bks.CreateBankAccount( userid );

                //統一提交事務
                ms.Commit();
            }    

 代碼中,分別調用了兩個不同的微服務,做了一些業務操作,最后,通過Commit方法,統一提交這兩個微服務的事務。

由於tran對象被using包裹,在這中間,任意一個代碼發生異常,整體事務都會被回滾。

這樣的代碼風格,比較簡潔,也符合一貫的編程習慣。

 

我們再看一下微服務端的代碼:

UserInfoService:
public int CreateUser(TransactionDelegate tranDelegate) { var dbContext = new UserInfoDBContext(); dbContext.BeginTransaction(); //編寫新增用戶的業務代碼 ......... //把數據庫的事務提交和回滾,放到委托當中 tranDelegate.CommitAction = () => dbContext.CommitTransaction(); tranDelegate.RollbackAction = () => dbContext.RollbackTransaction(); return newUserId; }
BankService:
public int CreateBankAccount(TransactionDelegate tranDelegate,int userid) { var dbContext = new BankDBContext(); dbContext.BeginTransaction(); //...編寫創建銀行賬戶的業務代碼 //把數據庫的事務提交和回滾,放到委托當中 tranDelegate.CommitAction = () => dbContext.CommitTransaction(); tranDelegate.RollbackAction = () => dbContext.RollbackTransaction(); return userBankId; }

微服務寫完業務邏輯,最后,把事務的提交和回滾放到委托當中,由框架自動調用。

 

JMS會在所有微服務執行完畢后,統一調用微服務掛起的委托,提交事務。如果有任意一個微服務執行出錯、宕機或者離線,其他微服務的操作會被回滾,而離線的微服務,它所掛起的事務,也會在10秒之內回滾。

而分布式事務,有一種情況是無法避免的,就是最終統一提交事務時,雖然確認了各個微服務器響應正常,可以正常提交事務,這時候,所有服務器響應號召,提交了事務,但是,最后發現,有一台服務器宕機了。這種情況,是分布式系統無法避免的,但是,通過執行日志所提供的數據,可以把宕機的服務,手動再執行一次。

 事務實現原理

應用層

應用層調用微服務,微服務返回調用結果,並告知應用層,微服務端是否有事務放在委托當中。

當應用層繼續調用其他微服務的時候,如果發生異常,那么,通知所有微服務的委托回滾事務;

如果沒有發生異常,全部微服務調用完畢,先確認一下所有調用的微服務器是否還正常響應,任何一個服務器響應不正常,也通知所有服務器的遠程委托回滾事務;

如果所有服務器響應正常,那么通知遠程委托提交事務;

提交事務過程中,如果某個服務器出現網絡異常,繼續嘗試幾次與服務器通訊,完成提交事務的通知工作;

微服務端

接到應用層指令,執行完函數,返回結果給應用層,然后繼續和應用層保持長連接,保持心跳。

如果一切正常,最后,會響應應用層的指令,提交/回滾事務;

如果連接意外斷開,把事務委托交到委托中心,而委托中心,在10秒內,如果收不到應用層的指令,那么,自己回滾委托的事務。

JMS特性

1、支持分布式事務控制(強一致性和非強一致性);

2、支持分布式事務鎖;

3、網關支持雙機熱備;

4、支持配置文件統一在網關部署、更新;

5、支持SSL雙向校驗;

6、可自定義定時任務;

7、負載均衡根據微服務的CPU使用率和當前請求數進行平均分配,也可自己編寫負載均衡規則;

8、支持小巧的雙重加密token(長度僅有幾十個字符),實現用戶無狀態登錄,同時支持廣播通報 token作廢;

 

JMS支持的網絡架構方案

方案1:只暴露應用服務器

 這是應用服務器和微服務溝通,效率最高的方案,也是我們使用最多的。如果我們的服務器不是要部署在全國各地,那么可以多台服務器使用同一個局域網,只暴露應用服務器作為唯一的訪問入口。

方案2:暴露應用服務器和代理服務器

 服務器需要分布在不同的地域,為了安全起見,可以通過一個代理服務器,訪問網關和微服務。

方案3:暴露所有服務器

服務器需要分布在不同的地域,為了更高的效率和更低的成本,可以把所有服務器暴露在互聯網上,與服務器之間的通訊,經過SSL雙向加密機制保證安全。

 以上3個方案便是JMS所支持的網絡架構,根據實際情況,自由配置適合自己的方案。

 

下一篇,JMS開發示例(一)

這里給出JMS的源碼庫地址:

https://github.com/simpleway2016/JMS

qq交流群:1030042218


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM