当客户端请求全量更新的时候,会调用ApplicationsResource#getContainers这个方法。如果是增量,会调用ApplicationsResource#getContainerDifferential这个方法。他主要是获取只读缓存的内容,如果只读缓存不存在,返回只读读写缓存的内容。

public Response getContainers(@PathParam("version") String version,

@HeaderParam(HEADER_ACCEPT) String acceptHeader,

@HeaderParam(HEADER_ACCEPT_ENCODING) String acceptEncoding,

@HeaderParam(EurekaAccept.HTTP_X_EUREKA_ACCEPT) String eurekaAccept,

@Context UriInfo uriInfo,

@Nullable @QueryParam("regions") String regionsStr) {

//其他略

response = Response.ok(responseCache.get(cacheKey))

.build();

//其他略

CurrentRequestVersion.remove();

return response;

}

public String get(final Key key) {

return get(key, shouldUseReadOnlyResponseCache);

}

@VisibleForTesting

String get(final Key key, boolean useReadOnlyCache) {

Value payload = getValue(key, useReadOnlyCache);

if (payload == null || payload.getPayload().equals(EMPTY_PAYLOAD)) {

return null;

} else {

return payload.getPayload();

}

}

@VisibleForTesting

Value getValue(final Key key, boolean useReadOnlyCache) {

Value payload = null;

try {

//使用只读缓存

if (useReadOnlyCache) {

// 如果只读缓存有值,返回只读缓存的,如果没值,返回读写缓存

final Value currentPayload = readOnlyCacheMap.get(key);

if (currentPayload != null) {

payload = currentPayload;

} else {

payload = readWriteCacheMap.get(key);

readOnlyCacheMap.put(key, payload);

}

} else {

payload = readWriteCacheMap.get(key);

}

} catch (Throwable t) {

logger.error("Cannot get value for key : {}", key, t);

}

return payload;

}

上面的代码流程如下:

readOnlyCacheMap的值是怎么来的呢?

Eureka – Server服务启动PeerAwareInstanceRegistry#init方法中提到了ResponseCacheImpl构造函数中,没30秒会把readWriteCacheMap的值赋值给readOnlyCacheMap。

ResponseCacheImpl初始化的时候,我们看到他默认180秒后会过期。

this.readWriteCacheMap =

CacheBuilder.newBuilder().initialCapacity(serverConfig.getInitialCapacityOfResponseCache())

.expireAfterWrite(serverConfig.getResponseCacheAutoExpirationInSeconds(), TimeUnit.SECONDS)

// 其他略;

Eureka – Server服务启动中提到,PeerAwareInstanceRegistryImpl#syncUp()每次注册都会主动清空readWriteCacheMap的值。

ResponseCacheImpl初始化的时候,还有一个build方法

this.readWriteCacheMap =

CacheBuilder.newBuilder().initialCapacity(serverConfig.getInitialCapacityOfResponseCache())

// 其他略

.build(new CacheLoader() {

@Override

public Value load(Key key) throws Exception {

if (key.hasRegions()) {

Key cloneWithNoRegions = key.cloneWithoutRegions();

regionSpecificKeys.put(cloneWithNoRegions, key);

}

Value value = generatePayload(key);

return value;

}

});

当readWriteCacheMap没有值的时候,他会调用load方法。如果是全量,就会调用registry.getApplications()这个方法,如果是增量会调用registry.getApplicationDeltas(),直接从注册表数据拿值。

所以在服务发现的时候,都是走缓存,提高效率,但是为了保证数据的一致性,还会定期更新、清空缓存。

java服务发现_【Java】Eureka – 服务发现(Server)相关推荐

  1. java取负数_[Java] 告别“CV 工程师”码出高效!(基础篇)

    作为一名资深的 CV 工程师,某天,当我再一次日常看见满屏的报错信息与键盘上已经磨的泛白的 Ctrl.C.V 这三个按键时,我顿悟了. 百度谷歌复制粘贴虽然很香,但是总是依靠前人种树,终会有一天失去乘 ...

  2. php分布式微服务开发_分布式微服务架构

    学习.跳槽涨薪?请关注 随着业务的不断发展, 用户体量的快速扩张. 从单体/垂直架构转移到分布式/微服务架构是自然而然的选择. 01 分布式理论 分布式理论是分布式系统的基础, 在任何情况下分布式系统 ...

  3. java resources 目录_[Java] 在 jar 文件中读取 resources 目录下的文件

    注意两点: 1. 将资源目录添加到 build path,确保该目录下的文件被拷贝到 jar 文件中. 2. jar 内部的东西,可以当作 stream 来读取,但不应该当作 file 来读取. 例子 ...

  4. java控制语句练习题_[Java初探实例篇02]__流程控制语句知识相关的实例练习

    本例就流程控制语句的应用方面,通过三个练习题来深入学习和巩固下学习的流程控制语句方面的知识,设计到,if条件判断语句,switch多分支语句,for循环语句及其嵌套多层使用,while循环语句. 练习 ...

  5. java 文本压缩_[Java基础]Java使用GZIP进行文本压缩

    import java.io.IOException; import java.util.zip.GZIPOutputStream; import org.apache.commons.io.outp ...

  6. java private 对象_[Java笔记]类的所有构造器都是private权限,就一定没有办法实例化它的对象了么?...

    笔者以前学过C++语言.众所周知,C++也是一门面向对象程序设计语言.还记得当时在大学的时候,老师讲过这样的话:类的构造函数不应该设置成private权限,这样的话还怎么去实例化类的对象?当时也信以为 ...

  7. java斗地主发牌_[Java源码]扑克牌——斗地主发牌实现

    --------------------------------------- --------------------------------------- ----------一个扑克牌核心和简单 ...

  8. java小朋友猜拳_[Java教程]Java猜拳小游戏(剪刀、石头、布)

    [Java教程]Java猜拳小游戏(剪刀.石头.布) 0 2015-09-29 08:00:04 import java.util.Random;import java.util.Scanner;pu ...

  9. java星空屏幕_[Java教程]窗口设置_星空网

    窗口设置 2016-04-13 0 /** * 这个是GUI的事例程序: * */ package w160412.wang.main;import java.awt.Color; import ja ...

  10. java分布式系统开发_从微服务到分布式系统-Java开发人员生存指南

    java分布式系统开发 感觉像是对微服务的炒作正在慢慢地落到实处,并且我们的行业开始意识到,根据微服务背后的体系结构范式无法通过仅在现有组件之上公开一些HTTP接口来轻松创建一个系统. . 我们似乎确 ...

最新文章

  1. OAuth2.0认证和授权原理
  2. 研究生的研究人员发展课程
  3. 计算机网络(网络层,运输层和应用层的一些tips)
  4. 自定义dialog弹窗html,自定义H5页面dialog弹窗
  5. 使用Arquillian和LocalStack脱机测试AWS云堆栈
  6. 数组中最大连续子数组和,最大连续子数组积,最大递增子序列
  7. linux 云主机安装方法,虚拟主机linux服务器安装教程
  8. CS231n李飞飞计算机视觉 循环神经网络
  9. 获取高程数据以及转灰度图和裁剪操作
  10. Lenovo Quick Fix:关闭或开启Win10系统的自动更新
  11. 全栈项目-乐优商场-通用工具服务-通用异常处理
  12. PHP GD库 教程
  13. ssm教务系统网站毕业设计源码290915
  14. 十年之后再看,腾讯位置服务的发展与腾讯地图的融合
  15. 清理 Anaconda 的 pkgs
  16. Android编译命令m、mm、mmm区别及工程搭建示例
  17. python递归函数例题_递归案例python
  18. 十一、多相流模型-VOF
  19. 风控指标 —— KS
  20. 可以测试流放之路伤害的软件,测试平台及细节一览 - 《流放之路》国服硬件需求测试:低配也能续写ARPG传奇 - 超能网...

热门文章

  1. 备库由于表无主键导致延迟
  2. vs2010变的特别卡解决办法
  3. Rman 非catalog恢复
  4. 深入浅出MySQL出版了
  5. 前后端分离 与 不分离
  6. Spring Boot Actuator [监控与管理]
  7. this,super关键字的使用
  8. Jsoup实现java模拟登陆
  9. shell里执行执行mysql 语句
  10. Vue插槽(solt)简单案例