从入口按顺序:缓存
eureka-client
获取服务对应的节点列表,存储在本地缓存;经过定时任务,定时刷新缓存数据,定时任务默认30秒执行一次。Eureka-Client:spa
eureka-server
获取服务列表,存入本地缓存,定时任务默认30秒执行一次。code
跟本地生成的code
作比较,若是不一致,就调用全量接口从新获取全部服务。续租/renew
,默认30秒一次。Eureka-Server:code
缓存:共三级缓存,能够经过配置关闭第一级缓存,默认是开启。server
readOnlyCacheMap
:经过定时任务,定时从二级缓存中获取数据并刷新当前值,定时任务默认30秒执行一次。readWriteCacheMap
:经过guava cache
实现缓存机制,默认是从写入时间起算,30秒以后过时
;服务信息有变更时,会实时修改二级缓存数据(其实是清理掉缓存,下次读取数据时,会从下一级获取数据并存储缓存)。registry
:从不一样维度存储服务信息(好比ALL_APPS
存储全部服务列表,ALL_APPS_DELTA
存储最新变动列表,服务名
存储服务对应的信息列表);服务信息有变更时,会实时修改数据。下线:定时任务定时清理长时间未续租/renew
的节点。blog
续租/renew
的节点。总体流程以下:接口
相关配置:
Ribbon:进程
配置参数 | 默认(秒) | 说明 |
---|---|---|
ribbon.ServerListRefreshInterval | 30 | 本地服务列表缓存更新周期 |
Euraka-Client:get
配置参数 | 默认(秒) | 说明 |
---|---|---|
eureka.client.registryFetchIntervalSeconds | 30 | 本地服务列表缓存更新周期,(正常状况下增量更新,第一次或与 Server 端不一致等状况则全量更新) |
eureka.instance.leaseRenewalIntervalInSeconds | 30 | 续约周期 |
Euraka-Server:it
配置参数 | 默认(秒) | 说明 |
---|---|---|
eureka.server.useReadOnlyResponseCache | true | 是否开启readOnlyCacheMap 缓存 |
eureka.server.responsecCacheUpdateIntervalMs | 30 | readOnlyCacheMap 缓存更新周期 |
eureka.server.evictionIntervalTimerInMs | 60 | 清理/下线长时间未续租节点周期 |
eureka.instance.leaseExpirationDurationInSeconds | 90 | 未续租节点超时时间,超过这个时间,就会被清理任务清理掉 |
默认配置下服务消费者最长感知时间:io
Eureka-Client | 时间(秒) | 说明 |
---|---|---|
上线 | 30(readOnly)+30(Client)+30(Ribbon)=90 | readWrite -> readOnly -> Client -> Ribbon 各 30s |
正常下线 | 30(readonly)+30(Client)+30(Ribbon)=90 | 服务正常下线(kill 或 kill -15 杀死进程)会给进程善后机会,<br/>DiscoveryClient.shutdown() 将向 Server 更新自身状态为 DOWN,<br/>而后发送 DELETE 请求注销本身,registry 和 readWriteCacheMap 实时更新,故 UI 将再也不显示该服务实例 |
非正常下线 | 60+90+30+30+30=240 | 服务非正常下线(kill -9 杀死进程或进程崩溃)不会触发 DiscoveryClient.shutdown() 方法,<br/>Eureka Server 将依赖每 60s 清理超过 90s 未续约服务从 registry 和 readWriteCacheMap 中删除该服务实例 |
考虑以下状况:
因为eureka-server
分批下线机制(最多25%),若是同时有大批量节点下线的话(超过25%,未达到自我保护机制阈值,或者未开启自我保护机制),有的服务节点还会超过240秒。
参考:
《 详解Eureka缓存机制》