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

IWing發表於2020-07-23

事務的統一性是微服務的一個重點問題,簡潔有效的控制事務,更是程式設計師所需要的。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(); //編寫新增使用者的業務程式碼 ......... //把資料庫的事務提交和回滾,放到委託當中 tranDelegate.CommitAction = () => dbContext.CommitTransaction(); tranDelegate.RollbackAction = () => dbContext.RollbackTransaction(); return newUserId; }
BankService:
public int CreateBankAccount(TransactionDelegate tranDelegate,int userid) { var dbContext = new BankDBContext(); //...編寫建立銀行賬戶的業務程式碼 //把資料庫的事務提交和回滾,放到委託當中 tranDelegate.CommitAction = () => dbContext.CommitTransaction(); tranDelegate.RollbackAction = () => dbContext.RollbackTransaction(); return userBankId; }

微服務寫完業務邏輯,最後,把事務的提交和回滾放到委託當中,由框架自動呼叫。

 

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

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

 

JMS特性

1、支援分散式事務控制;

2、支援分散式事務鎖;

3、閘道器支援雙機熱備;

4、支援配置檔案統一在閘道器部署、更新;

5、支援SSL雙向校驗;

6、可自定義定時任務;

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

8、支援小巧的雙重加密token(長度為68字元),實現使用者無狀態登入;

 

JMS支援的網路架構方案

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

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

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

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

方案3:暴露所有伺服器

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

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

 

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

這裡給出JMS的原始碼庫地址:

https://github.com/simpleway2016/JMS

相關文章