Eureka 在设计时,认为分布式环境的网络是不可靠的,可能会出现网络缘由致使 EurekaServer 没有收到实例的心跳git
而这却并不能说明实例就宕了,因此 EurekaServer 缺省会打开保护模式,它主要是网络分区场景下的一种保护github
一旦进入保护模式,EurekaServer 将会尝试保护其服务注册表中的信息,再也不删除里面的数据(即不会注销任何微服务)spring
相关介绍,详见:https://github.com/Netflix/eureka/wiki/Understanding-Eureka-Peer-to-Peer-Communicationbootstrap
在这种机制下,它仍然鼓励客户端再去尝试调用这个所谓 down 状态的实例,若确实调用失败,那么断路器就派上用场了网络
关于断路器,在接下来的系列文章中,我会详细介绍并演示app
经过修改注册中心的配置文件 application.yml,便可打开或关闭注册中心的自我保护模式分布式
eureka: server: enable-self-preservation: false # 关闭自我保护模式(缺省为打开)
自我保护模式打开时,已关停节点是会一直显示在 Eureka 首页的spring-boot
关闭自我保护模式后,因为其默认的心跳周期比较长等缘由,要过一下子才会发现已关停节点被自动踢出了微服务
若想尽快的及时踢出,那就只有修改默认的心跳周期参数了,以下所示测试
注册中心的配置文件 application.yml 须要修改的地方为
eureka: server: enable-self-preservation: false # 关闭自我保护模式(缺省为打开) eviction-interval-timer-in-ms: 1000 # 续期时间,即扫描失效服务的间隔时间(缺省为60*1000ms)
微服务的配置文件 application.yml 须要修改的地方为
eureka: instance: lease-renewal-interval-in-seconds: 5 # 心跳时间,即服务续约间隔时间(缺省为30s) lease-expiration-duration-in-seconds: 15 # 发呆时间,即服务续约到期时间(缺省为90s) client: healthcheck: enabled: true # 开启健康检查(依赖spring-boot-starter-actuator)
关于续期、心跳、发呆时间的关系,详见上一篇文章中的有关分析:https://jadyer.cn/2017/01/16/springcloud-eureka/
注意:更改 Eureka Server 的更新频率将打破注册中心的的自我保护功能
生产环境不建议自定义这些配置,详见https://github.com/spring-cloud/spring-cloud-netflix/issues/373
修改微服务的 eureka.instance.lease-renewal-interval-in-seconds 参数(即心跳时间),即可解决此问题
详见:http://cloud.spring.io/spring-cloud-static/Camden.SR4/#_why_is_it_so_slow_to_register_a_service
若是把微服务的 eureka.client.healthcheck.enabled 属性配置在 bootstrap.yml 里面,可能会引发一些不良反应
好比,实际测试发现,Eureka 首页显示的服务状态,本应是 UP(1),却变成大红色的粗体 UNKNOWN(1)
Tips:bootstrap.yml 一般会在链接 Spring Cloud Config 搭建的配置中心时使用,接下来的本系列文章中会有介绍和演示
Eureka 首页显示的微服务名默认为:机器主机名:应用名称:应用端口
也就是:${spring.cloud.client.hostname}:${spring.application.name}:${spring.application.instance_id:${server.port}}
咱们也能够修改微服务的配置文件,定制它注册到注册中心时显示的名字,以下所示
eureka: instance: # instance-id: ${spring.application.name} # 修改显示的微服务名为:应用名称 instance-id: ${spring.cloud.client.ipAddress}:${server.port} # 修改显示的微服务名为:IP:端口
一样能够知道,两个相同的服务(端口不一样),若是注册时设置的都是 eureka.instance.instance-id=${spring.application.name}
那么 Eureka 首页只会看到一个服务名字,而没法区分有几个实例注册上来了(由于注册上来的实例名都是相同的),这是要注意的
既然微服务显示的名称容许修改,那么其对应的点击连接,也是能够修改的
一样的,仍是修改微服务的配置文件,以下所示
eureka: instance: # ip-address: 192.168.6.66 # 只有prefer-ip-address=true时才会生效 prefer-ip-address: true # 设置微服务调用地址为IP优先(缺省为false)
Eureka 首页显示的微服务调用地址,默认是这样的:http://jadyer-pc:2100/info
而在设置 prefer-ip-address=true 以后,调用地址会变成:http://10.16.18.95:2100/info
这时若再设置 ip-address=192.168.6.66,则调用地址会变成:http://192.168.6.66:2100/info