一、Eureka自我保护机制概述
Eureka是基于Netflix开源的一个服务发现框架,用于服务的注册和发现。在一个分布式系统中,服务注册中心是一个至关重要的角色,因为所有的服务都需要与注册中心进行交互。如果服务注册中心出现故障或者网络异常,将会导致整个分布式系统的不可用。Eureka自我保护机制是为了解决这个问题而设计的。
Eureka客户端会定期向服务端发送消息,确认自己的运行状况。服务端在一个指定时间内如果没有接收到客户端消息,就会将该客户端从注册表中剔除。但有时候客户端和服务端之间出现了网络异常,导致客户端不能及时与服务端进行通信。如果此时服务端将客户端从注册表中剔除,就会导致客户端不能正常提供服务,整个系统也会出现不可用的情况。Eureka自我保护机制就是为了解决这个问题而设计的。
Eureka自我保护机制的原理是,当服务端在一个服务失效检查周期内(默认为90秒)内连续出现超过15分钟(默认为3个周期)的注册失败(即没有收到客户端的心跳),则会进入自我保护状态,不再剔除注册表中未能及时续约的服务,以保证已注册的服务可以继续使用。
二、Eureka自我保护机制优缺点
1. 优点
1)保证了不可用的服务实例不会被删除,降低了服务实例丢失率,保证了可用性。
2)自我保护机制让客户端维护者有足够的时间来解决长时间的服务宕机问题,降低了当出现网络异常或者大量客户端宕机时整个系统的不可用性。
2. 缺点
1)自我保护机制让不健康的服务实例继续存在,虽然可以保证可用性,但可能会降低整体的系统性能。
2)当机器宕机或者网络异常等情况时,该机器不能被及时剔除出注册表,而需要等待超时时间的到来,这样用户不能及时发现系统的问题,而且即使等到了超时时间也只是将机器标记为不可用,后续需要再次发起请求才能将机器剔除,这依然会导致延迟问题。
三、Eureka自我保护机制配置
在Spring Cloud项目中,如果需要启用Eureka自我保护机制,则需要在客户端配置文件application.properties中添加如下配置:
# 配置Eureka客户端向服务端发送心跳的时间间隔,默认30s eureka.client.heartbeatInterval=10 # Eureka服务端在这个时间内没有收到客户端的心跳,则视客户端为下线了,默认90s eureka.server.evictionIntervalTimerInMs=60000 # Eureka服务端在这个时间内最少收到的心跳数量,超出时被视为Eureka存活 eureka.server.renewalPercentThreshold=0.85 # 配置Eureka开启自我保护,默认为true eureka.server.enable-self-preservation=true # Eureka开启自我保护的最少剩余数量,当注册表中实例低于这个值时,Eureka将开启自我保护机制,默认为0 eureka.server.min-available-instances=1
四、Eureka自我保护机制代码实现
下面是一个简单的Spring Boot工程,演示了Eureka自我保护机制的配置过程。pom.xml文件中包含了Spring Cloud和Eureka相关依赖,application.properties文件中配置了Eureka自我保护机制的相关参数。
// pom.xml文件 <dependencies> <!-- Spring Cloud --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Hoxton.SR10</version> <type>pom</type> <scope>import</scope> </dependency> <!-- Eureka Dashboard --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> <!-- Eureka Client --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> </dependencies> // application.properties文件 # Eureka Server Configuration spring.application.name=eureka-server server.port=8761 eureka.client.register-with-eureka=false eureka.client.fetch-registry=false # 开启Eureka自我保护机制 eureka.server.enable-self-preservation=true eureka.server.eviction-interval-timer-in-ms=60000 eureka.server.renewal-percent-threshold=0.85 eureka.server.min-available-instances=1
启动Spring Boot工程后,访问http://localhost:8761/可以看到Eureka的控制台。在注册两个服务提供者后,关闭其中一个服务提供者的应用程序,可以发现服务提供者的状态为DOWN,并且Eureka的控制台中该服务提供者的状态为UP。
这是因为Eureka自我保护机制将DOWN的实例保护起来,不会立即将其从注册表中删除。如果关闭自我保护,则DOWN的实例会立即从注册表中删除。
五、总结
本文从Eureka自我保护机制的概述、优缺点、配置和代码实现四个方面,对Eureka自我保护机制进行了详细的阐述。虽然自我保护机制可以保证整个系统的可用性,但也有一定的缺点,需要根据实际场景进行选择配置。在实际项目中,建议配置一个相对较小的超时时间,避免DEAD INSTANCE长时间占据注册表,对整个系统的性能和可用性造成不良影响。