Spring Cloud Eureka 全解 (2)

Stella981
• 阅读 633

本文基于SpringCloud-Dalston.SR5

之前我们看过这个整体流程图: Spring Cloud Eureka 全解 (2)

接下来我们来仔细分析下这个流程,先不涉及源代码,只说流程

服务提供者EurekaClient -> EurekaServer

每个服务会生成自己的InstanceInfo: Spring Cloud Eureka 全解 (2)

除了这些,还有两个比较重要的配置

服务过期时间配置:eureka.instance.lease-expiration-duration-in-seconds

服务刷新时间配置:eureka.instance.lease-renewal-interval-in-seconds

EurekaServer会根据服务过期时间清理过期实例,同时会定时调用renew接口维持心跳,这个心跳周期由服务刷新时间配置决定。

同时,在实例初始化之后,服务提供者通过register接口注册实例。每隔服务信息更新时间检查本地信息是否过期,如果过期通过register接口更新InstanceInfo

服务信息更新时间配置(一般不配置,因为实例信息基本不会更新):eureka.client.instance-info-replication-interval-seconds

EurekaServer内部缓存

服务实例注册,会放入registry这个ConcurrentHashMap中:

 private final ConcurrentHashMap<String, Map<String, Lease<InstanceInfo>>> registry
            = new ConcurrentHashMap<String, Map<String, Lease<InstanceInfo>>>();

其实就是把客户端生成的InstanceInfo放入这个registry的Map中。但是在服务消费者EurekaClient端获取所有服务与实例列表,并不是直接读取这个registry,而是从ResponseCache中获取。

ResponseCache包括两部分:ReadWriteMap和ReadOnlyMap;ReadWriteMap 就是一个Guava的LoadingCache。 在EurekaServer端,所有的读取请求都是读的ReadOnlyMap(这个可以配置),如果不存在则读取ReadWriteMap,如果不存在就从Registry拉取(LoadingCache的机制),实例信息更新会主动失效ReadWriteMap触发从Registry拉取。 ReadWriteMap比Registry多了两个key(ALL_APP还有ALL_APP_DELTA)

有定时任务会定时从ReadWriteMap同步到ReadOnlyMap这个时间配置是:eureka server刷新readCacheMap的时间,注意,client读取的是readCacheMap,这个时间决定了多久会把readWriteCacheMap的缓存更新到readCacheMap上

eureka server刷新readCacheMap的时间配置:eureka.server.responseCacheUpdateInvervalMs

ReadWriteMap是一个LoadingCache,将Registry中的服务实例信息封装成要返回的http响应(分别是经过gzip压缩和非压缩的),同时还有两个特殊key,ALL_APPS和ALL_APPS_DELTA ALL_APPS就是所有服务实例信息 ALL_APPS_DELTA就是所有服务实例增量信息

这里面其中的内容,我们先不考虑;

EurekaServer内部有定时任务,每隔检查过期实例时间,扫描Registry里面过期的实例并删除,并且使对应的ReadWriteMap缓存失效:

检查过期实例时间配置:eureka.server.eviction-interval-timer-in-ms

EurekaServer -> 服务消费者EurekaClient

每隔增量获取服务列表时间配置向EurekaServer请求一次增量服务实例列表集合

增量获取服务列表时间配置:eureka.client.registryFetchIntervalSeconds

同时,SpringCloud环境下服务消费者调用一般用Ribbon做负载均衡,从Eureka所有服务所有实例缓存到Ribbon某个服务所有实例缓存,也是有定时任务,每隔Ribbon服务实例列表刷新时间同步

Ribbon服务实例列表刷新时间配置:ribbon.ServerListRefreshInterval

点赞
收藏
评论区
推荐文章
blmius blmius
1年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
光头强的博客 光头强的博客
5个月前
Java面向对象试题
1、请创建一个Animal动物类,要求有方法eat()方法,方法输出一条语句“吃东西”。创建一个接口A,接口里有一个抽象方法fly()。创建一个Bird类继承Animal类并实现接口A里的方法输出一条有语句“鸟儿飞翔”,重写eat()方法输出一条语句“鸟儿吃虫”。在Test类中向上转型创建b对象,调用eat方法。然后向下转型调用eat()方
刚刚好 刚刚好
5个月前
css问题
1、在IOS中图片不显示(给图片加了圆角或者img没有父级)<div<imgsrc""/</divdiv{width:20px;height:20px;borderradius:20px;overflow:h
小森森 小森森
5个月前
校园表白墙微信小程序V1.0 SayLove -基于微信云开发-一键快速搭建,开箱即用
后续会继续更新,敬请期待2.0全新版本欢迎添加左边的微信一起探讨!项目地址:(https://www.aliyun.com/activity/daily/bestoffer?userCodesskuuw5n)\2.Bug修复更新日历2.情侣脸功能大家不要使用了,现在阿里云的接口已经要收费了(土豪请随意),\\和注意
晴空闲云 晴空闲云
5个月前
css中box-sizing解放盒子实际宽高计算
我们知道传统的盒子模型,如果增加内边距padding和边框border,那么会撑大整个盒子,造成盒子的宽度不好计算,在实务中特别不方便。boxsizing可以设置盒模型的方式,可以很好的设置固定宽高的盒模型。盒子宽高计算假如我们设置如下盒子:宽度和高度均为200px,那么这会这个盒子实际的宽高就都是200px。但是当我们设置这个盒子的边框和内间距的时候,那
艾木酱 艾木酱
5个月前
快速入门|使用MemFire Cloud构建React Native应用程序
MemFireCloud是一款提供云数据库,用户可以创建云数据库,并对数据库进行管理,还可以对数据库进行备份操作。它还提供后端即服务,用户可以在1分钟内新建一个应用,使用自动生成的API和SDK,访问云数据库、对象存储、用户认证与授权等功能,可专
Stella981 Stella981
1年前
Spring Cloud Eureka 全解 (3)
本文基于SpringCloudDalston.SR5(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fcloud.spring.io%2Fspringcloudstatic%2FDalston.SR5%2F)关于服务注册开启/关闭服务注册配置:eureka.
Stella981 Stella981
1年前
Golang注册Eureka的工具包goeureka发布
1.简介提供Go微服务客户端注册到Eureka中心。点击:github地址(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fgithub.com%2FSimonWang00%2Fgoeureka),欢迎各位多多star!(已通过测试验证,用于正式生产部署)2.原理
Stella981 Stella981
1年前
Spring Cloud Eureka 全解 (1)
系列目录:SpringCloudEureka全解(1)总览篇(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fzhuanlan.zhihu.com%2Fp%2F34976125)SpringCloudEureka全解(2)整体流
helloworld_28799839 helloworld_28799839
5个月前
常用知识整理
Javascript判断对象是否为空jsObject.keys(myObject).length0经常使用的三元运算我们经常遇到处理表格列状态字段如status的时候可以用到vue