我使用本地主机中的不同端口创建了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创建了两个微服务,名为service_A和service_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。
我应该如何使这个系统容错,这意味着即使领事服务器失败,在该服务器注册的服务也会自动在集群中可用的另一台服务器上注册。
此外,我需要知道领事如何在服务注册和发现方面实现高可用性和容错。希望你能明白这个问题。
发布于 2018-10-08 06:02:49
显然,您可以在本地计算机中部署领事集群,但不能期望在同一台本地计算机中存在任何恢复机制或容错。这是因为您的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端口以下的领事服务器(您可以随意更改它)。如果在同一台本地计算机中运行领事群集,则不能将相同的端口号(8500)分配给需要标识的每个群集节点。为了在同一个ip地址下运行,它将是不同的。要实现这一点,您将需要在具有相同端口号8500的不同ip地址下部署每个领事节点。

8301是用来处理局域网中流言的serf端口。即使这个端口在每个节点中也可以是相同的,以维护集群的互连。
实现这一目标的最简单方法是在AWS VPC中使用私有子网。

然后,您可以为每个子网节点分配不同的配置,每个服务器节点的端口号都是相同的,这样就可以通过@EnableDiscoveryClient注释的services_A & service_B来识别它。

https://stackoverflow.com/questions/52535678
复制相似问题