一、Eureka Environment配置和Eureka DataCenter的配置
二、Eureka开启自我保护的提示
三、Eureka注册服务慢的问题如何解决?
四、如何解决Eureka Server不踢出已关停的节点的问题?
五、Eureka配置instanceId显示IP
一、Eureka Environment的配置
启动Eureka后,我们可以看到默认的环境和数据中心
我们配置一下eureka.environment和eureka.datacenter
security:
basic:
enabled: true
user:
name: user
password: password123
server:
port: 8761
eureka:
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://user:password123@localhost:8761/eureka
environment: local
datacenter: cloud
二、Eureka开启自我保护的提示
Eureka server和client之间周期性心跳,每隔30秒会进行一次。
下图中我们看到Renews threshold和Renews (last min)
Renews threshold:server期望在每分钟中收到的心跳次数
Renews (last min):上一分钟内收到的心跳次数
我关闭掉7900和7910后就出现了红色部分的提示
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.
原因:这是因为Eureka进入了自我保护机制,默认情况下,如果EurekaServer在一定时间内没有接收到某个微服务实例的心跳时,EurekaServer将会注销该实例(默认90s)。但是当网络发生故障时,微服务与EurekaServer之间无法通信,这样就会很危险了,因为微服务本身是很健康的,此时就不应该注销这个微服务,而Eureka通过自我保护机制来预防这种情况,当网络健康后,该EurekaServer节点就会自动退出自我保护模式。
四、如何解决Eureka Server不踢出已关停的节点的问题?
server端:
eureka.server.enable-self-preservation (设为false,关闭自我保护主要)
eureka.server.eviction-interval-timer-in-ms 清理间隔(单位毫秒,默认是60*1000)client端:
eureka.client.healthcheck.enabled = true 开启健康检查(需要spring-boot-starter-actuator依赖)
eureka.instance.lease-renewal-interval-in-seconds =10 租期更新时间间隔(默认30秒)
eureka.instance.lease-expiration-duration-in-seconds =30 租期到期时间(默认90秒)
示例:
服务器端配置:
eureka:
server:
enableSelfPreservation: false
evictionIntervalTimerInMs: 4000
客户端配置:
eureka:
instance:
leaseRenewalIntervalInSeconds: 5 ---每隔5s心跳一次,证明本服务还活着
leaseExpirationDurationInSeconds: 10 ---本服务10s内没有心跳,就将该服务从服务端剔除
THE SELF PRESERVATION MODE IS TURNED OFF.THIS MAY NOT PROTECT INSTANCE EXPIRY IN CASE OF NETWORK/OTHER PROBLEMS.
在配置上,自我保护机制关闭了,但是一分钟内的续约数没有达到85% , 可能发生了网络分区,会有如下提示
五、Eureka配置instanceId显示IP:${spring.cloud.client.ipAddress}
eureka:
instance:
prefer-ip-address: true
instance-id: ${spring.application.name}:${spring.cloud.client.ipAddress}:${spring.application.instance_id:${server.port}}