Eureka自我保护机制、健康检查的作用

       本文我们来探讨Eureka的自我保护模式。自我保护模式是Eureka的重要特性。进入自我保护模式最直观的体现,是Eureka Server首页输出的警告,如图:

默认情况下,如果Eureka Server在一定时间内没有接收到某个微服务实例的心跳,Eureka Server将会注销该实例(默认90秒)。但是当网络分区故障发生时,微服务与Eureka Server之间无法正常通信,以上行为可能变得非常危险了——因为微服务本身其实是健康的,此时本不应该注销这个微服务。Eureka通过“自我保护模式”来解决这个问题——当Eureka Server节点在短时间内丢失过多客户端时(可能发生了网络分区故障),那么这个节点就会进入自我保护模式。一旦进入该模式,Eureka Server就会保护服务注册表中的信息,不再删除服务注册表中的数据(也就是不会注销任何微服务)。当网络故障恢复后,该Eureka Server节点会自动退出自我保护模式。综上,自我保护模式是一种应对网络异常的安全保护措施。它的架构哲学是宁可同时保留所有微服务(健康的微服务和不健康的微服务都会保留),也不盲目注销任何健康的微服务。使用自我保护模式,可以让Eureka集群更加的健壮、稳定。在Spring Cloud中,可以使用eureka.server.enable-self-preservation = false 禁用自我保护模式。

Eureka自我保护机制

承接上篇文章的三个项目(spring-boot-order、spring-boot-user、spring-cloud-eurekasingle),两个客户端一个服务端的项目进行修改,深入理解Eureka的自我保护模式。默认Eureka是开启自我保护的。我们来做个测试,我们先启动三个工程看看效果!

接着我们关闭掉order的服务,刷新列表看看!如下:

我们除了看到了一行红色的警告信息,还发现了一件神奇的事情,就是我们的服务实例虽然被kill了,但是在服务注册中心他还是存在的(由于eureka的自我保护机制,即使我们已经关闭掉了order的服务,eureka的注册中心依然会保留其映射状态!)。这就是Eureka自我保护机制,他不会剔除已经挂掉的服务,他会认为这个服务是在尝试重新连接的。我们在开发过程中肯定是不希望这样的,不利于开发。我们可以关闭Eureka的自我保护机制(实际生产环境不建议关闭)。

接下来关闭这个服务看看效果,这里需要注意eureka的服务剔除时间一定要大于客户端告诉服务端的时间,以本例为参考即:eviction-interval-timer-in-ms: 5000>lease-expiration-duration-in-seconds: 20

客户端配置(order和user配置一样)如下所示:

# 心跳检测检测与续约时间,测试时将值设置设置小些,保证服务关闭后注册中心能及时踢出服务 配置说明
    lease-renewal-interval-in-seconds: 10  #  lease-renewal-interval-in-seconds 每间隔10s,向服务端发送一次心跳,证明自己依然”存活“
    lease-expiration-duration-in-seconds: 20  #  lease-expiration-duration-in-seconds  告诉服务端,如果我20s之内没有给你发心跳,就代表我“死”了,将我踢出掉。

服务端添加配置如下所示:

  server:
    enable-self-preservation: false  #关闭保护机制,以确保注册中心将不可用的实例正确剔除
    eviction-interval-timer-in-ms: 5000  #(代表是5秒,单位是毫秒,清理失效服务的间隔 )

重新启动三个项目,待注册列表正常后关闭order客户端!禁用自我保护模式后eureka的服务端会给出提示,如下所示:

三个项目启动成功后如下所示:

关闭order服务,再刷新列表查看,如下所示:

此时我们发现,红色警告变成了自我保护被关闭的警告,且实例被注册中心剔除,表明此时自我保护机制被关闭。

健康检查

人会生病,就像人一样服务有时候也会出现异常情况,我们也需要知道某个服务的健康状况。我们可以通过添加如下依赖,开启某个服务的健康检查。以user为例需要在pom文件中引入对应的jar包

 <!--健康检查依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

在application中添加配置,开启健康检查:

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
    healthcheck:
      enabled: true

然后启动eureka服务端和user客户端,访问http://localhost:8083/actuator/health,查看健康信息,如下所示:

详细的参考文章:http://www.itmuch.com/spring-cloud/finchley-3/  

本文参考了文章:https://www.jianshu.com/p/df61a3273528

至此今天的任务就算完成了!接下里我们就开始学习eurake的高可用了,即分布式集群!

项目路径:

链接:https://pan.baidu.com/s/1pNFlsE5f9e2J2T3wIRpasg 
提取码:4bgp 
复制这段内容后打开百度网盘手机App,操作更方便哦

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值