您好,登錄后才能下訂單哦!
基于Seata中間件如何分析微服務模式下事務管理,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
Seata是一款開源的分布式事務解決方案,致力于提供高性能和簡單易用的分布式事務服務。Seata將為用戶提供了AT、TCC、SAGA、XA事務模式,為用戶打造一站式的分布式解決方案。
AT 模式
基于支持本地 ACID 事務的關系型數據庫。
Java應用,通過 JDBC 訪問數據庫。
一階段:業務數據和回滾日志記錄在同一個本地事務中提交,釋放本地鎖和連接資源。
二階段:提交異步化,非常快速地完成。回滾通過一階段的回滾日志進行反向補償。
TCC模式
一個分布式的全局事務,整體是兩階段提交的模型,全局事務是由若干分支事務組成的,分支事務要滿足兩階段提交的模型要求,即需要每個分支事務都具備自己的:
一階段 prepare 行為
二階段 commit 或 rollback 行為
Saga模式
Saga模式是SEATA提供的長事務解決方案,在Saga模式中,業務流程中每個參與者都提交本地事務,當出現某一個參與者失敗則補償前面已經成功的參與者,一階段正向服務和二階段補償服務都由業務開發實現。
XA模式
XA是一個分布式事務協議,對業務無侵入的分布式事務解決方案,XA提交協議需要事務參與者的數據庫支持,XA事務具有強一致性,在兩階段提交的整個過程中,一直會持有資源的鎖,性能不理想的缺點很明顯。
1.2版本:seata-server-1.2.0.zip
解壓目錄
bin:存放服務端運行啟動腳本;
lib:存放服務端依賴的資源jar包;
conf:配置文件目錄。
file.conf配置
mode:db 即使用數據庫存儲事務信息,這里還可以選擇file存儲方式。
file模式為單機模式,全局事務會話信息內存中讀寫并持久化本地文件root.data,性能較高;
db模式為高可用模式,全局事務會話信息通過db共享,相應性能差些;
redis模式Seata-Server 1.3及以上版本支持,性能較高,存在事務信息丟失風險,請提前配置合適當前場景的redis持久化配置.
store { ## store mode: file、db mode = "db" db { datasource = "druid" dbType = "mysql" driverClassName = "com.mysql.jdbc.Driver" url = "jdbc:mysql://127.0.0.1:3306/seata_server" user = "root" password = "123456" minConn = 5 maxConn = 30 globalTable = "global_table" branchTable = "branch_table" lockTable = "lock_table" queryLimit = 100 maxWait = 5000 } }
registry.conf配置
這里選擇eureka作為注冊中心,seata-server也要作為一個服務添加到注冊中心,不使用配置中心所以config配置默認即可。
registry { # file 、nacos 、eureka、redis、zk、consul、etcd3、sofa type = "eureka" eureka { serviceUrl = "http://localhost:8761/eureka" application = "default" weight = "1" } }
需要在seata-server即上述配置的MySQL庫中建立3張事務管理表:
全局事務:global_table
分支事務:branch_table
全局鎖:lock_table
事務回滾:undo_log
SQL腳本:mysql-script目錄
Linux環境:sh seata-server.sh
seata-eureka:注冊中心
seata-order:訂單服務
seata-account:賬戶服務
seata-inventor:庫存服務
seata-client:客戶端服務
account-feign:賬戶Feign接口
inventory-feign:庫存Feign接口
order-feign:訂單Feign接口
請求鏈路:客戶端->訂單->賬戶+庫存,測試整個流程的分布式事務問題。
seata_server:seata組件服務端依賴庫
seata_account:模擬賬戶數據庫
seata_inventor:模擬庫存數據庫
seata_order:模擬訂單數據庫
各個庫腳本位置:mysql-script/data-biz.sql
依次啟動:注冊中心,庫存服務,賬戶服務,訂單服務,客戶端服務;
Eureka服務列表如下:
幾個基礎服務的配置方式一樣。
conf配置
file.conf重點關注下面內容,事務組的名稱,需要在yml文件中使用。
my_test_tx_group = "default"
registry.conf:是注冊中心的選擇。
注意這里的事務組名稱配置。
spring: # 事務組的名稱 cloud: alibaba: seata: tx-service-group: my_test_tx_group # 數據源配置 datasource: type: com.alibaba.druid.pool.DruidDataSource druid: driverClassName: com.mysql.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/seata_account username: root password: 123456
將數據庫整體由Seata進行代理管理,核心API:DataSourceProxy。
@Configuration public class SeataAccountConfig { @Value("${spring.application.name}") private String applicationName; @Bean public GlobalTransactionScanner globalTransactionScanner() { return new GlobalTransactionScanner(applicationName, "test-tx-group"); } @Bean @ConfigurationProperties(prefix = "spring.datasource.druid") public DruidDataSource druidDataSource() { return new DruidDataSource() ; } @Primary @Bean("dataSource") public DataSourceProxy dataSourceProxy(DataSource druidDataSource) { return new DataSourceProxy(druidDataSource); } @Bean public SqlSessionFactory sqlSessionFactory(DataSourceProxy dataSourceProxy)throws Exception{ SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); sqlSessionFactoryBean.setDataSource(dataSourceProxy); sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver() .getResources("classpath*:/mapper/*.xml")); sqlSessionFactoryBean.setTransactionFactory(new SpringManagedTransactionFactory()); return sqlSessionFactoryBean.getObject(); } }
核心注解:GlobalTransactional,管理整體的分布式事務。
@Service public class OrderServiceImpl implements OrderService { private final Logger LOGGER = LoggerFactory.getLogger(OrderServiceImpl.class); @Resource private OrderMapper orderMapper ; @Resource private AccountFeign accountFeign ; @Resource private InventoryFeign inventoryFeign ; @GlobalTransactional @Override public Integer createOrder(String orderNo) { LOGGER.info("Order 生成中 "+orderNo); // 本服務下訂單庫 Integer insertFlag = orderMapper.insert(orderNo) ; // 基于feign接口處理賬戶和庫存 accountFeign.updateAccount(10L) ; inventoryFeign.updateInventory(10) ; return insertFlag ; } }
測試流程:在任意服務下拋出異常,觀察整體的事務狀態,觀察是否有整體的事務控制效果。
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。