【Spring Cloud 基础设施搭建系列】Spring Cloud Demo项目 Eureka集群高可用搭建

Eureka Server的高可用

单节点Eureka Server并不适合线上生产环境。Eureka Client会定时连接Eureka Server,获取服务注册表中的信息并缓存在本地。微服务在消费远程API时总是使用本地缓存中的数据。因此一般来说,即使Eureka Server发生宕机,也不会影响到服务之间的调用。但如果Eureka Server宕机时,某些微服务也出现了不可用的情况,Eureka Client中的缓存若不被更新,就可能会影响到微服务的调用,甚至影响到整个应用系统的高可用性。因此,在生产环境中,通常会部署一个高可用的Eureka Server集群。

Eureka Server 可以通过运行多个实例并相互注册的方式实现高可用部署,Eureka Server实例会彼此增量地同步信息,从而确保所有节点数据一致。事实上,节点之间相互注册是Eureka Server的默认行为。

Eureka Server的设计一开始就考虑了高可用问题,在Eureka的服务治理设计中,所有节点即是服务提供方,也是服务消费方,服务注册中心也不例外。是否还记得在单节点的配置中,我们设置过下面这两个参数,让服务注册中心不注册自己:

eureka.client.register-with-eureka=false 
eureka.client.fetch-registry=false

构建一个双节点Eureka Server集群

首先配置我们的hosts文件,加入如下的配置:

127.0.0.1 peer1 peer2

配置application.yml

spring:
  application:
    name: cloud-eureka
---
spring:
  profiles: peer1
server:
  port: 8761
eureka:
  instance:
    # 当指定profile=peer1 主机名是localhost,端口是8761
    hostname: peer1
  client:
    service-url:
      defaultZone: http://peer2:8762/eureka/
---
spring:
  profiles: peer2
server:
  port: 8762
eureka:
  instance:
    # 当指定profile=peer2 主机名是localhost,端口是8762
    hostname: peer2
  client:
    service-url:
      defaultZone: http://peer1:8761/eureka/

如上,使用连字符(—)将该application.yml文件分为三段。第二段和第三段分别为spring.properties指定了一个值,该值表示它所在的那段内容应用在哪个Profile里。
第一段由于并未指定spring.profiles,因此这段内容会对所有Profile生效。
经过以上分析,不难理解,我们定义了peer1和peer2这两个Profile。当应用以peer1这个Profile启动时,配置该Eureka Server的主机名为peer1,并将其注册到http://peer2:8762/eureka/;反之,当应用以profile=peer2时,Eureka Server会注册到peer1节点的Eureka Server。

然后我们设置一下IDEA的spring boot启动配置,修改一下Active profiles的参数即可。

在这里插入图片描述
在这里插入图片描述

然后我们启动peer1和peer2。

分别访问http://localhost:8761/ 和 http://localhost:8762/

在这里插入图片描述
在这里插入图片描述

此时访问 peerl的注册中心http://localhost:8761/,如下图所示,我们可以看到,registered-replicas中已经有peer2节点的eureka-server了。同样的,我们访问peer2的注册中心http://localhost:8762/,也能看到registered-replicas中已经有peer1节点,并且这些节点在可用分片(available-replicase)之中。
我们也可以尝试关闭peer1,刷新http://localhost:8762/,可以看到peer1的节点变为了不可用分片(unavailable-replicas)。

将应用注册到Eureka Server集群上

只须修改eureka.client.service-url.defaultZone,配置多个Eureka Server地址,就可以将其注册到Eureka Server集群了。示例:

eureka:
  client:
    service-url:
      defaultZone: http://peer1:8761/eureka/,http://peer2:8762/eureka/

这样就可以将服务注册到Eureka Server集群上了。
当然,微服务即使只配置Eureka Server集群中的某个节点,也能正常注册到Eureka Server集群,因为多个Eureka Server之间的数据会相互同步。
正常情况下,这种方式与配置多个Server节点的效果是一样的。不过为适应某些极端场景,建议在客户端配置多个Eureka Server节点。

参考

Spring+Cloud微服务实战.pdf

解决Eureka服务的available-replicas为空的问题

Spring Cloud 探索 | Eureka 高可用部署及 unavailable-replicas 问题

ds replicas是什么

源代码

https://gitee.com/cckevincyh/spring-cloud-demo/tree/eureka-replicas

发布了647 篇原创文章 · 获赞 816 · 访问量 98万+

猜你喜欢

转载自blog.csdn.net/cckevincyh/article/details/100810990