通过领事集群实现容错

时间:2018-09-27 11:14:02

标签: spring-boot high-availability consul service-discovery fault-tolerance

我使用本地主机中的不同端口创建了consul服务器集群。

我为此使用了以下命令。

服务器1:

consul agent -server -bootstrap-expect=3 -data-dir=consul-data -ui -bind=127.0.0.1 -dns-port=8601 -http-port=8501 -serf-lan-port=8303 -serf-wan-port=8304 -server-port=8305 -node=node1

服务器2:

consul agent -server -bootstrap-expect=3 -data-dir=consul-data2 -ui -bind=127.0.0.1 -dns-port=8602 -http-port=8502 -serf-lan-port=8306 -serf-wan-port=8307 -server-port=8308 -node=node2 -join=127.0.0.1:8303

服务器3:

consul agent -server -bootstrap-expect=3 -data-dir=consul-data1 -ui -bind=127.0.0.1 -node=node3 -join=127.0.0.1:8303

然后,我使用Spring Boot创建了两个微服务,分别称为service_Aservice_B

Service_B调用service_A以获取一些数据。

这两个服务都已在上述服务器之一中注册。

application.properties中:

spring.cloud.consul.port=8501  #For service_A
spring.cloud.consul.port=8502  #For service_B

这很好,因为Service_B可以毫无问题地发现Service_A。

现在,当我杀死service_A注册的领事服务器时,由于Service_B找不到Service_A,系统无法给出结果。

我应该如何使该系统容错,这意味着即使领事服务器发生故障,在该服务器上注册的服务也会自动在群集中可用的另一台服务器上注册。

我还需要知道领事如何在服务注册和发现中实现高可用性和容错能力。希望您能收到问题。

1 个答案:

答案 0 :(得分:1)

显然,您可以在本地计算机上部署领事群集,但是您不能期望在同一台本地计算机上具有任何弹性机制或容错能力。这是因为您的spring服务(service_A和service_B)已配置为标识在给定领事服务器端口中bootstrap.yml(默认值为8500)下运行的领事服务器。

 spring:
   cloud:
    consul:
     config:
      watch:
       enabled: true
     port: 8500
     discovery:
      instanceId: ${spring.application.name}:${random.value}

因此,每个服务都将发现在8500端口下运行的领事服务器(您可以根据需要进行更改)。如果在同一台本地计算机上运行Consul群集,则无法为需要标识的每个群集节点分配相同的端口号(8500)。为了在相同的IP地址下运行,它将有所不同。为此,您需要将每个领事节点部署在具有相同端口号8500的不同IP地址下。

enter image description here

8301是用于处理LAN中八卦的农奴LAN端口。甚至每个节点上的此端口也可以相同,以维持群集的互连。

最简单的方法是在AWS VPC中使用私有子网。

AWS VPC

然后,您可以为每个子网节点分配单独的配置,并为每个服务器节点分配相同的端口号,以便您的services_A和service_B可以使用 @EnableDiscoveryClient 批注进行标识。

Clients and Servers in separate nodes