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 这边服务也注册成功.

相关推荐
一个诺诺前行的后端程序员2 小时前
springcloud微服务实战<1>
spring·spring cloud·微服务
凡人的AI工具箱3 小时前
AI教你学Python 第11天 : 局部变量与全局变量
开发语言·人工智能·后端·python
是店小二呀3 小时前
【C++】C++ STL探索:Priority Queue与仿函数的深入解析
开发语言·c++·后端
canonical_entropy3 小时前
金蝶云苍穹的Extension与Nop平台的Delta的区别
后端·低代码·架构
我叫啥都行4 小时前
计算机基础知识复习9.7
运维·服务器·网络·笔记·后端
无名指的等待7125 小时前
SpringBoot中使用ElasticSearch
java·spring boot·后端
Tatakai255 小时前
Mybatis Plus分页查询返回total为0问题
java·spring·bug·mybatis
.生产的驴5 小时前
SpringBoot 消息队列RabbitMQ 消费者确认机制 失败重试机制
java·spring boot·分布式·后端·rabbitmq·java-rabbitmq
AskHarries6 小时前
Spring Boot利用dag加速Spring beans初始化
java·spring boot·后端
苹果酱05676 小时前
一文读懂SpringCLoud
java·开发语言·spring boot·后端·中间件