Spring Cloud Eureka 全解 (6) - 一些热门QA

简介: Spring Cloud Eureka 全解 (6) - 一些热门QA

系列目录:

本文基于SpringCloud-Dalston.SR5


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


是的,立刻会。

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

statusChangeListener = new ApplicationInfoManager.StatusChangeListener() {
    @Override
    public String getId() {
        return "statusChangeListener";
    }
    @Override
    public void notify(StatusChangeEvent statusChangeEvent) {
        if (InstanceStatus.DOWN == statusChangeEvent.getStatus() ||
                InstanceStatus.DOWN == statusChangeEvent.getPreviousStatus()) {
            // log at warn level if DOWN was involved
            logger.warn("Saw local status change event {}", statusChangeEvent);
        } else {
            logger.info("Saw local status change event {}", statusChangeEvent);
        }
//这个会触发调用register接口将实例信息注册上去
        instanceInfoReplicator.onDemandUpdate();
    }
};

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

@Override
public void register(EurekaRegistration reg) {
   maybeInitializeClient(reg);
   if (log.isInfoEnabled()) {
      log.info("Registering application " + reg.getInstanceConfig().getAppname()
            + " with eureka with status "
            + reg.getInstanceConfig().getInitialStatus());
   }
   reg.getApplicationInfoManager()
         .setInstanceStatus(reg.getInstanceConfig().getInitialStatus());
   if (reg.getHealthCheckHandler() != null) {
      reg.getEurekaClient().registerHealthCheck(reg.getHealthCheckHandler());
   }
}

那么,官网这两个配置有啥用:


image.png


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


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


首先,EurekaClient会选择eureka.client.service-url.defaultZone配置的第一个EurekaServer,之后如果和这个EurekaServer没有网络问题,就会一直用这个。

在EurekaClient向EurekaServer发送注册,下线,心跳,状态改变等一切事件时,这些会在EurekaServer上面同步到集群(EurekaServer集群配置就是eureka.client.service-url.defaultZone,集群内每个EurekaServer)的所有Server上


image.png


这样的机制有没有问题?

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感知变化也会有这个延迟



微信图片_20220624112337.jpg


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


SpringCloud环境下,EurekaClient有缓存,Ribbon对于调用的服务列表也有缓存,所以可以继续调用,但不会更新服务与实例列表了。

根据Eureka的self-preservation的设计思路,可以理解这种设计也是符合Eureka初衷的(CAP中的A)


微信图片_20220624112356.jpg


相关文章
|
4月前
|
监控 负载均衡 Java
深入理解Spring Cloud中的服务网关
深入理解Spring Cloud中的服务网关
|
4月前
|
Java 开发工具 git
实现基于Spring Cloud的配置中心
实现基于Spring Cloud的配置中心
|
4月前
|
设计模式 监控 Java
解析Spring Cloud中的断路器模式原理
解析Spring Cloud中的断路器模式原理
|
1月前
|
负载均衡 算法 Nacos
SpringCloud 微服务nacos和eureka
SpringCloud 微服务nacos和eureka
55 0
|
2月前
|
负载均衡 Java Nacos
SpringCloud基础1——远程调用、Eureka,Nacos注册中心、Ribbon负载均衡
微服务介绍、SpringCloud、服务拆分和远程调用、Eureka注册中心、Ribbon负载均衡、Nacos注册中心
SpringCloud基础1——远程调用、Eureka,Nacos注册中心、Ribbon负载均衡
|
3月前
|
负载均衡 监控 Java
SpringCloud常见面试题(一):SpringCloud 5大组件,服务注册和发现,nacos与eureka区别,服务雪崩、服务熔断、服务降级,微服务监控
SpringCloud常见面试题(一):SpringCloud 5大组件,服务注册和发现,nacos与eureka区别,服务雪崩、服务熔断、服务降级,微服务监控
SpringCloud常见面试题(一):SpringCloud 5大组件,服务注册和发现,nacos与eureka区别,服务雪崩、服务熔断、服务降级,微服务监控
|
4月前
|
资源调度 Java 调度
Spring Cloud Alibaba 集成分布式定时任务调度功能
Spring Cloud Alibaba 发布了 Scheduling 任务调度模块 [#3732]提供了一套开源、轻量级、高可用的定时任务解决方案,帮助您快速开发微服务体系下的分布式定时任务。
14906 29
|
4月前
|
负载均衡 Java Spring
Spring cloud gateway 如何在路由时进行负载均衡
Spring cloud gateway 如何在路由时进行负载均衡
475 15
|
4月前
|
Java Spring
spring cloud gateway在使用 zookeeper 注册中心时,配置https 进行服务转发
spring cloud gateway在使用 zookeeper 注册中心时,配置https 进行服务转发
109 3
下一篇
无影云桌面