0
点赞
收藏
分享

微信扫一扫

SpringCloud源码解析 (Eureka-Client源码解析) (三)


SpringCloud源码解析 (Eureka-Client源码解析) (三)_java


文章目录

  • ​​1.入口​​
  • ​​2. EurekaClientAutoConfiguration​​
  • ​​3.从服务端获取注册表​​
  • ​​3.1 全量获取​​
  • ​​3.2 增量获取​​
  • ​​4.注册信息​​
  • ​​5.initScheduledTasks​​
  • ​​5.1 定时更新客户端注册表​​

1.入口

SpringCloud源码解析 (Eureka-Client源码解析) (三)_eureka_02

SpringCloud源码解析 (Eureka-Client源码解析) (三)_ide_03

SpringCloud源码解析 (Eureka-Client源码解析) (三)_spring cloud_04

2. EurekaClientAutoConfiguration

RefreshableEurekaClientConfiguration()

SpringCloud源码解析 (Eureka-Client源码解析) (三)_客户端_05

eurekaClient() -> CloudEurekaClient cloudEurekaClient = new CloudEurekaClient()

SpringCloud源码解析 (Eureka-Client源码解析) (三)_eureka_06

CloudEurekaClient

SpringCloud源码解析 (Eureka-Client源码解析) (三)_spring cloud_07

DiscoveryClient

4个参数:

SpringCloud源码解析 (Eureka-Client源码解析) (三)_spring cloud_08

3个参数:

SpringCloud源码解析 (Eureka-Client源码解析) (三)_spring cloud_09

3.从服务端获取注册表

SpringCloud源码解析 (Eureka-Client源码解析) (三)_eureka_10

5参数中间的方法:

SpringCloud源码解析 (Eureka-Client源码解析) (三)_客户端_11

private boolean fetchRegistry(boolean forceFullRegistryFetch) {
Stopwatch tracer = FETCH_REGISTRY_TIMER.start();

try {
// If the delta is disabled or if it is the first time, get all
// applications
Applications applications = getApplications();

if (clientConfig.shouldDisableDelta()
|| (!Strings.isNullOrEmpty(clientConfig.getRegistryRefreshSingleVipAddress()))
|| forceFullRegistryFetch
|| (applications == null)
|| (applications.getRegisteredApplications().size() == 0)
|| (applications.getVersion() == -1)) //Client application does not have latest library supporting delta
{
logger.info("Disable delta property : {}", clientConfig.shouldDisableDelta());
logger.info("Single vip registry refresh property : {}", clientConfig.getRegistryRefreshSingleVipAddress());
logger.info("Force full registry fetch : {}", forceFullRegistryFetch);
logger.info("Application is null : {}", (applications == null));
logger.info("Registered Applications size is zero : {}",
(applications.getRegisteredApplications().size() == 0));
logger.info("Application version is -1: {}", (applications.getVersion() == -1));
getAndStoreFullRegistry();
} else {
getAndUpdateDelta(applications);
}
applications.setAppsHashCode(applications.getReconcileHashCode());
logTotalInstances();
} catch (Throwable e) {
logger.error(PREFIX + "{} - was unable to refresh its cache! status = {}", appPathIdentifier, e.getMessage(), e);
return false;
} finally {
if (tracer != null) {
tracer.stop();
}
}

// Notify about cache refresh before updating the instance remote status
onCacheRefreshed();

// Update remote status based on refreshed data held in the cache
updateInstanceRemoteStatus();

// registry was fetched successfully, so return true
return true;
}

SpringCloud源码解析 (Eureka-Client源码解析) (三)_ide_12

第一次获取为全量获取, 后面都是增量获取。

3.1 全量获取

SpringCloud源码解析 (Eureka-Client源码解析) (三)_ide_13

这里是一个判断: 如果得到的VIP用户全量为空的话获取全量, 如果不为空的话获取VIP全量

AbstractJerseyEurekaHttpClient.getApplications():

SpringCloud源码解析 (Eureka-Client源码解析) (三)_eureka_14

SpringCloud源码解析 (Eureka-Client源码解析) (三)_java_15

最后发送的是get请求, 获取到注册表

3.2 增量获取

  1. getDelta()

SpringCloud源码解析 (Eureka-Client源码解析) (三)_eureka_16

SpringCloud源码解析 (Eureka-Client源码解析) (三)_客户端_17

SpringCloud源码解析 (Eureka-Client源码解析) (三)_spring cloud_18

  1. getAndStoreFullRegistry

SpringCloud源码解析 (Eureka-Client源码解析) (三)_ide_19

SpringCloud源码解析 (Eureka-Client源码解析) (三)_java_20

SpringCloud源码解析 (Eureka-Client源码解析) (三)_客户端_21

SpringCloud源码解析 (Eureka-Client源码解析) (三)_spring cloud_22

  1. updateDelta()

SpringCloud源码解析 (Eureka-Client源码解析) (三)_eureka_23

SpringCloud源码解析 (Eureka-Client源码解析) (三)_ide_24

SpringCloud源码解析 (Eureka-Client源码解析) (三)_ide_25

4.注册信息

SpringCloud源码解析 (Eureka-Client源码解析) (三)_java_26

DiscoveryClient -> registry()

SpringCloud源码解析 (Eureka-Client源码解析) (三)_eureka_27

boolean register() throws Throwable {
logger.info(PREFIX + "{}: registering service...", appPathIdentifier);
EurekaHttpResponse<Void> httpResponse;
try {
httpResponse = eurekaTransport.registrationClient.register(instanceInfo);
} catch (Exception e) {
logger.warn(PREFIX + "{} - registration failed {}", appPathIdentifier, e.getMessage(), e);
throw e;
}
if (logger.isInfoEnabled()) {
logger.info(PREFIX + "{} - registration status: {}", appPathIdentifier, httpResponse.getStatusCode());
}
return httpResponse.getStatusCode() == Status.NO_CONTENT.getStatusCode();
}

SpringCloud源码解析 (Eureka-Client源码解析) (三)_spring cloud_28

发送post请求

SpringCloud源码解析 (Eureka-Client源码解析) (三)_ide_29

5.initScheduledTasks

5.1 定时更新客户端注册表

SpringCloud源码解析 (Eureka-Client源码解析) (三)_java_30

if (clientConfig.shouldFetchRegistry()) {
// registry cache refresh timer
int registryFetchIntervalSeconds = clientConfig.getRegistryFetchIntervalSeconds();
int expBackOffBound = clientConfig.getCacheRefreshExecutorExponentialBackOffBound();
scheduler.schedule(
new TimedSupervisorTask(
"cacheRefresh",
scheduler,
cacheRefreshExecutor,
registryFetchIntervalSeconds,
TimeUnit.SECONDS,
expBackOffBound,
new CacheRefreshThread()
),
registryFetchIntervalSeconds, TimeUnit.SECONDS);
}

SpringCloud源码解析 (Eureka-Client源码解析) (三)_spring cloud_31

SpringCloud源码解析 (Eureka-Client源码解析) (三)_客户端_32

SpringCloud源码解析 (Eureka-Client源码解析) (三)_java_33

这里加了锁, 因为这是共享数据, 为迭代稳定性代码。

SpringCloud源码解析 (Eureka-Client源码解析) (三)_eureka_34

如果是全量注册的话:同上

SpringCloud源码解析 (Eureka-Client源码解析) (三)_客户端_35

如果是增强注册的话:同上



举报

相关推荐

0 条评论