【Spring Cloud 整合Nacos和Seata实现分布式事务】
Spring Cloud 整合Nacos和Seata实现分布式事务
- 缘起
- 技术及组件
- 基础服务组件安装
- nacos安装
- seata安装
- spring Cloud相关
- 微服务划分
- 测试
缘起
从网上下载的艿艿的整合的Spring Cloud 整合Nacos和Seata实现分布式事务代码,但是因为版本与现在的不统一,导致一直都没测试成功。现在记录下来,方便后面查看。
技术及组件
- spring cloud
- spring boot
- nacos 2.5.1
- seata 2.4.0
基础服务组件安装
nacos安装
- 从网上下载安装包。参考官网https://nacos.io/ 我这里使用的是 2.5.1
- 执行数据库脚本。
- 修改application.properties配置文件。
spring.sql.init.platform=mysql
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=Asia/Shanghai
db.user.0=root
db.password.0=root
nacos.core.auth.system.type=nacos
nacos.core.auth.enabled=true
nacos.core.auth.server.identity.key=nacos
nacos.core.auth.server.identity.value=nacos
nacos.core.auth.plugin.nacos.token.cache.enable=false
nacos.core.auth.plugin.nacos.token.expire.seconds=18000
### The default token (Base64 String):
nacos.core.auth.plugin.nacos.token.secret.key=SecretKey0123456789012345678901234567890123456789
- 修改cluster.conf配置文件,这里是配置集群的ip地址列表,因为只有一台,这里就配置本地ip+8848端口号。
192.168.1.115:8848
- 启动nacos startup.cmd

- 配置中心新增配置:seataServer.properties
# Seata Server 配置
store.mode=db
store.db.datasource=druid
store.db.db-type=mysql
store.db.driver-class-name=com.mysql.cj.jdbc.Driver
store.db.url=jdbc:mysql://127.0.0.1:3306/seata
store.db.user=root
store.db.password=root
service.vgroupMapping.order-service-group=default
service.vgroupMapping.default_tx_group=default


seata安装
-
从网上下载安装包。参考官网https://seata.apache.org/zh-cn/ 我这里使用的是 2.4.0(2.5.0本地一直报错,所以用了2.4.0)
-
执行数据库脚本。
-
mysql包添加。我本地mysql是8.0的。需要copy个包到lib下。

-
修改application.yml(D:\servers\apache-seata-2.4.0-incubating-bin\seata-server\conf)配置文件
server:port: 7091
spring:application:name: seata-server
logging:level:io.seata: debug config: classpath:logback-spring.xmlfile:path: ${log.home:${user.home}/logs/seata}extend:logstash-appender:# off by defaultenabled: falsedestination: 127.0.0.1:4560kafka-appender:# off by defaultenabled: falsebootstrap-servers: 127.0.0.1:9092topic: logback_to_logstashproducer:acks: 0linger-ms: 1000max-block-ms: 0metric-appender:# off by defaultenabled: false
seata:config:type: nacosnacos:server-addr: 127.0.0.11:8848namespace: ''#group: SEATA_GROUPcontext-path:username: 'nacos'password: 'nacos'data-id: seataServer.propertiesregistry:type: nacosnacos:application: seata-serverserver-addr: 127.0.0.1:8848username: nacospassword: nacosnamespace: cluster: default # 集群名称group: SEATA_GROUPstore:# 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?rewriteBatchedStatements=trueuser: rootpassword: rootmin-conn: 10max-conn: 100global-table: global_tablebranch-table: branch_tablelock-table: lock_tabledistributed-lock-table: distributed_lockvgroup-table: vgroup_tablequery-limit: 1000max-wait: 5000druid:time-between-eviction-runs-millis: 120000min-evictable-idle-time-millis: 300000test-while-idle: truetest-on-borrow: falsekeep-alive: falsehikari:idle-timeout: 600000keepalive-time: 120000max-lifetime: 1800000validation-timeout: 5000dbcp:time-between-eviction-runs-millis: 120000min-evictable-idle-time-millis: 300000test-while-idle: truetest-on-borrow: false
- seata启动

spring Cloud相关
项目源代码参考:
微服务划分
- 订单服务 order service 源地址
- 商品服务 product service 源地址
- 账户服务 account service 源地址
- 原项目代码中用的spring boot cloud,nacos,seata版本比较老。需要替换一下。 这里以order-service服务的pom.xml作为示例:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>labx-17-sc-seata-at-feign-demo</artifactId><groupId>cn.iocoder.springboot.labs</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>labx-17-sc-seata-at-feign-demo-order-service</artifactId><properties><maven.compiler.target>1.8</maven.compiler.target><maven.compiler.source>1.8</maven.compiler.source><spring.boot.version>2.4.0</spring.boot.version><spring.cloud.version>2020.0.0</spring.cloud.version><spring.cloud.alibaba.version>2021.1</spring.cloud.alibaba.version></properties><!--引入 Spring Boot、Spring Cloud、Spring Cloud Alibaba 三者 BOM 文件,进行依赖版本的管理,防止不兼容。在 https://dwz.cn/mcLIfNKt 文章中,Spring Cloud Alibaba 开发团队推荐了三者的依赖关系--><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>${spring.boot.version}</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring.cloud.version}</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring.cloud.alibaba.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><dependencies><!-- 实现对 Spring MVC 的自动化配置 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- 实现对数据库连接池的自动化配置 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency> <!-- 本示例,我们使用 MySQL --><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.48</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.10</version></dependency><!-- 实现对 MyBatis 的自动化配置 --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.2</version></dependency><!-- 引入 Spring Cloud Alibaba Seata 相关依赖,使用 Seata 实现分布式事务,并实现对其的自动配置 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-seata</artifactId><version>2021.1</version></dependency><dependency> <!-- 主要想使用 seata 1.1.0 版本 --><groupId>io.seata</groupId><artifactId>seata-spring-boot-starter</artifactId><version>1.5.2</version></dependency><!-- 引入 Spring Cloud Alibaba Nacos Discovery 相关依赖,将 Nacos 作为注册中心,并实现对其的自动配置 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId><version>2021.1</version></dependency><!-- 引入 Spring Cloud OpenFeign 相关依赖,使用 OpenFeign 提供声明式调用,并实现对其的自动配置 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency></dependencies></project>
- 修改application.yaml文件
server:port: 8081 # 端口spring:application:name: order-servicedatasource:url: jdbc:mysql://127.0.0.1:3306/seata_order?useSSL=false&useUnicode=true&characterEncoding=UTF-8driver-class-name: com.mysql.jdbc.Driverusername: rootpassword: rootcloud:# Nacos 作为注册中心的配置项nacos:discovery:server-addr: 127.0.0.1:8848username: nacospassword: nacos
# group: SEATA_GROUP# Seata 配置项,对应 SeataProperties 类
seata:application-id: ${spring.application.name} # Seata 应用编号,默认为 ${spring.application.name}tx-service-group: default_tx_group #order-service-group # Seata 事务组编号,用于 TC 集群名# Seata 服务配置项,对应 ServiceProperties 类service:# 虚拟组和分组的映射vgroup-mapping:default_tx_group: default# Seata 注册中心配置项,对应 RegistryProperties 类registry:type: nacos # 注册中心类型,默认为 filenacos:serverAddr: 127.0.0.1:8848 # Nacos 服务地址application: seata-servernamespace: ""username: nacospassword: nacosgroup: SEATA_GROUPcluster: default # 使用的 Seata 分组
# namespace: # Nacos 命名空间
- 其他服务也参考这两个配置文件启动一下。
测试
在浏览器地址栏输入测试地址
http://localhost:8081/order/create?userId=1&productId=1&price=2
页面返回内容

订单服务日志打印情况:

账号服务日志打印:

产品服务日志打印:

