前言
在微服務開發中,存在諸多的開發痛點,例如分布式事務、全鏈路跟蹤、限流降級和服務平滑上下線等。而在這其中,分布式事務是最讓開發者頭痛的。那分布式事務是什么呢?
分布式事務就是指事務的參與者、支持事務的服務器、資源服務器以及事務管理器分別位於不同的分布式系統的不同節點之上。簡單的說,就是一次大的操作由不同的小操作組成,這些小的操作分布在不同的服務器上,且屬於不同的應用,分布式事務需要保證這些小操作要么全部成功,要么全部失敗。本質上來說,分布式事務就是為了保證不同數據庫的數據一致性。或者,在換一句話說,分布式事務 = n 個本地事務。通過事務管理器,達到 n 個本地事務要么全部成功,要么全部失敗。
SEATA應運而生
那有什么方案解決上述的這些難點和痛點呢?
SEATA作為一款開源的分布式事務解決方案應運而生,其致力於在微服務架構下提供高性能和簡單易用的分布式事務服務。
官方網址:https://seata.io/zh-cn/index.html
GitHub: https://github.com/seata/seata
願景和誕生的鳥巢
-
微服務架構下,易用、高效的分布式事務解決方案。
-
技術積累
- 內部產品:TXC、XTS
- 商業化產品:GTS、DTS
-
願景:像使用本地事務一樣使用分布式事務,提供一站式的分布式事務解決方案
特性
- 微服務框架支持:目前已支持 Dubbo、Spring Cloud、Sofa-RPC、Motan 和 grpc 等RPC框架,其他框架持續集成中。
- 高可用: 支持基於數據庫存儲的集群模式,水平擴展能力強。
- 高可擴展性: 支持各類配置中心、注冊中心、序列化、存儲、協議序列化、負載均衡等SPI擴展。
- AT自動補償模式: 提供無侵入自動補償的事務模式,目前已支持MySQL、Oracle的自動補償模式、PostgreSQL、H2開發中。
- TCC模式: 支持用戶使用TCC靈活擴展事務。
- Saga模式:提供長事務和服務編排解決方案。
框架角色
- TC (Transaction Coordinator) - 事務協調者:維護全局和分支事務的狀態,驅動全局事務提交或回滾。
- TM (Transaction Manager) - 事務管理器:定義全局事務的范圍,開始全局事務、提交或回滾全局事務。
- RM ( Resource Manager ) - 資源管理器:管理分支事務處理的資源( Resource ),與 TC 交談以注冊分支事務和報告分支事務的狀態,並驅動分支事務提交或回滾。
其中,TC 為單獨部署的 Server 服務端,TM 和 RM 為嵌入到應用中的 Client 客戶端。
生命周期
-
TM 請求 TC 開啟一個全局事務。TC 會生成一個 XID 作為該全局事務的編號。
XID,會在微服務的調用鏈路中傳播,保證將多個微服務的子事務關聯在一起。
-
RM 請求 TC 將本地事務注冊為全局事務的分支事務,通過全局事務的 XID 進行關聯。
-
TM 請求 TC 告訴 XID 對應的全局事務是進行提交還是回滾。
-
TC 驅動 RM 們將 XID 對應的自己的本地事務進行提交還是回滾。
安裝部署
docker-compose(推薦)
官方文檔地址:https://seata.io/zh-cn/docs/ops/deploy-by-docker.html
-
新建一個文件夾:
/docker-compose/seata
-
創建文件: docker-compose.yaml
version: "3" services: seata-server: image: seataio/seata-server hostname: seata-server ports: - "8091:8091" environment: - SEATA_PORT=8091 - STORE_MODE=file
-
在文件同一級, 運行命令:
docker-compose up -d
。-d
是讓seata在后台運行,如果你想看到各服務的注冊和移除情況,可以不用。
直接部署
- 在RELEASE頁面下載相應版本並解壓
- 直接啟動
在 Linux/Mac 下
$ sh ./bin/seata-server.sh
在 Windows 下
bin\seata-server.bat
支持的啟動參數
參數 | 全寫 | 作用 | 備注 |
---|---|---|---|
-h | --host | 指定在注冊中心注冊的 IP | 不指定時獲取當前的 IP,外部訪問部署在雲環境和容器中的 server 建議指定 |
-p | --port | 指定 server 啟動的端口 | 默認為 8091 |
-m | --storeMode | 事務日志存儲方式 | 支持file ,db ,redis ,默認為 file 注:redis需seata-server 1.3版本及以上 |
-n | --serverNode | 用於指定seata-server節點ID | 如 1 ,2 ,3 ..., 默認為 1 |
-e | --seataEnv | 指定 seata-server 運行環境 | 如 dev , test 等, 服務啟動時會使用 registry-dev.conf 這樣的配置 |
如:
$ sh ./bin/seata-server.sh -p 8091 -h 127.0.0.1 -m file
下一章將給大家介紹基於Dubbo + Seata的分布式事務 --- AT模式的實戰案例,敬請期待!