1. 概述
Eureka集群没有主从概念,所有节点全部平等,集群间数据通过5个Http接口完成数据同步,下面介绍这几种接口以及同步流程。
2. 同步流程

1) Get-获取注册列表
假设Eureka1服务最早启动,Eureka2服务启动时将Eureka1作为自己的上报服务(每个Eureka-Client只给一个Eureka-Server上报信息),首先调用GET /eureka/apps/
获取已有注册列表。
GET /eureka/apps/ HTTP/1.1
Accept application/json
DiscoveryIdentity-Name DefaultClient
DiscoveryIdentity-Version 1.4
DiscoveryIdentity-Id 10.10.11.9
Accept-Encoding gzip
Host 10.10.11.9:8082
User-Agent Java-EurekaClient/v1.6.2
Authorization Basic ZGRzaHVhaToxMjM0NTY=
Connection keep-alive
{
"applications": {
"versions__delta": "1",
"apps__hashcode": "UP_1_",
"application": [{
"name": "ZUUL-DEV",
"instance": [{
"instanceId": "10.10.11.9:28723",
"hostName": "10.10.11.9",
"app": "ZUUL-DEV",
"ipAddr": "10.10.11.9",
"status": "UP",
"overriddenstatus": "UNKNOWN",
"port": {
"$": 28723,
"@enabled": "true"
},
"securePort": {
"$": 443,
"@enabled": "false"
},
"countryId": 1,
"dataCenterInfo": {
"@class": "com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo",
"name": "MyOwn"
},
"leaseInfo": {
"renewalIntervalInSecs": 30,
"durationInSecs": 90,
"registrationTimestamp": 1544160173785,
"lastRenewalTimestamp": 1544160173785,
"evictionTimestamp": 0,
"serviceUpTimestamp": 1544160173786
},
"metadata": {
"@class": "java.util.Collections$EmptyMap"
},
"homePageUrl": "http://10.10.11.9:28723/",
"statusPageUrl": "http://10.10.11.9:28723/info",
"healthCheckUrl": "http://10.10.11.9:28723/health",
"vipAddress": "zuul-dev",
"secureVipAddress": "zuul-dev",
"isCoordinatingDiscoveryServer": "false",
"lastUpdatedTimestamp": "1544160173786",
"lastDirtyTimestamp": "1544160168179",
"actionType": "ADDED"
}]
}]
}
}
2) Post-注册服务
获取到注册列表后,将自己添加到注册列表中,并发送注册信息到Eureka1上
POST /eureka/apps/EUREKA-SERVER HTTP/1.1
Accept-Encoding gzip
Content-Type application/json
Accept application/json
DiscoveryIdentity-Name DefaultClient
DiscoveryIdentity-Version 1.4
DiscoveryIdentity-Id 10.10.11.9
Content-Length 877
Host 10.177.14.9:28721
User-Agent Java-EurekaClient/v1.6.2
Authorization Basic ZGRzaHVhaToxMjM0NTY=
Connection keep-alive
{
"instance": {
"instanceId": "10.10.11.9:8082",
"hostName": "10.10.11.9",
"app": "EUREKA-SERVER",
"ipAddr": "10.10.11.9",
"status": "DOWN",
"overriddenstatus": "UNKNOWN",
"port": {
"$": 8082,
"@enabled": "true"
},
"securePort": {
"$": 443,
"@enabled": "false"
},
"countryId": 1,
"dataCenterInfo": {
"@class": "com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo",
"name": "MyOwn"
},
"leaseInfo": {
"renewalIntervalInSecs": 30,
"durationInSecs": 90,
"registrationTimestamp": 0,
"lastRenewalTimestamp": 0,
"evictionTimestamp": 0,
"serviceUpTimestamp": 0
},
"metadata": {
"@class": "java.util.Collections$EmptyMap"
},
"homePageUrl": "http://10.10.11.9:8082/",
"statusPageUrl": "http://10.10.11.9:8082/info",
"healthCheckUrl": "http://10.10.11.9:8082/health",
"vipAddress": "eureka-server",
"secureVipAddress": "eureka-server",
"isCoordinatingDiscoveryServer": "false",
"lastUpdatedTimestamp": "1544159697067",
"lastDirtyTimestamp": "1544164155198"
}
}
3. Post-广播2步骤的节点新增信息
将Eureka2注册的事件写入自己的注册列表中,并以广播的形式通知剩余全部节点,收到通知的服务将Eureka2注册到自己的注册列表中
POST /eureka/peerreplication/batch/ HTTP/1.1
Accept application/json
Content-Type application/json
DiscoveryIdentity-Name DefaultServer
DiscoveryIdentity-Version 1.0
DiscoveryIdentity-Id 10.10.11.9
Accept-Encoding gzip
Content-Length 1026
Host 10.177.14.9:28721
User-Agent Java-EurekaClient-Replication/v1.6.2
Authorization Basic ZGRzaHVhaToxMjM0NTY=
Connection keep-alive
{
"replicationList": [{
"appName": "ZUUL-DEV",
"id": "10.10.11.9:28723",
"lastDirtyTimestamp": 1544160168179,
"status": "UP",
"instanceInfo": {
"instanceId": "10.10.11.9:28723",
"hostName": "10.10.11.9",
"app": "ZUUL-DEV",
"ipAddr": "10.10.11.9",
"status": "UP",
"overriddenstatus": "UNKNOWN",
"port": {
"$": 28723,
"@enabled": "true"
},
"securePort": {
"$": 443,
"@enabled": "false"
},
"countryId": 1,
"dataCenterInfo": {
"@class": "com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo",
"name": "MyOwn"
},
"leaseInfo": {
"renewalIntervalInSecs": 30,
"durationInSecs": 90,
"registrationTimestamp": 0,
"lastRenewalTimestamp": 0,
"evictionTimestamp": 0,
"serviceUpTimestamp": 0
},
"metadata": {
"@class": "java.util.Collections$EmptyMap"
},
"homePageUrl": "http://10.10.11.9:28723/",
"statusPageUrl": "http://10.10.11.9:28723/info",
"healthCheckUrl": "http://10.10.11.9:28723/health",
"vipAddress": "zuul-dev",
"secureVipAddress": "zuul-dev",
"isCoordinatingDiscoveryServer": "false",
"lastUpdatedTimestamp": "1544160173786",
"lastDirtyTimestamp": "1544160168179",
"actionType": "ADDED"
},
"action": "Register"
}]
}
4) Get-获取注册列表变化信息
这次与第一步骤类似,但是这次只获取注册列表的变化信息。
GET /eureka/apps/delta HTTP/1.1
Accept application/json
DiscoveryIdentity-Name DefaultClient
DiscoveryIdentity-Version 1.4
DiscoveryIdentity-Id 10.10.11.9
Accept-Encoding gzip
Host 10.177.14.9:28721
User-Agent Java-EurekaClient/v1.6.2
Authorization Basic ZGRzaHVhaToxMjM0NTY=
Connection keep-alive
{
"applications": {
"versions__delta": "167299",
"apps__hashcode": "UP_20_",
"application": []
}
}
5) 每30s上报一次健康心跳
Eureka2之后每30s向Eureka1上报健康信息,也就是续约。
PUT /eureka/apps/EUREKA-SERVER/10.10.11.9:8082?status=UP&lastDirtyTimestamp=1544159712387 HTTP/1.1
DiscoveryIdentity-Name DefaultClient
DiscoveryIdentity-Version 1.4
DiscoveryIdentity-Id 10.10.11.9
Accept-Encoding gzip
Content-Length 0
Host 10.177.14.9:28721
User-Agent Java-EurekaClient/v1.6.2
Authorization Basic ZGRzaHVhaToxMjM0NTY=
Connection keep-alive
6.) Post-广播心跳信息
过程与第二步一致。
3. 其他知识点
1) 自我保护机制

自我保护机制的工作机制是:如果在15分钟内超过85%的客户端节点都没有正常的心跳,那么Eureka就认为客户端与注册中心出现了网络故障,Eureka Server自动进入自我保护机制,此时会出现以下几种情况:
- Eureka Server不再从注册列表中移除因为长时间没收到心跳而应该过期的服务。
- Eureka Server仍然能够接受新服务的注册和查询请求,但是不会被同步到其它节点上,保证当前节点依然可用。
- 当网络稳定时,当前Eureka Server新的注册信息会被同步到其它节点中。
因此Eureka Server可以很好的应对因网络故障导致部分节点失联的情况,而不会像ZK那样如果有一半不可用的情况会导致整个集群不可用而变成瘫痪。
2) 缓存机制
Eureka Server存在三个变量:(registry、readWriteCacheMap、readOnlyCacheMap)保存服务注册信息,默认情况下定时任务每30s将readWriteCacheMap同步至readOnlyCacheMap,每60s清理超过90s未续约的节点,Eureka Client每30s从readOnlyCacheMap更新服务注册信息,而UI则从registry更新服务注册信息。
网友评论