最近在学习SpringCloud微服务框架,使用的是<SpringCloud微服务实战> 翟永超著,中国工信出版集团这本书.
在书的第三章,成功搭建注册中心server和服务提供者client之后,在尝试搭建高可用注册中心时报了错,经过查阅资料和尝试解决了问题.
此篇博客即是记录问题和解决问题的方法.
问题描述
按照书中的操作步骤,将之前已经搭好的注册中心server中添加两个配置文件application-peer1.properties
和application-peer2.properties
,将项目打包为.jar文件,分别通过这两个配置文件为属性来分别启动项目
java -jar server-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer1
java -jar server-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer2
两边都能正常启动成功
但是按照配置的端口去查看Eureka的页面,会发现注册的另一个注册中心会在unavailable-replicas中,而且页面有红字报错:EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY’RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.
后来看书后面,看到了这个报错信息是注册中心的自我保护,当心跳失败比例,15分钟之内低于85%时,注册中心会将当前的实例注册信息保护起来,让实例不过期.
而书上则是正常的在available-replicas中.
为此困扰了好久.查了一些博客找到了解决办法
解决方法
之前有的博客说是配置了prefer-ip-address: true
的问题,可是我没有配置这个属性,而且书上说这个属性的默认值是false.
后来看到了这篇博客:
https://blog.csdn.net/u010448530/article/details/81097642
说是由于配置文件加载顺序的关系,会先加载我之前写过的application.properties,里面设置了下面这两个属性:
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
使注册中心不注册自己.所以我这里会出现不可用的问题.
解决方法是在新添的两个配置文件中,设置这两个属性为true
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true
重新打包启动,发现成功了.