Spring Cloud Eureka 全解 (6)

本文基于SpringCloud-Dalston.SR5

Eureka服务实例启动时,是否会立刻向EurekaServer注册?

是的,立刻会。

EurekaClient在每次实例状态发生改变时,有一个Listener:

1statusChangeListener = new ApplicationInfoManager.StatusChangeListener() { 2 @Override 3 public String getId() { 4 return "statusChangeListener"; 5 } 6 7 @Override 8 public void notify(StatusChangeEvent statusChangeEvent) { 9 if (InstanceStatus.DOWN == statusChangeEvent.getStatus() || 10 InstanceStatus.DOWN == statusChangeEvent.getPreviousStatus()) { 11 // log at warn level if DOWN was involved 12 logger.warn("Saw local status change event {}", statusChangeEvent); 13 } else { 14 logger.info("Saw local status change event {}", statusChangeEvent); 15 } 16//这个会触发调用register接口将实例信息注册上去 17 instanceInfoReplicator.onDemandUpdate(); 18 } 19}; 20

实例初始化完毕时,会发送一个状态为UP的事件,触发这个Listener(状态从STARTING变成UP ):

1@Override 2public void register(EurekaRegistration reg) { 3 maybeInitializeClient(reg); 4 5 if (log.isInfoEnabled()) { 6 log.info("Registering application " + reg.getInstanceConfig().getAppname() 7 + " with eureka with status " 8 + reg.getInstanceConfig().getInitialStatus()); 9 } 10 11 reg.getApplicationInfoManager() 12 .setInstanceStatus(reg.getInstanceConfig().getInitialStatus()); 13 14 if (reg.getHealthCheckHandler() != null) { 15 reg.getEurekaClient().registerHealthCheck(reg.getHealthCheckHandler()); 16 } 17} 18

那么,官网这两个配置有啥用: image 其实这个Initially是另外一个逻辑,就是在应用启动40s后,检查实例信息是否老旧,或者第一次注册是否失败,如果失败,就再次注册。之后每隔30s执行一次这个任务

EurekaServer集群内部信息如何同步?

首先,EurekaClient会选择eureka.client.service-url.defaultZone配置的第一个EurekaServer,之后如果和这个EurekaServer没有网络问题,就会一直用这个。 在EurekaClient向EurekaServer发送注册,下线,心跳,状态改变等一切事件时,这些会在EurekaServer上面同步到集群(EurekaServer集群配置就是eureka.client.service-url.defaultZone,集群内每个EurekaServer)的所有Server上

image

这样的机制有没有问题?

  1. 这个同步到其他EurekaServer与本次EurekaClient请求是否是同步的? 不是同步的,例如注册到EurekaServerA,EurekaServerA将注册请求同步到EurekaServerB与当前注册请求是异步的
  2. 某次异步同步请求失败如何补偿? 例如服务实例A注册到EurekaServerA,但是同步到EurekaServerB失败。这时EurekaServerB就没有这个实例,在下次A心跳时,EurekaServerA同步心跳请求到EurekaServerB时,会返回404,触发重新注册 推论: 为了减少和均匀EurekaServer压力和访问便利,我们对于每个微服务的不同实例,配置Eureka集群都要写的顺序不一样,和自己网段一样的写的靠前

网络抖动时,导致访问到另一个Eureka,重启才能恢复。。。

服务实例怎么过期?

通过EurekaServer内部定时检查过期实例任务,扫描Registry里面过期的实例并删除,并且使对应的ReadWriteMap缓存失效 注意,ReadOnlyMap里面的并不会立刻失效,而是通过下一个只读缓存刷新从ReadWriteMap刷到ReadOnlyMap感知变化。因为EurekaClient获取实例信息只从ReadOnlyMap读取,所以EurekaClient感知变化也会有这个延迟

image

为何EurekaServer挂了,客户端依然可以调通?

SpringCloud环境下,EurekaClient有缓存,Ribbon对于调用的服务列表也有缓存,所以可以继续调用,但不会更新服务与实例列表了。 根据Eureka的self-preservation的设计思路,可以理解这种设计也是符合Eureka初衷的(CAP中的A)

image

点赞
收藏

评论区

加载中...

相关推荐

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

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

Spring Cloud Eureka 全解 (7)

本文基于SpringCloudDalston.SR5(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fcloud.spring.io%2Fspringcloudstatic%2FDalston.SR5%2F)可以实现比较快的服务上下线:EurekaServer配置:

Spring Cloud Eureka 全解 (8)

本文基于SpringCloudDalston.SR5(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fcloud.spring.io%2Fspringcloudstatic%2FDalston.SR5%2F)一般的,Eureka在内网服务,我们不会对于外网暴露Eureka端口,所

Spring Cloud Eureka 全解 (5)

本文基于SpringCloudDalston.SR5(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fcloud.spring.io%2Fspringcloudstatic%2FDalston.SR5%2F)自我保护机制关闭自我保护机制(默认是打开的):eu