什么是 Eureka
- Netflix 在涉及 Eureka 时,遵循的就是 API 原则.
- Eureka 是 Netflix 的有个子模块,也是核心模块之一。Eureka 是基于 REST 的服务,用于定位服务,以实现云端中间件层服务发现和故障转移,服务注册与发现对于微服务来说是非常重要的,有了服务注册与发现,只需要使用服务的标识符,就可以访问到服务,而不需要修改服务调用的配置文件了,功能类似于 Dubbo 的注册中心,比如 Zookeeper.
原理理解
Eureka 基本的架构
- Springcloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务注册与发现 (对比 Zookeeper).
- Eureka 采用了 C-S 的架构设计,EurekaServer 作为服务注册功能的服务器,他是服务注册中心.
- 而系统中的其他微服务,使用 Eureka 的客户端连接到 EurekaServer 并维持心跳连接。这样系统的维护人员就可以通过 EurekaServer 来监控系统中各个微服务是否正常运行,Springcloud 的一些其他模块 (比如 Zuul) 就可以通过 EurekaServer 来发现系统中的其他微服务,并执行相关的逻辑.

- Eureka 包含两个组件:Eureka Server 和 Eureka Client.
- Eureka Server 提供服务注册,各个节点启动后,会在 EurekaServer 中进行注册,这样 Eureka Server 中的服务注册表中将会储存所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到.
- Eureka Client 是一个 Java 客户端,用于简化 EurekaServer 的交互,客户端同时也具备一个内置的,使用轮询负载算法的负载均衡器。在应用启动后,将会向 EurekaServer 发送心跳 (默认周期为 30 秒) 。如果 Eureka Server 在多个心跳周期内没有接收到某个节点的心跳,EurekaServer 将会从服务注册表中把这个服务节点移除掉 (默认周期为 90s).
三大角色
- Eureka Server:提供服务的注册与发现
- Service Provider:服务生产方,将自身服务注册到 Eureka 中,从而使服务消费方能够找到
- Service Consumer:服务消费方,从 Eureka 中获取注册服务列表,从而找到消费服务
EureKa 自我保护机制
好死不如赖活着
一句话总结就是:某时刻某一个微服务不可用,eureka 不会立即清理,依旧会对该微服务的信息进行保存!
默认情况下,当 eureka server 在一定时间内没有收到实例的心跳,便会把该实例从注册表中删除(默认是 90 秒),但是,如果短时间内丢失大量的实例心跳,便会触发 eureka server 的自我保护机制,比如在开发测试时,需要频繁地重启微服务实例,但是我们很少会把 eureka server 一起重启(因为在开发过程中不会修改 eureka 注册中心),当一分钟内收到的心跳数大量减少时,会触发该保护机制。可以在 eureka 管理界面看到 Renews threshold 和 Renews(last min),当后者(最后一分钟收到的心跳数)小于前者(心跳阈值)的时候,触发保护机制,会出现红色的警告:EMERGENCY!EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY’RE NOT.RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEGING EXPIRED JUST TO BE SAFE.
从警告中可以看到,eureka 认为虽然收不到实例的心跳,但它认为实例还是健康的,eureka 会保护这些实例,不会把它们从注册表中删掉。
该保护机制的目的是避免网络连接故障,在发生网络故障时,微服务和注册中心之间无法正常通信,但服务本身是健康的,不应该注销该服务,如果 eureka 因网络故障而把微服务误删了,那即使网络恢复了,该微服务也不会重新注册到 eureka server 了,因为只有在微服务启动的时候才会发起注册请求,后面只会发送心跳和服务列表请求,这样的话,该实例虽然是运行着,但永远不会被其它服务所感知。所以,eureka server 在短时间内丢失过多的客户端心跳时,会进入自我保护模式,该模式下,eureka 会保护注册表中的信息,不再注销任何微服务,当网络故障恢复后,eureka 会自动退出保护模式。自我保护模式可以让集群更加健壮。
但是我们在开发测试阶段,需要频繁地重启发布,如果触发了保护机制,则旧的服务实例没有被删除,这时请求有可能跑到旧的实例中,而该实例已经关闭了,这就导致请求错误,影响开发测试。所以,在开发测试阶段,我们可以把自我保护模式关闭,只需在 eureka server 配置文件中加上如下配置即可:eureka.server.enable-self-preservation=false【不推荐关闭自我保护机制】
详细内容可以参考下这篇博客内容:https://blog.csdn.net/wudiyong22/article/details/80827594
#####