分布式事务解决方案:Eureka集群+Seata集群

项目场景:

我发现:公司项目中有个业务逻辑会有用到feign调用去修改员工数据,然而可能遇到超时的情况,从而导致脏数据的出现。基于公司采用的是eureka集群,所以就萌生了想要搭建《eureka集群+seata集群》的想法


环境准备:

在官网请务必核对版本对应关系
我的配置版本如下:
spring-boot :2.1.6.RELEASE
spring-cloud :Greenwich.SR2
spring-cloud-alibaba : 2.1.2.RELEASE
seata :1.3.0

<dependency>
	<groupId>com.alibaba.cloud</groupId>
	<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
	<version>2.1.2.RELEASE</version>
	<exclusions>
		<exclusion>
			<groupId>io.seata</groupId>
			<artifactId>seata-spring-boot-starter</artifactId>
		</exclusion>
	</exclusions>
</dependency>
<dependency>
	<groupId>io.seata</groupId>
	<artifactId>seata-spring-boot-starter</artifactId>
	<version>1.3.0</version>
</dependency>
  • eureka集群 + Seata集群:

在这里插入图片描述


逐步解析:

  • 下载 Seata - 1.3.0版本
  • 解压得到如下目录
.
├──bin
	├──seata-server.bat
	├──seata-server.sh
├──conf
	├──file.conf (需修改配置)
	├──file.conf.example (可参考实例)
	├──registry.conf (需修改配置)
├──lib
└──log
  • 修改<file.conf>配置信息(只展示我修改过的地方)
store {
  ## store mode: file、db、redis
  mode = "db"
  
  ## database store property
  db {
    ## the implement of javax.sql.DataSource, such as DruidDataSource(druid)/BasicDataSource(dbcp)/HikariDataSource(hikari) etc.
    datasource = "dbcp"
    ## mysql/oracle/postgresql/h2/oceanbase etc.
    dbType = "mysql"
    ## driverClassName = "com.mysql.jdbc.Driver"
    driverClassName = "com.mysql.cj.jdbc.Driver"
    url = "jdbc:mysql://127.0.0.1:3306/seata?useAffectedRows=true&serverTimezone=UTC&characterEncoding=utf-8"
    user = "root"
    password = "root"
    minConn = 5
    maxConn = 100
    globalTable = "global_table"
    branchTable = "branch_table"
    lockTable = "lock_table"
    queryLimit = 100
    maxWait = 5000
  }
}

mode = "db"模式下时,参考官方新建这几个表:global_table,branch_table,lock_table
(undo_log 其实不用加,当时复制粘贴比较快)
在这里插入图片描述

  • 修改<registry.conf>配置信息(只展示我修改过的地方,其他的默认)
registry {
  # file 、nacos 、eureka、redis、zk、consul、etcd3、sofa
  type = "eureka"
  loadBalance = "RandomLoadBalance"
  loadBalanceVirtualNodes = 10
  
  eureka {
    # serviceUrl = "http://127.0.0.1:8889/eureka"
	serviceUrl = "http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/"
    application = "seata-server"
    weight = "1"
  }
} 
  • 启动Eureka集群,并启动Seata集群(注:另一台Seata配置也一样,不是同一台机器的话就需要稍修改连接 db:url)

  • yml文件来配置每个业务模块的Seata信息(不同之处我都注释起来了,请悉知

spring:
    application:
        # name: account-server
        # name: order-server
        name: storage-server
server:
    # port: 8180
    # port: 8182
    port: 8183
eureka:
    instance:
        hostname: localhost
        prefer-ip-address: true
    client:
        serviceUrl:
            defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
seata:
    enabled: true
    application-id: ${spring.application.name}
    tx-service-group: my_test_tx_group_yjy
    service:
        vgroup-mapping:
            my_test_tx_group_yjy: seata-server # 找到seata集群中名为"seata-server"的application
    registry:
        type: eureka # 注册中心为eureka
        eureka:
            application: ${spring.application.name}
            service-url: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
  • 注意修改 C:\Windows\System32\drivers\etc\hosts 文件
    在这里插入图片描述

  • 每个业务模块对应的数据库也需要加上 undo_log 表

  • 启动类加上 @EnableAutoDataSourceProxy 注解用来自动开启数据源代理,可参考官方文档

  • 在业务层加上 @GlobalTransactional (注:该全局事务注解范围必须 >= @Transactional本地事务注解)

  • 运行测试效果

  • 项目源码>>(https://gitee.com/oksir/springcloud-eureka-feign-mybatis-seata-master


总结:

其实我在项目运行中,也遇到了一些小问题,由于时间比较紧,就来不及记录了。
可以看到,SeaTa - AT的本质都是基于undo_log的交易补偿,当然这也是AT模式的特点吧,这些复杂性其实也并不是seata本身造成的,而是微服务的拆分带来的系统架构的复杂性。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
EurekaSeata分别是服务发现和分布式事务解决方案,它们可以结合使用,提高微服务架构的可靠性和稳定性。下面是它们的集群搭建步骤: 1. Eureka集群搭建 - 部署多个Eureka Server实例,每个实例都需要配置相同的应用名称(application.name)和注册中心地址(eureka.client.service-url.defaultZone),以实现服务注册和发现的高可用。 - 配置Eureka Server实例之间的相互注册,每个Eureka Server实例都需要配置其他Eureka Server实例的地址(eureka.client.service-url.defaultZone),这样它们才能相互发现和注册服务。 - 可以通过配置负载均衡器(如Nginx)来实现Eureka Server集群的负载均衡和高可用。 2. Seata集群搭建 - 部署多个Seata Server实例,每个实例都需要配置相同的注册中心地址(registry.type)和事务组名称(tx-service-group),以实现分布式事务的高可用。 - 配置Seata Server实例之间的相互注册,每个Seata Server实例都需要配置其他Seata Server实例的地址(registry.address),这样它们才能相互发现和协调分布式事务。 - 可以通过配置负载均衡器(如Nginx)来实现Seata Server集群的负载均衡和高可用。 需要注意的是,EurekaSeata集群搭建都需要考虑到高可用和负载均衡的问题,具体实现可以根据实际情况选择不同的方案。同时,集群搭建也需要注意配置的正确性和安全性,避免出现故障或安全问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值