开发者社区> 牧小农> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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是非常有必要进行了解的,如果觉得文章对你有帮助,来个点赞支持吧,如果对文章有疑问或建议,欢迎讨论留言,谢谢大家~


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
SpringCloud - 服务注册与发现(Eureka)(一)
SpringCloud - 服务注册与发现(Eureka)(一)
11 0
Springcloud:Eureka服务注册与发现(3)
Springcloud:Eureka服务注册与发现(3)
30 0
SpringCloud之服务注册与发现Eureka+客户端Feign
SpringCloud之服务注册与发现Eureka+客户端Feign前言  SpringCloud 是微服务中的翘楚,最佳的落地方案。   Eureka 作为注册中心,是 SpringCloud 体系中最重要最核心的组件之一。
2790 0
每天学点SpringCloud(二):服务注册与发现Eureka
版权声明:本文为博主原创文章,未经博主允许不得转载。博客源地址为zhixiang.org.cn https://blog.csdn.net/myFirstCN/article/details/80994836 ...
1092 0
Spring Cloud(一)服务的注册与发现(Eureka)
Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中涉及的配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等操作提供了一种简单的开发方式。
3045 0
Spring cloud--服务注册和服务发现-Eureka 的使用
在微服务架构中,Spring Cloud为基于JVM的云应用开发中的服务发现、负载均衡、断路器、智能路由、配置管理、控制总线等等操作提供了一种简单、快捷的开发方式。
6749 0
+关注
牧小农
业精于勤荒于嬉,行成于思毁于随。
134
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载