搭建eureka集群时出现“unavailable-replicas”问题的解决办法
搭建eureka集群时,各节点之间互相注册成功,但是,节点均出现在unavailable-replicas的问题;(开发环境)配置文件(错误的配置文件)如下:# eureka服务端的实例名称spring:application:name: eurekaeureka:instance:prefer-ip-address: falseclient:#表示是否将自己注册到Eureka Serverreg
搭建eureka集群时,各节点之间互相注册成功,但是,节点均出现在unavailable-replicas的问题;
(开发环境)配置文件(错误的配置文件)如下:
# eureka服务端的实例名称
spring:
application:
name: eureka
eureka:
instance:
prefer-ip-address: false
client:
#表示是否将自己注册到Eureka Server
register-with-eureka: true
#表示是否从Eureka Server获取注册的服务信息
# false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
fetch-registry: true
service-url:
defaultZone: http://euk1.com:7900/eureka/,http://euk2.com:7901/eureka/,http://euk3.com:7902/eureka/
server:
# 设置eureka是否启动自我保护 true指开启eureka的自我保护 false指关闭eureka的自我保护
# 如果关闭eureka的自我保护,则不可用的服务会被及时剔除掉
enable-self-preservation: false
# eureka的阈值(默认值)是0.85(当注册在eureka中的正常服务占比低于85%时会开启eureka的自我保护)
# 也就是说Eureka Server在运行期间会去统计心跳失败比例在 15 分钟之内是否低于 85%,如果低于 85%,Eureka Server 会将这些实例保护起来,让这些实例不会过期
renewal-percent-threshold: 0.85
# 剔除服务的时间间隔毫秒数(单位:毫秒) 扫描失效服务的时间间隔(默认是60*1000 即60秒)
eviction-interval-timer-in-ms: 1000
# 是否从readonly(只读缓存)中读取实例(默认是true)
use-read-only-response-cache: false
# 设置 readwrite 和 readonly 两级缓存的同步时间间隔
response-cache-update-interval-ms: 1000
---
spring:
profiles: 7900
server:
port: 7900
eureka:
instance:
hostname: euk1-7900
---
spring:
profiles: 7901
server:
port: 7901
eureka:
instance:
hostname: euk2-7901
---
spring:
profiles: 7902
server:
port: 7902
eureka:
instance:
hostname: euk3-7902
启动之后,发现如下问题(unavailable-replicas):三个节点的服务都处于不可用的状态
经查阅资料,总结出以下几点:
1、defaultZone 后面的eureka注册中心的地址要写成域名;
2、eureka.client.register-with-eureka的值要写为true
3、eureka.client.fetch-registry的值要写为true
4、eureka集群中多个eureka服务的spring.application.name的值要一致
5、eureka.instance.prefer-ip-address的值必须设置为false;prefer-ip-address:true代表使用ip地址的形式来定义注册中心的地址,而不使用主机名,而defaultZone中是以域名的方式向注册中心注册的,最终导致分片节点不能识别匹配(ip地址和域名),而认为分片均处于不可达状态;
6、各个eureka server节点要配置自己的hostname,各节点的hostname必须是各自的域名;如果是开发环境或测试环境下,一定要和电脑中的hosts(C:\Windows\System32\drivers\etc\hosts)文件中的配置一样;如下所示:
配置文件应写为以下内容:
正确的配置文件:
# eureka服务端的实例名称
spring:
application:
name: eureka
eureka:
instance:
prefer-ip-address: false
client:
#表示是否将自己注册到Eureka Server
register-with-eureka: true
#表示是否从Eureka Server获取注册的服务信息
# false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
fetch-registry: true
service-url:
defaultZone: http://euk1.com:7900/eureka/,http://euk2.com:7901/eureka/,http://euk3.com:7902/eureka/
server:
# 设置eureka是否启动自我保护 true指开启eureka的自我保护 false指关闭eureka的自我保护
# 如果关闭eureka的自我保护,则不可用的服务会被及时剔除掉
enable-self-preservation: false
# eureka的阈值(默认值)是0.85(当注册在eureka中的正常服务占比低于85%时会开启eureka的自我保护)
# 也就是说Eureka Server在运行期间会去统计心跳失败比例在 15 分钟之内是否低于 85%,如果低于 85%,Eureka Server 会将这些实例保护起来,让这些实例不会过期
renewal-percent-threshold: 0.85
# 剔除服务的时间间隔毫秒数(单位:毫秒) 扫描失效服务的时间间隔(默认是60*1000 即60秒)
eviction-interval-timer-in-ms: 1000
# 是否从readonly(只读缓存)中读取实例(默认是true)
use-read-only-response-cache: false
# 设置 readwrite 和 readonly 两级缓存的同步时间间隔
response-cache-update-interval-ms: 1000
---
spring:
profiles: 7900
server:
port: 7900
eureka:
instance:
hostname: euk1.com
---
spring:
profiles: 7901
server:
port: 7901
eureka:
instance:
hostname: euk2.com
---
spring:
profiles: 7902
server:
port: 7902
eureka:
instance:
hostname: euk3.com
至此,问题解决,如下图所示:
更多推荐
所有评论(0)