Eureka 参数调优
常见问题
为什么服务下线了,Eureka Server 接口返回的信息还会存在。
为什么服务上线了,Eureka Client 不能及时获取到。
为什么有时候会出现如下提示:
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 Server 并不是强一致的,因此 registry 中会存留过期的实例信息,这里头有几个原因:
应用实例异常挂掉,没能在挂掉之前告知 Eureka Server 要下线掉该服务实例信息。这个就需要依赖 Eureka Server 的 EvictionTask 去剔除。
应用实例下线时有告知 Eureka Server 下线,但是由于 Eureka Server 的 REST API 有 response cache,因此需要等待缓存过期才能更新。
Eureka Server 由于开启并引入了 SELF PRESERVATION 模式,导致 registry 的信息不会因为过期而被剔除掉,直到退出 SELF PRESERVATION 模式。
针对 Client 下线没有通知 Eureka Server 的问题,可以调整 EvictionTask 的调度频率,比如下面配置将调度间隔从默认的 60 秒,调整为 5 秒:
安全验证
我们启动了Eureka Server,然后在浏览器中输入http://localhost:8761/后,直接回车,就进入了spring cloud的服务治理页面,这么做在生产环境是极不安全的,下面,我们就给Eureka Server加上安全的用户认证.
(1)pom文件中引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
(2)serviceurl中加入安全校验信息
eureka.client.serviceUrl.defaultZone=http://<username>:<password>@${eureka.instance.hostname}:${server.port}/eureka/