Seata 整合 Nacos 2.x

序言

Seata 服务器与传统服务器的使用方式不太一样,首先 Seata 服务器端先向注册中心(可以是 Nacos、Eureka、Etcd3、Consul、Zookeeper 等注册中心)注册。注册成功之后,客户端采用相同的配置去注册中心寻找 Seata 服务,从而实现 Java 客户端连接 Seata 服务器端。这与微服务注册服务拉取服务的思维方式相同。

一、配置 Seata-Server

  1. 下载 seata-server-2.0.0 并解压到一个指定位置

  2. 进入 seata/script/config-center 目录找到 config.txt 文件配置 nacos 的脚本

    #Transaction storage configuration, only for the server. The file, db, and redis configuration values are optional.
    # 因为我们使用的是数据库的方式,所以这里要改成 db
    store.mode=db
    store.lock.mode=file
    store.session.mode=file
    #Used for password encryption
    store.publicKey=
    
    #These configurations are required if the `store mode` is `db`. If `store.mode,store.lock.mode,store.session.mode` are not equal to `db`, you can remove the configuration block.
    store.db.datasource=druid
    store.db.dbType=mysql
    store.db.driverClassName=com.mysql.jdbc.Driver
    store.db.url=jdbc:mysql://localhost:3306/seata?useUnicode=true&rewriteBatchedStatements=true
    store.db.user=username
    store.db.password=password
    store.db.minConn=5
    store.db.maxConn=30
    store.db.globalTable=global_table
    store.db.branchTable=branch_table
    store.db.distributedLockTable=distributed_lock
    store.db.queryLimit=100
    store.db.lockTable=lock_table
    store.db.maxWait=5000
    
    #Transaction routing rules configuration, only for the client
    # 这行很重要影响到客户端,如果不知道就是用默认配置
    service.vgroupMapping.default_tx_group=default
    
  3. 创建对应的数据库,可根据自身情况进行选择

  4. 进入 seata/script/server/db 找到对应的数据库脚本,初始化数据库

  5. 进入 seata/conf 目录找到 application.yml 文件,进行如下配置

    seata:
      config:
        # support: nacos, consul, apollo, zk, etcd3
        type: nacos
        nacos:
          server-addr: 127.0.0.1:8848
          # 该命令空间,是 Nacos 注册中心已经存在的哟
          namespace: 28d63531-feeb-4692-8b5e-f2b2d684b9e3
          group: SEATA_GROUP
          username: nacos
          password: nacos
    
      registry:
        # support: nacos, eureka, redis, zk, consul, etcd3, sofa
        type: nacos
        nacos:
          application: seata-server
          server-addr: 127.0.0.1:8848
          group: SEATA_GROUP
          # 该命令空间,是 Nacos 注册中心已经存在的哟
          namespace: 28d63531-feeb-4692-8b5e-f2b2d684b9e3
          cluster: default
          username: nacos
          password: nacos
    
  6. 确保 Nacos 服务器已经启动,然后进入 seata/script/config-center/nacos 目录执行以下脚本(该脚本是向 nacos 配置中心注册 seata 所需的一些配置)

    # 如果使用的是 linux 直接执行即可,如果使用的是 windows ,可使用 git-bash 终端执行该命令
    # -h nacos ip 主机
    # -p nacos 所在端口
    # -g group 与上面配置保持一致
    # -t namespace 与上面配置保持一致
    sh nacos-config.sh -h localhost -p 8848 -g SEATA_GROUP -t ded91f4b-04df-4c19-8006-755505a27c5e
    
    # 如果 windows 中安装了 python 也可使用 python 代替 bash 命令
    
  7. 进入 seata/bin 目录找到对应的操作系统脚本执行,运行 seata 服务器(在这之前需保证 nacos 服务器已经启动)

    # windows 操作系统
    ./seata-server.bat
    
    # linux 操作系统
    sh seata-server.sh
    

二、配置 Seata-Java 客户端

  1. 引入对应依赖

    <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>2.7.6</version>
    </parent>
    
    <dependencyManagement>
      <dependencies>
        <dependency>
          <groupId>com.alibaba.cloud</groupId>
          <artifactId>spring-cloud-alibaba-dependencies</artifactId>
          <version>2021.0.5.0</version>
          <type>pom</type>
          <scope>import</scope>
        </dependency>
      </dependencies>
    </dependencyManagement>
    
    <dependencies>
      <!--seata starter-->
      <dependency>
        <groupId>io.seata</groupId>
        <artifactId>seata-spring-boot-starter</artifactId>
        <version>2.0.0</version>
      </dependency>
    
      <!--dubbo starter-->
      <dependency>
        <groupId>org.apache.dubbo</groupId>
        <artifactId>dubbo-spring-boot-starter</artifactId>
        <version>3.2.10</version>
      </dependency>
    
      <!--注册中心-->
      <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
      </dependency>
    
      <!--配置中心-->
      <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
      </dependency>
    </dependencies>
    
  2. application.yml 配置文件配置对应信息

    # 微服务&注册中心&配置中心
    spring:
      application:
        # 获取 pom 文件中的项目名称
        name: @project.artifactId@
      cloud:
        nacos:
          discovery:
            server-addr: 127.0.0.1:8848
            password: nacos
            username: nacos
          config:
            server-addr: ${spring.cloud.nacos.discovery.server-addr}
      config:
        import:
          - optional:nacos:test.yml
    
    # 服务器端口配置    
    server:
      port: 8081
      
    # dubbo 配置  
    dubbo:
      application:
        name: @project.artifactId@
        qos-enable: true
        qos-port: 3333
      protocol:
        name: dubbo
        port: -1
      registry:
        address: nacos://localhost:8848
        use-as-metadata-center: false
        use-as-config-center: false
    
    # seata 配置
    # 以下配置一个都不能少,可以先完全按照这个配置来,之后测试没问题之后可根据需求增删
    seata:
    	# 在 seata/script/config-center/config.txt 文件中有一个 
    	# service.vgroupMapping.default_tx_group=default 配置,需要和此处保持一致
      tx-service-group: default_tx_group
      service:
        vgroup-mapping:
          default_tx_group: SH
      registry:
        type: nacos
        nacos:
          server-addr: ${spring.cloud.nacos.discovery.server-addr}
          # 命令空间需要与之前的服务器端,以及 nacos 的命令空间三者保持一致
          namespace: 28d63531-feeb-4692-8b5e-f2b2d684b9e3
          # 注册到注册中心的微服务名称
          application: seata-server
          group: SEATA_GROUP
          # 如果 nacos 不存在用户密码,可以没有下面两项配置
          username: nacos
          password: nacos
      config:
        type: nacos
        nacos:
          server-addr: ${spring.cloud.nacos.discovery.server-addr}
          namespace: ${seata.registry.nacos.namespace}
          group: SEATA_GROUP
        disable-global-transaction: false
      client:
        rm:
          report-success-enable: true
    
  3. seata 客户端默认采用的是 AT 模式,需要在对应的数据库初始化 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;
    

如果存在多个微服务,每个微服务所使用的数据库都需要有 undo_log 表

三、使用案例

	/**
	* 以下示例需要对应的服务以及数据库都配置好才行哟
	*/
	@Service
	public class OrderServiceImpl implements OrderService {
	
	    // 引入下游服务
	    @DubboReference
	    private UserService userService;
	
	    @Resource
	    private OrderMapper orderMapper;
	
	    @Override
	    // 使用该注解开启全局事务
	    @GlobalTransactional(rollbackFor = Exception.class)
	    public void addOrder() {
	        
	        // 添加订单
	        orderMapper.save(order);
	        // 查询用户
	        userService.queryOne();
	    }
	}

四、FAQ

  1. seata 有多种模式,默认 AT 模式,如需使用相应模式,请参考官网各模式的使用案例
  2. seata 服务端与客户端的配置请先完全按照上述的配置内容来。当启动测试都无误后,可自行根据需求进行增删配置,以免发生不可预测的问题
  3. 限于篇幅,上面有些配置项如果不太清楚,可以寻求搜索引擎的帮助去了解哦
  • 25
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值