Eureka服务治理 - 自我保护机制

什么是自我保护机制?

在Eureka中,有两种角色:

  • EurekaServer(注册中心服务端)
  • EurekaClient(注册客户端)

自我保护机制其实就是当EurekaServer与EurekaClient网络不通的情况下,EurekaServer不会将EurekaClient服务剔除。

通过一个场景来了解一下:

有两个服务:用户服务app-user、订单服务app-order,用户服务做了集群,有两台机器,分别是8010和8011

现在order使用负载均衡的轮询机制,调用user的接口,可以看到是8010和8011轮询访问的。

 那如果现在8010这台服务宕机了,会是什么情况?

当访问8010的时候,就报错了,我们再看一下Eureka的注册列表,宕机的8010还在列表之中

自我保护机制说明:

默认情况下,“EurekaClient客户端”会定时(默认5秒)向“EurekaServer注册中心”发送心跳包,就是说EurekaClient会定时向EurekaServer发送一个请求,如果EurekaServer能收到,就知道当前这个EurekaClient是存活状态。

如果EurekaServer在一定时间内(一般默认是90秒),没有收到EurekaClient发送的心跳包,就会从服务列表中剔除该服务。但是如果在短时间内丢失了大量服务实例的心跳,这时候EurekaServer就会开启自我保护机制,不会剔除服务。

在什么环境下开启自我保护机制?

本地环境
建议关闭自我保护机制。因为在本地开发环境中,EurekaServer端相对来说重启频率不高,但是在EurekaClient端,可能改动代码之后需要重启,频率相对来说比较高;那么EurekaClient端重启之后就不会及时去向EurekaServer端发送心跳包,EurekaServer端就会认为是网络延迟或者其他原因,不会剔除服务,这样的话就会影响开发效率。

生产环境
建议开启自我保护机制。因为生产环境不会频繁重启服务器,并且EurekaClient端与EurekaServer端存在网络延迟的几率较高,所以需要开启自我保护机制避免误删服务。

如何关闭自我保护机制?

在EurekaServer端的yml配置文件中加入如下配置:

server:
    #开发环境关闭自我保护机制,保证不可用的服务及时剔除
    enable-self-preservation: false
    #间隔2秒钟剔除一次
    eviction-interval-timer-in-ms: 2000

然后再在EurekaClient端的yml配置文件中添加如下配置:

#心跳检测与续约时间(开发环境可以将值设小一点,保证服务关闭后注册中心能及时剔除)
#Eureka客户端向服务端发送心跳的时间间隔,单位为秒(客户端告诉服务端自己会遵循该规则)
lease-renewal-interval-in-seconds: 1
#Eureka服务端在收到最后一次心跳之后的等待的时间上限,单位为秒,超过就进行剔除(客户端告诉服务端自己会遵循该规则)
lease-expiration-duration-in-seconds: 2

同样还是用之前的例子,把服务都打开,看一下注册列表: 

user有两台,然后现在把8011这台服务关了,再刷新一下,8011就被剔除了。

这里需要注意一下,刚刚剔除完8011,order调用user的时候,还是在8010和8011两台服务之间进行轮询访问,当访问到8011的时候还是会报错,其实这是因为Ribbon存在30秒左右的缓存导致的。

如果服务真的宕机了怎么办?

  • 在本地调用应该有重试机制,访问不通的时候就做重试,如果重试多次还不行,就直接轮询到下一台服务器进行访问。
  • 保证接口网络延迟幂等性问题,防止用户重复提交。
  • 做好服务降级。
发布了46 篇原创文章 · 获赞 0 · 访问量 2023

猜你喜欢

转载自blog.csdn.net/hon_vin/article/details/102818384