缘起

从网上下载的艿艿的整合的Spring Cloud 整合Nacos和Seata实现分布式事务代码,但是因为版本与现在的不统一,导致一直都没测试成功。现在记录下来,方便后面查看。

技术及组件

  • spring cloud
  • spring boot
  • nacos 2.5.1
  • seata 2.4.0

基础服务组件安装

nacos安装

  1. 从网上下载安装包。参考官网https://nacos.io/ 我这里使用的是 2.5.1
  2. 执行数据库脚本。
  3. 修改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
  1. 修改cluster.conf配置文件,这里是配置集群的ip地址列表,因为只有一台,这里就配置本地ip+8848端口号。
192.168.1.115:8848
  1. 启动nacos startup.cmd
    在这里插入图片描述
  2. 配置中心新增配置: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安装

  1. 从网上下载安装包。参考官网https://seata.apache.org/zh-cn/ 我这里使用的是 2.4.0(2.5.0本地一直报错,所以用了2.4.0)

  2. 执行数据库脚本。

  3. mysql包添加。我本地mysql是8.0的。需要copy个包到lib下。
    在这里插入图片描述

  4. 修改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.xml
 file:
   path: ${log.home:${user.home}/logs/seata}
 extend:
   logstash-appender:
     # off by default
     enabled: false
     destination: 127.0.0.1:4560
   kafka-appender:
     # off by default
     enabled: false
     bootstrap-servers: 127.0.0.1:9092
     topic: logback_to_logstash
     producer:
       acks: 0
       linger-ms: 1000
       max-block-ms: 0
   metric-appender:
     # off by default
     enabled: false
seata:
 config:
   type: nacos
   nacos:
     server-addr: 127.0.0.11:8848
     namespace: ''
     #group: SEATA_GROUP
     context-path:
     username: 'nacos'
     password: 'nacos'
     data-id: seataServer.properties
     
 registry:
   type: nacos
   nacos:
     application: seata-server
     server-addr: 127.0.0.1:8848
     username: nacos
     password: nacos
     namespace: 
     cluster: default  # 集群名称
     group: SEATA_GROUP
 store:
   # support: file 、 db 、 redis 、 raft
   mode: db
   session:
     mode: db
   lock:
     mode: db
   db:
     datasource: druid
     db-type: mysql
     driver-class-name: com.mysql.cj.jdbc.Driver
     url: jdbc:mysql://127.0.0.1:3306/seata?rewriteBatchedStatements=true
     user: root
     password: root
     min-conn: 10
     max-conn: 100
     global-table: global_table
     branch-table: branch_table
     lock-table: lock_table
     distributed-lock-table: distributed_lock
     vgroup-table: vgroup_table
     query-limit: 1000
     max-wait: 5000
     druid:
       time-between-eviction-runs-millis: 120000
       min-evictable-idle-time-millis: 300000
       test-while-idle: true
       test-on-borrow: false
       keep-alive: false
     hikari:
       idle-timeout: 600000
       keepalive-time: 120000
       max-lifetime: 1800000
       validation-timeout: 5000
     dbcp:
       time-between-eviction-runs-millis: 120000
       min-evictable-idle-time-millis: 300000
       test-while-idle: true
       test-on-borrow: false    
  1. seata启动
    在这里插入图片描述

spring Cloud相关

项目源代码参考:

微服务划分

  1. 原项目代码中用的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>

  1. 修改application.yaml文件
server:
  port: 8081 # 端口

spring:
  application:
    name: order-service

  datasource:
    url: jdbc:mysql://127.0.0.1:3306/seata_order?useSSL=false&useUnicode=true&characterEncoding=UTF-8
    driver-class-name: com.mysql.jdbc.Driver
    username: root
    password: root

  cloud:
    # Nacos 作为注册中心的配置项
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        username: nacos
        password: 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 # 注册中心类型,默认为 file
    nacos:
      serverAddr: 127.0.0.1:8848 # Nacos 服务地址
      application: seata-server
      namespace: ""
      username: nacos
      password: nacos
      group: SEATA_GROUP
      cluster: default # 使用的 Seata 分组
#      namespace: # Nacos 命名空间

  1. 其他服务也参考这两个配置文件启动一下。

测试

在浏览器地址栏输入测试地址

http://localhost:8081/order/create?userId=1&productId=1&price=2

页面返回内容
在这里插入图片描述

订单服务日志打印情况:
在这里插入图片描述
账号服务日志打印:
在这里插入图片描述
产品服务日志打印:
在这里插入图片描述

Logo

更多推荐