Eureka基础

发布时间 2023-10-10 14:24:33作者: ShineLe

学习自:Eureka 入门教程 - 基础篇 | Clay 的技术空间

Eureka入门教程 - 知乎

Eureka之使用详解_eureka使用-CSDN博客

16 图 | 实战 Eureka 集群搭建+服务注册+调用 - 知乎

k8s发布Spring cloud+eureka架构服务优雅启动停止方案 - 枫&vce - 博客园

1、简介

CAP定理

在了解Eureka之前,需要先了解一下CAP定理,详细介绍看Linux:CAP定理——分布式计算 - ShineLe - 博客园

简单介绍一下CAP:

CAP 定理指的是在一个分布式系统中,Consistency(一致性)、 Availability(可用性)、 Partition tolerance(分区容错性),三者不可兼得。

  • 一致性(C):分布式系统中多个主机之间是否能够保持数据一致的特性。即,当系统数据发生更新操作后,各个主机中的数据仍然处于一致的状态。
  • 可用性(A):系统提供的服务必须一直处于可用的状态,即对于用户的每一个请求,系 统总是可以在有限的时间内对用户做出响应。
  • 分区容错性(P):分布式系统在遇到任何网络分区故障时,仍能够保证对外提供满足一
    致性和可用性的服务。

分布式系统一般都要保证P,即在某个集群失效时,仍能对外提供服务,因此必须在C和A上做出取舍。

Eureka

Eureka是Netflix开发的一款基于HTTP REST的服务,由Pivotal公司将其整合进Spring Cloud生态。Netflix在设计Eureka时遵照AP原则,用于服务注册发现、负载均衡、故障转移等,也是Spring Cloud中使用的服务注册发现组件

Eureka采用C/S架构,提供了一个基于Java的Client组件,用来与S端交互,同时内置一套负载均衡器,可以进行基本的轮询负载均衡

Eureka相关文档:Eureka 项目Eureka 官方英文文档Spring Cloud Eureka 官方中文文档

2、Eureka服务治理体系

Eureka服务的三个角色

  • 服务注册中心:由Eureka实现,提供服务注册、发现的功能,称为Eureka-Server;
  • 服务消费者:消费者从注册中心获取服务列表,从而得知该去何处调用所需的服务
  • 服务提供者:提供服务的应用,可以是Spring Boot应用,也可以是其他技术平台并且遵循Eureka通信机制的应用。它将自己提供的服务注册到Eureka,以供其他应用发现。

3、Eureka高可用性

1)Eureka高可用性

Eureka的服务注册中心,与其他服务注册中心一样,支持高可用配置。依托强一致性提供良好的服务实例可用性,可以应对多种不同的故障场景

Eureka服务端支持集群模式部署,当集群中有分片故障时(>85%的服务实例丢失心跳),Eureka会自动转入自我保护模式。它允许在分片故障时继续提供服务发现和注册,当故障恢复时,集群中的其它分片会把各自状态再次同步回来。

集群中的不同服务注册中心通过异步模式互相复制各自的状态,这也意味着在给定的时间点每个实例关于所有服务的状态可能存在不一致的现象

2)Eureka自我保护机制

默认情况下,如果Eureka Server在一定时间内没收到某个微服务实例的心跳,Eureka Server将会注销该实例。

但是当网络分区故障发生时,微服务Eureka Server之间无法正常通信,这就可能变得非常危险了。因为微服务本身是健康的,此时就不该注销它。Eureka Server通过“自我保护机制”来解决这个问题,当Eureka Server短时间内丢失过多客户端时(超过85%服务实例丢失心跳,意味着可能发生了网络分区故障),那么这个节点就会进入自我保护模式。

一旦进入该模式,Eureka Server就会保护服务注册表中的信息,不再删除服务注册表中的数据(即不会注销任何微服务)。当网络故障恢复后,该Eureka会自动退出自我保护模式。自我保护模式是一种对网络异常安全保护措施,使用自我保护模式,可以让Eureka集群更加健壮稳定。

在自我保护模式中,Eureka Server会保护注册表中的信息不再注销任何服务实例。当它收到的心跳重新恢复至阈值以上时,该Eureka Server节点就会自动退出自我保护模式。它的设计哲学就是宁可保留错误的服务注册信息,也不盲目注销任何可能健康的服务实例

在Spring Cloud中,可以用eureka.server.enable-self-preservation: false来禁用自我保护模式。

3)Eureka 自我保护模式的效果

  • Eureka不能从注册列表移除因长期没收到心跳而应该过期的服务;
  • Eureka仍能接受新服务的注册和查询请求,但是不会被同步到其他节点(高可用)
  • Eureka在网络稳定时,当前实例新的注册信息会被同步到其他节点中(最终一致性);
  • Eureka可以很好应对由于网络故障导致部分节点失去联系的情况,不会像ZooKeeper一样是的注册中心瘫痪。

4)Eureka 健康检查

在Eureka中,微服务的状态值可以为UP、DOWN、OUT_OF_SERVICE、UNKNOWN等,只有UP的微服务会被请求。

由于Eureka Server和Eureka Client之间用心跳机制来确定Eureka Client的状态,默认情况S、C之间心跳保持正常,应用程序就会始终保持UP状态,所以微服务的UP并不能完全反应应用程序的状态

SpringBoot Actuator提供了/health端点,用于显示应用程序健康信息,主需要将该端点中的健康状态传播到Eureka Server就可以了。为了实现这一点,需要在SpringBoot中进行如下配置:

# 开启健康检查(需要添加spring-boot-starter-actuator依赖)
eureka.client.healthcheck.enabled = true