同一个服务部署了多个实例,在通过网关调用时会随机调用其中一个。但是,当某个服务挂掉之后,依然在注册中心中,依然会随机被调用到,调用时便会超时报错。(主要是开发测试或者演示时需要立即将失效的从注册中心剔除。)
则:1、需要在注册中心,将eureka.server.eviction-interval-timer-in-ms改小,默认60秒,配置文件中单位是毫秒。
# 注册中心的配置
eureka:
instance:
hostname: localhost
# 过期时间,默认90s, 可不配置
lease-expiration-duration-in-seconds: 90
# 续约时间,默认30s,可不配置
lease-renewal-interval-in-seconds: 30
# ip地址优先
prefer-ip-address: true
server:
# 关闭注册中心自我保护模式,避免注册中心不移除失效的服务,默认为true
enable-self-preservation: true
# 去除失效服务的时间间隔(毫秒)
eviction-interval-timer-in-ms: 1000
client:
# 启用eureka客户端,默认为true, 可不配置
enabled: true
# 取注册信息,默认为true,可不配置
fetchRegistry: false
# 两个心跳参数,默认都是30s,可不配置
instance-info-replication-interval-seconds: 30
registry-fetch-interval-seconds: 30
# 注册到注册中心,默认为true,可不配置
registerWithEureka: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
- 还需要在业务微服务中,将过期时间默认90秒和续约时间默认30秒改小。
#业务微服务配置示例
eureka:
instance:
prefer-ip-address: true #以IP地址注册到服务中心
instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port} #eureka实例id
ip-address: 192.168.217.211
#Eureka客户端向服务端发送心跳的时间间隔,单位为秒(客户端告诉服务端自己会按照该规则),默认30
lease-renewal-interval-in-seconds: 1
#Eureka服务端在收到最后一次心跳之后等待的时间上限,单位为秒,超过则剔除(客户端告诉服务端按照此规则等待自己),默认90
lease-expiration-duration-in-seconds: 3
client:
service-url:
defaultZone: http://localhost:8761/eureka/ #微服务注册中心地址
lease-expiration-duration-in-seconds不要配置的比lease-renewal-interval-in-seconds小,否则会出问题,一会踢了,一会出来了。
==============================================================
看看他们的默认值:
服务端60秒的剔除间隔:
客户端30秒心跳,90秒失效:
以上加起来是3分钟,也就是说正常默认情况下,会有3分钟左右的剔除延迟。
在默认的springCloud中eureka注册中心在服务下线时表现的非常不灵敏,eureka设计的本意是在服务不会频繁上下线和网络稳定的内网,这种设计在生产环境是没什么问题的,但在开发和测试环境却会导致经常调用到已经下线的服务提供者。
另:eureka: instance下的配置是针对配置文件所在工程实例的。
eureka:server下的配置是针对eureka的server端的,一般为注册中心。该处配置会针对所有注册在server注册中心的服务生效。
eureka:client下的配置是针对配置文件所在工程实例的。
参考:
spring eureka 服务实例实现快速下线快速感知快速刷新配置解析
https://blog.csdn.net/zhxdick/article/details/78560993
======================================================
如果服务停掉没有剔除,调用时会报超时。但如果剔除了,一个都没了,则会报服务找不到:
、
而登录的session管理是在单独的uaa工程里的,业务服务停掉没关联。如果业务微服务中调用不需要用户权限,则关掉uaa之后还能正常调用,如果需要权限,则关掉uaa就不行了,页面也会报500调用超时。
🐞标题:Eureka开发快速剔除失效服务
👽作者:ruige
🐾地址:https://jjdhhc.com/articles/2020/11/07/1604721339488.html
🙏感恩:谢谢您的打赏与支持!中间图片是我的微信公众号,扫码关注哦!