同一个服务部署了多个实例,在通过网关调用时会随机调用其中一个。但是,当某个服务挂掉之后,依然在注册中心中,依然会随机被调用到,调用时便会超时报错。(主要是开发测试或者演示时需要立即将失效的从注册中心剔除。)

则: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/

        2、还需要在业务微服务中,将过期时间默认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调用超时。

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐