服务续约
服务续约的线程和Eureka - 服务发现中的一样,这里不再解说,咱们间接通过HeartbeatThread的run办法看renew办法。
boolean renew() { EurekaHttpResponse<InstanceInfo> httpResponse; try { // 调用EurekaServer地址+"apps/" + appName + '/' + id httpResponse = eurekaTransport.registrationClient.sendHeartBeat(instanceInfo.getAppName(), instanceInfo.getId(), instanceInfo, null); logger.debug(PREFIX + "{} - Heartbeat status: {}", appPathIdentifier, httpResponse.getStatusCode()); if (httpResponse.getStatusCode() == Status.NOT_FOUND.getStatusCode()) { REREGISTER_COUNTER.increment(); logger.info(PREFIX + "{} - Re-registering apps/{}", appPathIdentifier, instanceInfo.getAppName()); long timestamp = instanceInfo.setIsDirtyWithTime(); boolean success = register(); if (success) { instanceInfo.unsetIsDirty(timestamp); } return success; } return httpResponse.getStatusCode() == Status.OK.getStatusCode(); } catch (Throwable e) { logger.error(PREFIX + "{} - was unable to send heartbeat!", appPathIdentifier, e); return false; }}
服务注册
在Eureka - Client服务启动中提到initScheduledTasks中会调用InstanceInfoReplicator#start办法。
public void start(int initialDelayMs) { if (started.compareAndSet(false, true)) { instanceInfo.setIsDirty(); // for initial register Future next = scheduler.schedule(this, initialDelayMs, TimeUnit.SECONDS); scheduledPeriodicRef.set(next); }}
start办法会启动一个定时工作,就会调用InstanceInfoReplicator#run办法。refreshInstanceInfo会刷新数据中心信息和租约信息。
public void run() { try { // 刷新数据中心信息和租约信息。 discoveryClient.refreshInstanceInfo(); Long dirtyTimestamp = instanceInfo.isDirtyWithTime(); // 如果信息有变动,则注册 if (dirtyTimestamp != null) { // 注册,"apps/" + info.getAppName() discoveryClient.register(); instanceInfo.unsetIsDirty(dirtyTimestamp); } } catch (Throwable t) { logger.warn("There was a problem with the instance info replicator", t); } finally { // 线程用于刷新信息以及从新注册 Future next = scheduler.schedule(this, replicationIntervalSeconds, TimeUnit.SECONDS); scheduledPeriodicRef.set(next); }}
完结
直至,服务注册、服务发现、服务续约,client局部曾经讲完了。