Spring Cloud Alibaba-(1)搭建项目环境
Spring Cloud Alibaba-(2)Nacos【服务注册与发现、配置管理】
Spring Cloud Alibaba-(3)OpenFeign【服务调用】
Spring Cloud Alibaba-(4)Sentinel【流控和降级】
Spring Cloud Alibaba-(5)Seata【分布式事务】
【已解决】使用Seata分布式事务,服务端报错 could not find any implementation for class
1.Seata 官网(https://seata.apache.org/zh-cn/)
2.TC(事务协调者)、TM(事务管理器)、RM(资源管理器)
3.Seata 使用2PC(两阶段提交协议)
3.1 Prepare(预处理阶段):事务协调者给参与者发送Prepare请求,参与者响应。
3.2 Commit(提交阶段):如果所有参与者都响应Yes,则协调者发送Commit请求,让参与者提交事务;否则,协调者发送RollBack请求,让参与者回滚事务。
3.3 优点:
一致性 | 保证了分布式系统中所有参与者的状态一致性 |
原子性 | 确保事务要么全部成功,要么全部失败 |
3.4 不足:
性能开销 | 2PC 需要在提交之前进行多次网络通信,增加了事务处理的时间 |
单点故障 | 协调者是单点故障,如果协调者在提交阶段发生故障,可能导致事务处于不确定状态 |
同步阻塞 | 参与者在准备阶段需要锁定资源,直到事务完成,这可能导致资源长时间锁定,影响系统性能 |
4. AT模式(Auto Transaction)--基于2PC的优化方案
4.1 预处理阶段(Prepare):
在这个阶段,事务中的所有更新操作会被记录为“逆向操作”(Undo Log)和“正向操作”(Redo Log)。
“逆向操作”记录了如何撤销这些更新,以便在事务回滚时使用。
“正向操作”记录了如何完成这些更新,以便在事务提交时使用。
这些操作记录会持久化到本地数据库中,确保即使在系统崩溃的情况下也能恢复。
4.2 提交阶段(Commit):
如果预处理成功,则协调者向所有参与者发送提交指令,参与者根据“正向操作”记录提交事务。
否则,协调者将向所有参与者发送回滚指令,参与者根据“逆向操作”记录回滚事务。
5.下载(Seata-Server版本历史 | Apache Seata)
6.db + nacos 高可用模式启动 Seata 服务端
6.1 创建seata_server数据库,导入mysql.sql
6.2 修改seata配置文件,使用 db+nacos 高可用模式(将application.example.yml 关于nacos、store.db配置复制过来)
# Copyright 1999-2019 Seata.io Group.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.server:port: 7091spring:application:name: seata-serverlogging:config: classpath:logback-spring.xmlfile:path: ${user.home}/logs/seataextend:logstash-appender:destination: 127.0.0.1:4560kafka-appender:bootstrap-servers: 127.0.0.1:9092topic: logback_to_logstashconsole:user:username: seatapassword: seata
seata:config:# support: nacos 、 consul 、 apollo 、 zk 、 etcd3type: nacosnacos:server-addr: 127.0.0.1:8848namespace:group: SEATA_GROUPusername:password:context-path:##if use MSE Nacos with auth, mutex with username/password attribute#access-key:#secret-key:data-id: seataServer.propertiesregistry:# support: nacos, eureka, redis, zk, consul, etcd3, sofatype: nacosnacos:application: seata-serverserver-addr: 127.0.0.1:8848group: SEATA_GROUPnamespace:cluster: defaultusername:password:context-path:##if use MSE Nacos with auth, mutex with username/password attribute#access-key:#secret-key:store:# support: file 、 db 、 redis 、 raftmode: dbsession:mode: dblock:mode: dbdb:datasource: druiddb-type: mysqldriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/seata_server?rewriteBatchedStatements=true&useSSL=falseuser: ***password: ***min-conn: 10max-conn: 100global-table: global_tablebranch-table: branch_tablelock-table: lock_tabledistributed-lock-table: distributed_lockquery-limit: 1000max-wait: 5000
# server:
# service-port: 8091 #If not configured, the default is '${server.port} + 1000'security:secretKey: SeataSecretKey0c382ef121d778043159209298fd40bf3850a017tokenValidityInMilliseconds: 1800000ignore:urls: /,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.jpeg,/**/*.ico,/api/v1/auth/login
6.3 修改配置中心配置
6.4 将配置注册到Nacos
6.5 双击启动 Seata 服务
6.6 访问 http://localhost:7091/
7.项目搭建 Seata 客户端
7.1 涉及Seata分布式事务的服务(订单服务、产品服务),添加Maven依赖
<!-- seata 分布式事务 -->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>
7.2 涉及Seata分布式事务的服务(订单服务、产品服务),数据库都需要添加undo_log表
CREATE TABLE `undo_log` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`branch_id` bigint(20) NOT NULL,`xid` varchar(100) NOT NULL,`context` varchar(128) NOT NULL,`rollback_info` longblob NOT NULL,`log_status` int(11) NOT NULL,`log_created` datetime NOT NULL,`log_modified` datetime NOT NULL,`ext` varchar(100) DEFAULT NULL,PRIMARY KEY (`id`),UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
7.3 涉及Seata分布式事务的服务(订单服务、产品服务),bootstrap.yml 配置 Seata
7.3.1 订单服务 bootstrap.yml 配置 Seata
server:port: 8000spring:profiles:active: publicapplication:name: order-servicedatasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/springcloud2024username: rootpassword: 123456cloud:nacos:discovery:server-addr: http://localhost:8848config:server-addr: http://localhost:8848file-extension: yamlnamespace: publicshared-configs:- data-id: order-service-default.yamlrefresh: true- data-id: order-service-default-test.yamlrefresh: trueopenfeign:httpclient:# 连接超时connection-timeout: 5000sentinel:transport:dashboard: http://localhost:8858datasource:flow-rule:nacos:server-addr: http://localhost:8848data-id: order-service-flow-rulerule-type: flow# Openfeign 整合 sentinel
feign:sentinel:enabled: trueseata:registry:type: nacosnacos:server-addr: http://localhost:8848application: seata-servergroup: SEATA_GROUPconfig:type: nacosnacos:server-addr: http://localhost:8848group: SEATA_GROUPtx-service-group: default_tx_group
7.3.2 产品服务 bootstrap.yml 配置 Seata
server:port: 8400spring:application:name: product-servicedatasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/springcloud2024username: rootpassword: 123456cloud:nacos:discovery:server-addr: http://localhost:8848config:server-addr: http://localhost:8848seata:registry:type: nacosnacos:server-addr: http://localhost:8848application: seata-servergroup: SEATA_GROUPconfig:type: nacosnacos:server-addr: http://localhost:8848group: SEATA_GROUPtx-service-group: default_tx_group