Eureka检测服务状态
Eureka detect service status
上下文
我们正在使用 Spring Cloud Netflix,Eureka 作为服务发现,Zuul 用于代理服务和负载平衡。
微服务是使用 NodeJS 实现的,并使用 NPM 模块 eureka-js-client 在 Eureka 注册,其间的自定义层处理所有微服务通用的配置和内容。
问题
问题是 Eureka 无法识别某项服务是否出现故障。这是一个问题,因为我们有一个具有自动部署的开发基础设施,每次都在不同端口上重新部署和重启微服务,而无需重启 Eureka(和 Zuul)。
因此,一段时间后我们有一个微服务的十个或更多实例,其中只有一个在运行,但所有实例都被识别为正在运行 UP
。
解决方法
我尝试将客户端上的 heartbeatInterval
设置得较小,但这没有帮助。
我尝试将服务器上的 renewalThresholdUpdateIntervalMs
设置得更小,但这也无济于事。
更多令人沮丧、毫无帮助的 属性 尝试……
问题
如何配置 Eureka 驱逐实例或将状态设置为 DOWN
在合理的时间内(不是 30 分钟左右)不发送心跳的实例?
代码片段
服务器本身不包含可提及的代码(只是使用 Spring Cloud Starter 启动 Eureka 服务器的一些注释)。
Eureka服务器的配置(我已经去掉了所有不工作的尝试):
server:
port: 8761
spring:
cloud:
client:
hostname: localhost
eureka:
instance:
address: 127.0.0.1
hostname: ${spring.cloud.client.hostname}
发送到服务器的客户端配置(使用eureka-js-client):
{
instance : {
instanceId : `${CONFIG.instance.address}:${CONFIG.instance.name}:${CONFIG.instance.port}`,
app : CONFIG.instance.name,
hostName : CONFIG.instance.host,
ipAddr : CONFIG.instance.address,
port : {
'$' : CONFIG.instance.port,
'@enabled' : true
},
homePageUrl : `http://${CONFIG.instance.host}:${CONFIG.instance.port}/`,
statusPageUrl : `http://${CONFIG.instance.host}:${CONFIG.instance.port}/info`,
healthCheckUrl : `http://${CONFIG.instance.host}:${CONFIG.instance.port}/health`,
vipAddress : CONFIG.instance.name,
secureVipAddress : CONFIG.instance.name,
dataCenterInfo : {
'@class' : 'com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo',
name : 'MyOwn'
}
},
eureka : {
host : CONFIG.eureka.host,
port : CONFIG.eureka.port,
servicePath : CONFIG.eureka.servicePath || '/eureka/apps/',
healthCheckInterval : 5000
}
}
after a while we have ten or more instances of one microservice where
only one is up but all are recognized as beeing UP.
Eureka 有一个 'self preservation' 模式。如果少于 85% 的实例心跳正在注册,它不会驱逐任何实例。您应该能够在 eureka 仪表板上看到警告。
上下文
我们正在使用 Spring Cloud Netflix,Eureka 作为服务发现,Zuul 用于代理服务和负载平衡。
微服务是使用 NodeJS 实现的,并使用 NPM 模块 eureka-js-client 在 Eureka 注册,其间的自定义层处理所有微服务通用的配置和内容。
问题
问题是 Eureka 无法识别某项服务是否出现故障。这是一个问题,因为我们有一个具有自动部署的开发基础设施,每次都在不同端口上重新部署和重启微服务,而无需重启 Eureka(和 Zuul)。
因此,一段时间后我们有一个微服务的十个或更多实例,其中只有一个在运行,但所有实例都被识别为正在运行 UP
。
解决方法
我尝试将客户端上的
heartbeatInterval
设置得较小,但这没有帮助。我尝试将服务器上的
renewalThresholdUpdateIntervalMs
设置得更小,但这也无济于事。更多令人沮丧、毫无帮助的 属性 尝试……
问题
如何配置 Eureka 驱逐实例或将状态设置为 DOWN
在合理的时间内(不是 30 分钟左右)不发送心跳的实例?
代码片段
服务器本身不包含可提及的代码(只是使用 Spring Cloud Starter 启动 Eureka 服务器的一些注释)。
Eureka服务器的配置(我已经去掉了所有不工作的尝试):
server:
port: 8761
spring:
cloud:
client:
hostname: localhost
eureka:
instance:
address: 127.0.0.1
hostname: ${spring.cloud.client.hostname}
发送到服务器的客户端配置(使用eureka-js-client):
{
instance : {
instanceId : `${CONFIG.instance.address}:${CONFIG.instance.name}:${CONFIG.instance.port}`,
app : CONFIG.instance.name,
hostName : CONFIG.instance.host,
ipAddr : CONFIG.instance.address,
port : {
'$' : CONFIG.instance.port,
'@enabled' : true
},
homePageUrl : `http://${CONFIG.instance.host}:${CONFIG.instance.port}/`,
statusPageUrl : `http://${CONFIG.instance.host}:${CONFIG.instance.port}/info`,
healthCheckUrl : `http://${CONFIG.instance.host}:${CONFIG.instance.port}/health`,
vipAddress : CONFIG.instance.name,
secureVipAddress : CONFIG.instance.name,
dataCenterInfo : {
'@class' : 'com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo',
name : 'MyOwn'
}
},
eureka : {
host : CONFIG.eureka.host,
port : CONFIG.eureka.port,
servicePath : CONFIG.eureka.servicePath || '/eureka/apps/',
healthCheckInterval : 5000
}
}
after a while we have ten or more instances of one microservice where only one is up but all are recognized as beeing UP.
Eureka 有一个 'self preservation' 模式。如果少于 85% 的实例心跳正在注册,它不会驱逐任何实例。您应该能够在 eureka 仪表板上看到警告。