SpringColud Eureka的服务注册与发现(2)

简介: SpringColud Eureka的服务注册与发现

五、Eureka 原理


5.1 本质


存储了每个客户端的注册信息。EurekaClient从EurekaServer同步获取服务注册列表。通过一定的规则选择一个服务进行调用


5.2 Eureka架构图


image.png


服务提供者: 是一个eureka client,向Eureka Server注册和更新自己的信息,同时能从Eureka Server注册表中获取到其他服务的信息。

服务注册中心: 提供服务注册和发现的功能。每个Eureka Cient向Eureka Server注册自己的信息,也可以通过Eureka Server获取到其他服务的信息达到发现和调用其他服务的目的。

服务消费者: 是一个eureka client,通过Eureka Server获取注册到其上其他服务的信息,从而根据信息找到所需的服务发起远程调用。

同步复制: Eureka Server之间注册表信息的同步复制,使Eureka Server集群中不同注册表中服务实例信息保持一致。

远程调用: 服务客户端之间的远程调用。

注册: Client端向Server端注册自身的元数据以供服务发现。

续约: 通过发送心跳到Server以维持和更新注册表中服务实例元数据的有效性。当在一定时长内,Server没有收到Client的心跳信息,将默认服务下线,会把服务实例的信息从注册表中删除。

下线: Client在关闭时主动向Server注销服务实例元数据,这时Client的服务实例数据将从Server的注册表中删除。

获取注册表: Client向Server请求注册表信息,用于服务发现,从而发起服务间远程调用。

5.3 Eureka自我保护


有时候我们会看到这样的提示信息:EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.,这是因为默认情况下,Eureka Server在一定时间内,没有接收到某个微服务心跳,会将某个微服务注销(90S)。但是当网络故障时,微服务与Server之间无法正常通信,上述行为就非常危险,因为微服务正常,不应该注销,它的指导思想就是 宁可保留健康的和不健康的,也不盲目注销任何健康的服务

我们也可以通过命令去关闭自我保护的功能:


eureka:

 server:

   enable-self-preservation: false


那么自我保护是如何触发的呢?

自我保护机制的触发条件是,当每分钟心跳次数( renewsLastMin) 小于 numberOfRenewsPerMinThreshold时,并且开启自动保护模式开关( eureka.server.enable-self-preservation = true) 时,触发自我保护机制,不再自动过期租约

上面我们所有的小于 numberOfRenewsPerMinThreshold,到底是怎么计算的呢,我们在eureka源码中可以得知


numberOfRenewsPerMinThreshold = expectedNumberOfRenewsPerMin * 续租百分比(默认为0.85)

expectedNumberOfRenewsPerMin = 当前注册的应用实例数 x 2

当前注册的应用实例数 x 2 是因为,在默认情况下,注册的应用实例每半分钟续租一次,那么一分钟心跳两次,因此 x 2

例如:我们有10个服务,期望每分钟续约数:10 * 2=20,期望阈值:20*0.85=17,当少于17时,就会触发自我保护机制

image.png


5.4 健康检查


由于server和client通过心跳保持 服务状态,而只有状态为UP的服务才能被访问。看eureka界面中的status。



比如心跳一直正常,服务一直UP,但是此服务DB(数据库)连不上了,无法正常提供服务。


此时,我们需要将 微服务的健康状态也同步到server。只需要启动eureka的健康检查就行。这样微服务就会将自己的健康状态同步到eureka。配置如下即可。


在client端配置:将自己的健康状态传播到server。


eureka:
  client:
    healthcheck:
      enabled: true


5.5 Eureka监听事件

import com.netflix.appinfo.InstanceInfo;
import org.springframework.cloud.netflix.eureka.server.event.*;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
@Component
public class CustomEvent {
    @EventListener
    public void listen(EurekaInstanceCanceledEvent event ) {
        System.out.println(LocalDateTime.now()+"服务下线事件:"+event.getAppName()+"---"+event.getServerId());
//发钉钉
    }
    @EventListener
    public void listen(EurekaInstanceRegisteredEvent event) {
        InstanceInfo instanceInfo = event.getInstanceInfo();
        System.out.println(LocalDateTime.now()+"服务上线事件:"+instanceInfo.getAppName()+"---"+instanceInfo.getInstanceId());
    }
    @EventListener
    public void listen(EurekaInstanceRenewedEvent event) {
        System.out.println(LocalDateTime.now()+"服务续约/心跳上报事件:"+event.getAppName()+"---"+event.getServerId());
    }
    @EventListener
    public void listen(EurekaRegistryAvailableEvent event) {
        System.out.println(LocalDateTime.now()+"注册中心可用事件");
    }
    @EventListener
    public void listen(EurekaServerStartedEvent event) {
        System.out.println(LocalDateTime.now()+"注册中心启动事件");
    }
}

5.6 Renew: 服务续约


Eureka Client 会每隔 30 秒发送一次心跳来续约。 通过续约来告知 Eureka Server 该 Eureka Client 运行正常,没有出现问题。 默认情况下,如果 Eureka Server 在 90 秒内没有收到 Eureka Client 的续约,Server 端会将实例从其注册表中删除,此时间可配置,一般情况不建议更改。


5.6 服务剔除


如果Eureka Client在注册后,既没有续约,也没有下线(服务崩溃或者网络异常等原因),那么服务的状态就处于不可知的状态,不能保证能够从该服务实例中获取到回馈,所以需要服务剔除此方法定时清理这些不稳定的服务,该方法会批量将注册表中所有过期租约剔除,剔除是定时任务,默认60秒执行一次。延时60秒,间隔60秒


剔除的限制:

1.自我保护期间不清除。

2.分批次清除。


六、Eureka缺陷


由于集群间的同步复制是通过HTTP的方式进行,基于网络的不可靠性,集群中的Eureka Server间的注册表信息难免存在不同步的时间节点,不满足CAP中的C(数据一致性)


七、总结


中间我们讲解了eureka的节点搭建,以及原理,对于现在很火热的微服务,我们对Eureka是非常有必要进行了解的,如果觉得文章对你有帮助,来个点赞支持吧,如果对文章有疑问或建议,欢迎讨论留言,谢谢大家~


目录
相关文章
|
3月前
|
Java Nacos Maven
Eureka服务注册与发现
本节读者带领大家完成SpringCloud集成组件Eureka的开发、部署,并完成业务应用在Eureka的注册、访问。基于此细心的读者朋友们可以发现:上一章节还写死的访问地址,已经变成动态从注册中心获取了,避免了接口提供方注册信息变更、导致消费方接口服务调用异常的场景。随着Eureka的剔除,Nacos又将如何优雅替换Eureka呢?待我们后续继续实操逐步发掘吧。
|
5月前
|
微服务
springCloud之服务注册与发现Eureka
springCloud之服务注册与发现Eureka
|
6月前
|
存储 监控 安全
服务注册中心Eureka
服务注册中心Eureka
49 1
|
6月前
|
负载均衡 监控 容灾
【SpringCloud】详解Eureka注册中心
【SpringCloud】详解Eureka注册中心
109 0
|
缓存 Java Shell
SpringCloud Eureka注册中心
SpringCloud Eureka注册中心
77 1
|
存储 Java 网络架构
SpringCloud之Eureka注册中心解读
SpringCloud之Eureka注册中心解读
|
负载均衡 监控 算法
Eureka注册中心
Eureka注册中心
111 0
|
负载均衡 监控 Dubbo
SpringCloud之Eureka服务注册
SpringCloud之Eureka服务注册
SpringCloud之Eureka服务注册
|
存储 负载均衡 监控
(五)、Eureka服务注册中心
(五)、Eureka服务注册中心
(五)、Eureka服务注册中心
|
Java
SpringCloud - 服务注册与发现(Eureka)(一)
SpringCloud - 服务注册与发现(Eureka)(一)
130 0
SpringCloud - 服务注册与发现(Eureka)(一)