【Spring Cloud 基础设施搭建系列】Spring Cloud Demo项目 Eureka集群高可用搭建
文章目录
- Eureka Server的高可用
- 构建一个双节点Eureka Server集群
- 将应用注册到Eureka Server集群上
- 参考
- 源代码
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
还没有评论,来说两句吧...