SpringCloud Alibaba - Seata 实现高可用和异地容灾

目录

[一、Seata 高可用和异地容灾](#一、Seata 高可用和异地容灾)

1.1、理论

[1.2、模拟异地容灾 TC 集群](#1.2、模拟异地容灾 TC 集群)

1.2.1、模拟实现两个机房

1.2.2、配置事务组映射

[1.2.3、微服务拂去 nacos 配置](#1.2.3、微服务拂去 nacos 配置)

1.2.4、启动所有微服务


一、Seata 高可用和异地容灾


1.1、理论

Seata 的高可用实现比较简单,只需要把他搭建成一个集群即可,然后将这些服务都注册到 注册中心 nacos 上即可,这样就可以对多个服务进行一个负载均衡.

这里不仅仅要实现高可用,还需要实现异地容灾. 异地容灾就是说,如果你整了好几个节点部署起来,全部放到一个机房里面,那么如果这个机房出了故障,就意味着整个集群就完了,所以对于一个大型的集群来讲,都会把这些服务异地部署.

例如,把一部分服务器部署到上海,另一部分服务器部署到杭州. 这样,即使一个机房出了问题,还有另一个机房可以继续使用,起到了一个容灾的效果.

问题1:如果机房越来越多,那微服务该访问哪个呢?

可以回想一下,在前面的章节中,Seata 的 TC 服务器,我们是注册到 nacos 中,并在代码中配置过 namespace、group、服务名称、cluster映射集群,这样就可以确定对应的集群了.

问题2:如果我们要实现异地容灾,也就说某一个机房挂了,需要快速的切换到另一个可用的机房,但是这个配置在配置文件中写死了,如果要改配置文件,还需要重启服务器,这是我们不希望看到的,怎么办?

在微服务中有一个组件叫 nacos,通过他就可以实现配置的热更新. 我们把这个配置放到 nacos 上,微服务就可以动态监听 nacos,将来一旦进行了修改集群名称,就可以实现动态切换.

1.2、模拟异地容灾 TC 集群

1.2.1、模拟实现两个机房

这里我们计划启动两台 Seata 的 TC 服务节点:

|--------|-----------|------|------|
| 节点名称 | ip地址 | 端口号 | 集群名称 |
| seata | 127.0.0.1 | 8091 | SH |
| seata2 | 127.0.0.1 | 8092 | HZ |

这里需要去官网下载 seata-server 包,Seata | Seata

将 seata-server 解压,复制一份,起名为 seata2.

分别修改 seata 和 seata2 目录下的 conf/registry.conf 文件.

seata 配置内容如下(集群名称:SH):

复制代码
registry {
  # tc服务的注册中心类,这里选择nacos,也可以是eureka、zookeeper等
  type = "nacos"

  nacos {
    # seata tc 服务注册到 nacos的服务名称,可以自定义
    application = "seata-tc-server"
    serverAddr = "127.0.0.1:8848"
    group = "DEFAULT_GROUP"
    namespace = ""
    cluster = "SH"
    username = "nacos"
    password = "nacos"
  }
}

config {
  # 读取tc服务端的配置文件的方式,这里是从nacos配置中心读取,这样如果tc是集群,可以共享配置
  type = "nacos"
  # 配置nacos地址等信息
  nacos {
    serverAddr = "127.0.0.1:8848"
    namespace = ""
    group = "SEATA_GROUP"
    username = "nacos"
    password = "nacos"
    dataId = "seataServer.properties"
  }
}

seata2 配置内容如下(集群名称:HZ):

复制代码
registry {
  # tc服务的注册中心类,这里选择nacos,也可以是eureka、zookeeper等
  type = "nacos"

  nacos {
    # seata tc 服务注册到 nacos的服务名称,可以自定义
    application = "seata-tc-server"
    serverAddr = "127.0.0.1:8848"
    group = "DEFAULT_GROUP"
    namespace = ""
    cluster = "HZ"
    username = "nacos"
    password = "nacos"
  }
}

config {
  # 读取tc服务端的配置文件的方式,这里是从nacos配置中心读取,这样如果tc是集群,可以共享配置
  type = "nacos"
  # 配置nacos地址等信息
  nacos {
    serverAddr = "127.0.0.1:8848"
    namespace = ""
    group = "SEATA_GROUP"
    username = "nacos"
    password = "nacos"
    dataId = "seataServer.properties"
  }
}

进入 seata/bin 目录,运行 seata-server.bat 文件,默认端口为 8091

然后进入 seata2/bin 目录,通过 8092 端口打开

复制代码
seata-server.bat -p 8092

打开 nacos 控制台,就可以查看服务,如下:

1.2.2、配置事务组映射

接下来,我们需要将 tx-service-group 与 cluster 的映射关系都配置到 nacos 配置中心。

1.2.3、微服务拂去 nacos 配置

接下来,修改每一个微服务的 application.yml 文件,让微服务读取 nacos 中的 client.properties 文件.

复制代码
seata:
  config:
    type: nacos
    nacos:
      server-addr: 127.0.0.1:8848
      username: nacos
      password: nacos
      group: SEATA_GROUP
      data-id: seataServer2.properties

1.2.4、启动所有微服务

可以看到 8091 这边日志信息,服务全部注册成功.

现在修改 nacos 上修改为 HZ 事务组映射.

可以观察到 8092 这边服务也注册成功.

相关推荐
Penge6661 小时前
Go 接口编译期断言
后端
我是一颗柠檬1 小时前
【MySQL全面教学】MySQL面试高频考点汇总Day15(2026年)
数据库·后端·mysql·面试
拽着尾巴的鱼儿2 小时前
springboot openfeign 自定义feign 接口重试机制
java·spring boot·后端
Ceelog2 小时前
久坐党自救指南:屏幕前 8 小时,身体到底在经历什么
前端·后端
XS0301063 小时前
并发编程 六
java·后端
雪宫街道3 小时前
synchronized 锁的范围:对象锁、类锁与代码块锁
java·jvm·后端·面试
XS0301064 小时前
Spring Bean 作用域 & 生命周期
java·后端·spring
NagatoYukee4 小时前
Spring Security基础部分学习
java·学习·spring
彦为君4 小时前
JavaSE-07-异常机制
java·开发语言·后端·python·spring