实现原理
搭建两台或以上Spring Cloud Eureka服务,相互注册,这样一台挂了,就可以用另外一台顶替。
项目创建
教程参考我写的这篇博客
服务注册中心Spring Cloud Eureka项目创建
服务一
spring-cloud-eureka-server
注册到spring-cloud-eureka-server-replica
spring.application.name=spring-cloud-eureka-server
server.port=8761
eureka.client.service-url.defaultZone=http://localhost:8762/eureka/
服务二
spring-cloud-eureka-server-replica
注册到spring-cloud-eureka-server
spring.application.name=spring-cloud-eureka-server-replica
server.port=8762
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
服务提供者、消费者配置
具体项目创建、注册及接口远程调用,教程参考我写的这篇博客
Spring Cloud Eureka服务提供者实现服务注册和服务消费者远程调用
同时配置多个地址,用逗号分隔
eureka.client.service-url.defualtZone=http://localhost:8761/eureka,http://localhost:8762/eureka
效果图
即使停掉一台Eureka服务,也可正常调用
Eureka自我保护机制
Eureka Server在运行期间会去统计心跳失败的比例在15分钟之内是否低于85%,如果低于85%,Eureka Server会认为当前实例的客户端与自己的心跳连接出现了网络故障,那么Eureka Server会把这些实例保护起来,让这些事例不会过期导致实例剔除。
好处:
这样做的目的是为了减少网络不稳定或者网络分区的情况下,Eureka Server将健康服务剔除下线的问题。使用自我保护可以使得Eureka集群更加健壮和稳定运行。
带来的问题:
Eureka Server不再从注册列表中移除因为长时间没有收到心跳而应该剔除的过去服务。
总结:
简单来说就是防止网络不稳,导致注册服务被剔除,等到网络恢复了,就会退出自我保护,重新变得可用。缺点是不需要的服务不会被自动剔除,消费者还是可以拿到不可用的地址。
触发条件:
正常:
触发后
当Renews (last min)(实际心跳检查数)数小于Renews threshold(自我保护阈值)数时就会触发自动保护机制。
Renews threshold
= 服务总数 * 每分钟续约数量(60s/客户端的续约间隔(默认30s)) * 自我保护续约的百分比阈值因子(默认0.85)
比如,如果总共有4个服务注册到注册中心,那么Renews threshold = 4 * (60/30) * 0.85 = 6.8,取整为6。
Renews threshold值更新
1:Eureka Server启动的时候。
2:服务注册的时候。
3:取消注册的时候。
4:定时每15分钟更新一次。
关闭自我保护或修改自我保护续约的阈值因子
# 关闭自我保护模式
eureka.server.enable-self-preservation=false
# 修改自我保护续约的百分比阈值因子,默认是0.85
eureka.server.renewal-percent-threshold=0.5