SpringCloudEureka&Consul-服务发现-SpringCloudEureka自我保护机制-《Java笔记》

admin 2025-10-19 05:47:09 编程 来源:ZONE.CI 全球网 0 阅读模式

Java SpringCloud Eureka

自我保护背景

首先对Eureka注册中心需要了解的是Eureka各个节点都是平等的,没有ZK中角色的概念,%20即使N-1个节点挂掉也不会影响其他节点的正常运行。默认情况下,如果Eureka%20Server在一定时间内(默认90秒)没有接收到某个微服务实例的心跳,Eureka%20Server将会移除该实例。但是当网络分区故障发生时,微服务与Eureka%20Server之间无法正常通信,而微服务本身是正常运行的,此时不应该移除这个微服务,所以引入了自我保护机制。

自我保护机制

官方对于自我保护机制的定义:https://github.com/Netflix/eureka/wiki/Understanding-Eureka-Peer-to-Peer-Communication自我保护模式正是一种针对网络异常波动的安全保护措施,使用自我保护模式能使Eureka集群更加的健壮、稳定的运行。自我保护机制的工作机制是如果在15分钟内超过85%的客户端节点都没有正常的心跳,那么Eureka就认为客户端与注册中心出现了网络故障,Eureka%20Server自动进入自我保护机制,此时会出现以下几种情况:1、Eureka%20Server不再从注册列表中移除因为长时间没收到心跳而应该过期的服务。2、Eureka%20Server仍然能够接受新服务的注册和查询请求,但是不会被同步到其它节点上,保证当前节点依然可用。3、当网络稳定时,当前Eureka%20Server新的注册信息会被同步到其它节点中。因此Eureka%20Server可以很好的应对因网络故障导致部分节点失联的情况,而不会像ZK那样如果有一半不可用的情况会导致整个集群不可用而变成瘫痪。

自我保护开关

Eureka自我保护机制,通过配置%20eureka.server.enable-self-preservation来true打开/false禁用自我保护机制,默认打开状态,建议生产环境打开此配置。

开发环境配置

开发环境中如果要实现服务失效能自动移除,只需要修改以下配置。

1、%20注册中心关闭自我保护机制,修改检查失效服务的时间。eureka:%20%20server:%20%20%20%20%20enable-self-preservation:%20false%20%20%20%20eviction-interval-timer-in-ms:%203000

2、%20微服务修改减短服务心跳的时间。#%20默认90秒lease-expiration-duration-in-seconds:%2010#%20默认30秒lease-renewal-interval-in-seconds:%203

以上配置建议在生产环境使用默认的时间配置。

自我保护机制实战分析

现在把保护机制开启:关注右上角的两个重要参数:

参数 说明
Renews threshold Eureka Server 期望每分钟收到客户端实例的总心跳数
Renews (last min) Eureka Server 最后一分钟收到的总心跳数

这里显示的数值如下:

  1. Renews threshold 6
  2. Renews (last min) 8

这个 6 和 8 分别是怎么算出来的?先来看这两个参数的默认设置:eureka.server.renewal-percent-threshold:表示 Eureka Server 开启自我保护的系数,默认:0.85。eureka.instance.lease-renewal-interval-in-seconds:表示 Eureka Client 向 Eureka Server 发送心跳的频率(默认 30 秒),如果在 lease-expiration-duration-in-seconds 指定的时间内未收到心跳,则移除该实例。这里有 4 个注册实例,保护系数:0.85,心跳频率:30秒(每分钟两次),计算公式如下:

  1. Renews threshold = 4 * 2 * 0.85 = 6.8(取整为:6
  2. Renews (last min) = 4 * 2 = 8

现在删除一个配置中心实例测试一下:image.png出现警告:EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY’RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.说明现在 Eureka Server 已经进行保护模式了,并且删除的那个实例并不会从注册列表中移除,保护机制生效成功。由此可知:Eureka Server 在一分钟内如果没有收到 6 个以上的心跳,即:Renews threshold >= Renews (last min),如果保护机制已开启的情况下,则会开启保护机制。为什么移除一个实例后,Renews threshold 还是 6 呢,算出来应该是 5,这是因为 Eureka Server 还没刷新这个值,默认 15 分钟刷新一次,可以通过设计以下值进行调整:

  1. eureka.server.renewal-threshold-update-interval-ms=900000

了解了心跳策略和保护机制后,对注册中心的日常维护就会有很多帮助。

以太坊cppgolang区别 编程

以太坊cppgolang区别

以太坊是一种去中心化的开源平台,它采用智能合约技术,旨在构建和运行不受干扰的分布式应用程序。作为目前最受欢迎的区块链平台之一,以太坊提供了多种编程语言的支持,其
progolang 编程

progolang

Go语言(Golang)是由Google开发的一门静态类型编程语言。作为一名专业的Golang开发者,我深知这门语言的优势和特点。在本文中,我将介绍Golang
golangn个发送者 编程

golangn个发送者

Golang是一种开源的编程语言,由Google团队开发,旨在提高程序的并发性和简化软件开发过程。在Go语言中,有时需要向多个接收者发送信息。本文将介绍如何在G
golang技能图谱 编程

golang技能图谱

从互联网行业的快速发展到人工智能技术的日益成熟,各种编程语言也应运而生。而在这众多的编程语言中,Golang(即Go)作为一门强大且高效的开发语言备受关注。Go
评论:0   参与:  0