1. 程式人生 > >微服務開發的最大痛點-分散式事務SEATA入門簡介

微服務開發的最大痛點-分散式事務SEATA入門簡介

![](https://james-1258744956.cos.ap-shanghai.myqcloud.com/%E5%BE%AE%E6%9C%8D%E5%8A%A1%E6%9C%80%E5%A4%A7%E7%9A%84%E5%BC%80%E5%8F%91%E7%97%9B%E7%82%B9-%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1SEATA%E5%85%A5%E9%97%A8%E7%AE%80%E4%BB%8B/Longan.jpg) ## 前言 在微服務開發中,存在諸多的開發痛點,例如分散式事務、全鏈路跟蹤、限流降級和服務平滑上下線等。而在這其中,分散式事務是最讓開發者頭痛的。那分散式事務是什麼呢? ![](https://james-1258744956.cos.ap-shanghai.myqcloud.com/%E5%BE%AE%E6%9C%8D%E5%8A%A1%E6%9C%80%E5%A4%A7%E7%9A%84%E5%BC%80%E5%8F%91%E7%97%9B%E7%82%B9-%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1SEATA%E5%85%A5%E9%97%A8%E7%AE%80%E4%BB%8B/%E5%BE%AE%E6%9C%8D%E5%8A%A1%E5%BC%80%E5%8F%91%E7%97%9B%E7%82%B9.png) 分散式事務就是指事務的參與者、支援事務的伺服器、資源伺服器以及事務管理器分別位於不同的分散式系統的不同節點之上。簡單的說,就是一次大的操作由不同的小操作組成,這些小的操作分佈在不同的伺服器上,且屬於不同的應用,**分散式事務需要保證這些小操作要麼全部成功,要麼全部失敗。本質上來說,分散式事務就是為了保證不同資料庫的資料一致性**。或者,在換一句話說,分散式事務 = n 個本地事務。通過事務管理器,達到 n 個本地事務要麼全部成功,要麼全部失敗。 ## SEATA應運而生 那有什麼方案解決上述的這些難點和痛點呢? SEATA作為一款開源的分散式事務解決方案應運而生,其致力於在微服務架構下提供高效能和簡單易用的分散式事務服務。 官方網址:https://seata.io/zh-cn/index.html GitHub: https://github.com/seata/seata ### 願景和誕生的鳥巢 - 微服務架構下,易用、高效的分散式事務解決方案。 - 技術積累 - 內部產品:TXC、XTS - 商業化產品:GTS、DTS - 願景:像使用本地事務一樣使用分散式事務,提供一站式的分散式事務解決方案 ### 特性 1. **微服務框架支援**:目前已支援 Dubbo、Spring Cloud、Sofa-RPC、Motan 和 grpc 等RPC框架,其他框架持續整合中。 2. **高可用**: 支援基於資料庫儲存的叢集模式,水平擴充套件能力強。 3. **高可擴充套件性**: 支援各類配置中心、註冊中心、序列化、儲存、協議序列化、負載均衡等SPI擴充套件。 4. **AT自動補償模式**: 提供無侵入自動補償的事務模式,目前已支援MySQL、Oracle的自動補償模式、PostgreSQL、H2開發中。 5. **TCC模式**: 支援使用者使用TCC靈活擴充套件事務。 6. **Saga模式**:提供長事務河服務編排解決方案。 ### 框架角色 ![](https://james-1258744956.cos.ap-shanghai.myqcloud.com/%E5%BE%AE%E6%9C%8D%E5%8A%A1%E6%9C%80%E5%A4%A7%E7%9A%84%E5%BC%80%E5%8F%91%E7%97%9B%E7%82%B9-%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1SEATA%E5%85%A5%E9%97%A8%E7%AE%80%E4%BB%8B/seata-role.png?imageMogr2/thumbnail/!60p) - **TC** (Transaction Coordinator) - 事務協調者:維護全域性和分支事務的狀態,驅動**全域性事務**提交或回滾。 - **TM** (Transaction Manager) - 事務管理器:定義**全域性事務**的範圍,開始全域性事務、提交或回滾全域性事務。 - **RM** ( Resource Manager ) - 資源管理器:管理**分支事務**處理的資源( Resource ),與 TC 交談以註冊分支事務和報告分支事務的狀態,並驅動**分支事務**提交或回滾。 其中,TC 為單獨部署的 **Server** 服務端,TM 和 RM 為嵌入到應用中的 **Client** 客戶端。 ### 生命週期 ![](https://james-1258744956.cos.ap-shanghai.myqcloud.com/%E5%BE%AE%E6%9C%8D%E5%8A%A1%E6%9C%80%E5%A4%A7%E7%9A%84%E5%BC%80%E5%8F%91%E7%97%9B%E7%82%B9-%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1SEATA%E5%85%A5%E9%97%A8%E7%AE%80%E4%BB%8B/seata-cycle.png) - 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 1. 新建一個資料夾: `/docker-compose/seata` 2. 建立檔案: **docker-compose.yaml** ```yaml version: "3" services: seata-server: image: seataio/seata-server hostname: seata-server ports: - "8091:8091" environment: - SEATA_PORT=8091 - STORE_MODE=file ``` 3. 在檔案同一級, 執行命令: `docker-compose up -d`。 `-d`是讓seata在後臺執行,如果你想看到各服務的註冊和移除情況,可以不用。 ### 直接部署 > 官方文件地址: https://seata.io/zh-cn/docs/ops/deploy-server.html 1. 在[RELEASE](https://github.com/seata/seata/releases)頁面下載相應版本並解壓 2. 直接啟動 在 Linux/Mac 下 ```bash $ sh ./bin/seata-server.sh ``` 在 Windows 下 ```cmd 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` 這樣的配置 | 如: ```bash $ sh ./bin/seata-server.sh -p 8091 -h 127.0.0.1 -m file ``` 下一章將給大家介紹**基於Dubbo + Seata的分散式事務 --- AT模式**的實戰案例,敬請期待! ![](https://james-1258744956.cos.ap-shanghai.myqcloud.com/JWT-No-MySQL/%E5%85%AC%E4%BC%97%E5%8F%B7%E4%BF%A1%E6%81%AF.jpg)