图解原理
看图说明:
1. 应用server
的服务实例一上线,就会将自己注册到Eureka Server
的注册表中;
2. 服务注册表一旦检测到有更新,就会将实例同步到读写缓存表;
3. 读写缓存表每隔30s
,就会将实例信息同步给读缓存表;
4. 应用Client
的服务,每隔30s
,就会去Eureka Server
的读缓存拉取所有的服务实例,这时候通信已经建立起来;
5. 服务注册表每隔60s
,会自检测服务状态是否有更新,如果有不可用的服务,及时剔除掉;
6. 如果在90s
这段时间内,服务实例还没发送心跳给Eureka Server
,Eureka Server
就会认为该实例的服务已经挂掉了,就会将其从注册表中剔除,并立马同步给读写缓存。
默认参数弊端
从上图可看出:
一个服务感知另一个服务上线的最久时间是: 步骤3
和步骤4
,也就是60s
;
一个服务感知另一个服务下线的最久时间是:步骤3
和步骤4
和步骤6
,也就是150s
。
稍微对时间敏感一点的项目,等这么久,是很难受的,需要进行调优。
Eureka参数调优
Eureka Server
responseCacheUpdateIntervalMs
读写缓存同步给读缓存,默认是30s
,将其改为3s
:
eureka.server.responseCacheUpdateIntervalMs = 3000
evictionIntervalTimerInMs
线程自检测时间默认是60s
,将其改为6s
:
eureka.server.evictionIntervalTimerInMs = 6000
leaseExpirationDurationInSeconds
client
心跳过期时间默认是90s
,将其改为6s
:
eureka.instance.leaseExpirationDurationInSeconds = 6
应用实例
registryFetchIntervalSeconds
去Eureka Server拉取的时间默认是30s,将其改为3s:
eureka.client.registryFetchIntervalSeconds = 3
leaseRenewalIntervalInSeconds
发送给Eureka Server的心跳时间,默认是30s,将其改为3s:
eureka.client.leaseRenewalIntervalInSeconds = 3
调优结果
一个服务感知另一个服务上线的最久时间是: 步骤3
和步骤4
,也就是6s
;
一个服务感知另一个服务下线的最久时间是:步骤3
和步骤4
和步骤6
,也就是12s