0
点赞
收藏
分享

微信扫一扫

SpringCloud源码解析 (Eureka-Client源码解析-更新Server的注册信息) (三)


SpringCloud源码解析 (Eureka-Client源码解析-更新Server的注册信息) (三)_eureka

  1. Register: 注册者
  2. Get Registry: 得到注册表
  3. Renew: 更新
  4. Cancel: 取消
  5. Make Remote call: 进行远程呼叫

文章目录

  • ​​1.源码分析入口​​
  • ​​2. EurekaClientAutoConfiguration​​
  • ​​2.1 RefreshableEurekaClientConfiguration​​
  • ​​2.2 EurekaClient​​
  • ​​2.3 CloudEurekaClient​​
  • ​​2.4 DiscoveryClient​​
  • ​​3.从服务端获取注册表​​
  • ​​3.1 全量获取​​
  • ​​3.2 增量获取​​
  • ​​4.注册信息​​
  • ​​5.initScheduledTasks​​
  • ​​5.1 定时更新客户端注册表​​

1.源码分析入口

SpringCloud源码解析 (Eureka-Client源码解析-更新Server的注册信息) (三)_客户端_02

SpringCloud源码解析 (Eureka-Client源码解析-更新Server的注册信息) (三)_java_03

SpringCloud源码解析 (Eureka-Client源码解析-更新Server的注册信息) (三)_ide_04

2. EurekaClientAutoConfiguration

EurekaClientAutoConfiguration -> RefreshableEurekaClientConfiguration -> EurekaClient ->

2.1 RefreshableEurekaClientConfiguration

RefreshableEurekaClientConfiguration()

SpringCloud源码解析 (Eureka-Client源码解析-更新Server的注册信息) (三)_spring cloud_05

2.2 EurekaClient

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

SpringCloud源码解析 (Eureka-Client源码解析-更新Server的注册信息) (三)_java_06

2.3 CloudEurekaClient

SpringCloud源码解析 (Eureka-Client源码解析-更新Server的注册信息) (三)_eureka_07

2.4 DiscoveryClient

4个参数:

SpringCloud源码解析 (Eureka-Client源码解析-更新Server的注册信息) (三)_ide_08


3个参数:

SpringCloud源码解析 (Eureka-Client源码解析-更新Server的注册信息) (三)_eureka_09

3.从服务端获取注册表

SpringCloud源码解析 (Eureka-Client源码解析-更新Server的注册信息) (三)_客户端_10

5参数中间的方法:

SpringCloud源码解析 (Eureka-Client源码解析-更新Server的注册信息) (三)_java_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源码解析-更新Server的注册信息) (三)_java_12


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

3.1 全量获取

SpringCloud源码解析 (Eureka-Client源码解析-更新Server的注册信息) (三)_spring cloud_13


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

SpringCloud源码解析 (Eureka-Client源码解析-更新Server的注册信息) (三)_eureka_14

SpringCloud源码解析 (Eureka-Client源码解析-更新Server的注册信息) (三)_客户端_15


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

3.2 增量获取

  1. getDelta()

SpringCloud源码解析 (Eureka-Client源码解析-更新Server的注册信息) (三)_客户端_16


SpringCloud源码解析 (Eureka-Client源码解析-更新Server的注册信息) (三)_spring cloud_17

SpringCloud源码解析 (Eureka-Client源码解析-更新Server的注册信息) (三)_eureka_18

  1. getAndStoreFullRegistry

SpringCloud源码解析 (Eureka-Client源码解析-更新Server的注册信息) (三)_客户端_19

SpringCloud源码解析 (Eureka-Client源码解析-更新Server的注册信息) (三)_java_20


SpringCloud源码解析 (Eureka-Client源码解析-更新Server的注册信息) (三)_spring cloud_21

SpringCloud源码解析 (Eureka-Client源码解析-更新Server的注册信息) (三)_客户端_22

  1. updateDelta()

SpringCloud源码解析 (Eureka-Client源码解析-更新Server的注册信息) (三)_java_23

SpringCloud源码解析 (Eureka-Client源码解析-更新Server的注册信息) (三)_客户端_24


SpringCloud源码解析 (Eureka-Client源码解析-更新Server的注册信息) (三)_客户端_25

4.注册信息

SpringCloud源码解析 (Eureka-Client源码解析-更新Server的注册信息) (三)_spring cloud_26

DiscoveryClient -> registry()

SpringCloud源码解析 (Eureka-Client源码解析-更新Server的注册信息) (三)_java_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源码解析-更新Server的注册信息) (三)_java_28


发送post请求

SpringCloud源码解析 (Eureka-Client源码解析-更新Server的注册信息) (三)_客户端_29

5.initScheduledTasks

5.1 定时更新客户端注册表

SpringCloud源码解析 (Eureka-Client源码解析-更新Server的注册信息) (三)_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源码解析-更新Server的注册信息) (三)_spring cloud_31


SpringCloud源码解析 (Eureka-Client源码解析-更新Server的注册信息) (三)_spring cloud_32


SpringCloud源码解析 (Eureka-Client源码解析-更新Server的注册信息) (三)_ide_33


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

SpringCloud源码解析 (Eureka-Client源码解析-更新Server的注册信息) (三)_spring cloud_34

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

SpringCloud源码解析 (Eureka-Client源码解析-更新Server的注册信息) (三)_客户端_35


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


举报

相关推荐

Eureka服务端源码解析

0 条评论