Eureka客户端向Eureka服务端注册信息,包括ip,端口,运行状态等信息。
Eureka客户端每30s发送一次请求到Eureka服务端来续约,证明客户端正常运行。若服务端90s没有接收到客户端请求,它会将客户端从注册表中删除。
Eureka客户端每30s从服务端获取注册表信息,并将其缓存在本地。客户端根据缓存信息查调用其他实例。
Eureka客户端在程序关闭时向Eureka服务器发送取消请求。 发送请求后,该客户端实例信息将从服务器的实例注册表中删除。该下线请求不会自动完成,它需要调用以下内容:
DiscoveryManager.getInstance().shutdownComponent();
在默认的情况下,当Eureka客户端连续90秒没有向Eureka服务器发送服务续约,即心跳,Eureka服务器会将该服务实例从服务注册列表删除,即服务剔除。
自我保护机制: 好死不如赖活着
某时刻一个微服务不可用,Eureka不会立即清理,依然会对该服务信息进行保存。
默认情况下如果在一定时间内没有接受到心跳,EurakeServer会注销该实例信息,但是当网络分区出现问题时,这样会变的很危险——因为可能健康的服务被注销。EurekaServer通过自我保护模式解决这个问题:当短时间丢失过多客户端时,会进入保护机制,EurekaServer不再删除服务,当网络通信正常后自动推出保护机制。
在自我保护模式中,Eureka会保护注册表中的信息,不再注销任何服务实例.当服务的心跳回复阈值以上时,EurekaServer会自动推出保护模式。
C:\Windows\System32\drivers\etc\hosts
192.168.43.123 pactera3 pactera1 pactera2
需要在多台机器上设置域名
192.168.43.xx1 pactera1
192.168.43.xx2 pactera2
192.168.43.XX3 pactera3
server:
port: 7003
eureka:
instance:
hostname: pactera3.com # 服务实例名
client:
register-with-eureka: false # 表示自己不向服务中心组测
fetch-registry: false # 表示自己是注册中心,不去检索服务
service-url:
# 注册到其他Eureka上
defaultZone: http://pactera1:7001/eureka/,http://pactera2:7002/eureka/
eureka:
client:
service-url:
defaultZone: http://pactera1:7001/eureka/,http://pactera2:7002/eureka/,http://pactera3:7003/eureka/
参考文档:https://www.cnblogs.com/xishuai/p/spring-cloud-eureka-safe.html
期望心跳数= (count*2)*RenewalPercentThreshold
count: eureka中实例总数
RenewalPercentThreshold :实际心跳数 /期望心跳小于此值时开启自我保护,默认为0.85,以下为真实测试数据:
Renews threshold 计算方式
服务数量 | Renews threshold |
---|---|
1 | 3 |
2 | 5 |
3 | 6 |
4 | 8 |
5 | 10 |
6 | 11 |
7 | 13 |
8 | 15 |
单个eureka Renews threshold计算代码
// eureka-core com.netflix.eureka.registry.AbstractInstanceRegistry
if (this.expectedNumberOfRenewsPerMin > 0) {
// Since the client wants to cancel it, reduce the threshold
// (1
// for 30 seconds, 2 for a minute)
this.expectedNumberOfRenewsPerMin = this.expectedNumberOfRenewsPerMin + 2;
this.numberOfRenewsPerMinThreshold =
(int) (this.expectedNumberOfRenewsPerMin * serverConfig.getRenewalPercentThreshold());
}
/**
getRenewalPercentThreshold 默认为0.85
服务为0时 this.expectedNumberOfRenewsPerMin =2
服务每增加执行一次代码,eureka期望心跳数增加。
如果服务数为n, 期望心跳数 = (2*n*getRenewalPercentThreshold)
*/
多个eureka Renews threshold 计算代码
// com.netflix.eureka.registry.PeerAwareInstanceRegistryImpl
if ((count * 2) > (serverConfig.getRenewalPercentThreshold() * numberOfRenewsPerMinThreshold)
|| (!this.isSelfPreservationModeEnabled())) {
this.expectedNumberOfRenewsPerMin = count * 2;
this.numberOfRenewsPerMinThreshold = (int) ((count * 2) * serverConfig.getRenewalPercentThreshold());
}
实际心跳数 /期望心跳小于此值时开启自我保护。举例:
1. 存在2个实例,期望心跳数为(2*2)*0.85=3,如果注册间隔为30s,则实际心跳为4。此时关闭其中一个实例,则心跳数为2*1=2,2/3=0.66<0.85,开启自我保护
2. 存在10个实例,期望心跳数为(10*2)*0.85=17,如果注册间隔为30s,则实际心跳为20。此时关闭其中一个实例,则心跳数为2*9=18,18/17=>0.85,不开启自我保护