Eureka 整体架构
Register(服务注册):把自己的 IP 和端口注册给 Eureka
Renew(服务续约):发送心跳包,每 30 秒发送一次,告诉 Eureka 自己还活着,如果 90 秒还未发送心跳,宕机
Cancel(服务下线):当 Provider 关闭时会向 Eureka 发送小心,把自己从服务列表中删除,防止 Consumer 调用到不存在的服务
Get Registry(获取服务注册列表):获取其他服务列表
Replicate(集群中数据同步):Eureka 集群中的数据复制与同步
Make Remote Call(远程调用):完成服务的远程调用
CAP 原则
- 一致性:数据一致等
- 可用性:快速响应等
- 分区容错性:做分区,提高容错等
不可三者兼得,最多保证两项
CA:单节点,无分区
CP:分区之间要保证数据一致,导致耗时增加,可用性差
AP:响应快速,分区容错,但是数据一致没有保证
Eureka 自我保护
自我保护的条件
一般情况下,服务在 Eureka 上注册后,会每 30 秒发送心跳包,Eureka 通过心跳来判断服务是否健康,同时会定期删除超过 90 秒没有发送心跳的服务。
有两种情况会导致 Eureka Server 收不到微服务的心跳
- 微服务自身内部的原因
- 微服务与 Eureka 之间的网络故障
Eureka Server 在运行期间回去统计心跳失败比例在 15 分钟之内是否低于 85%,如果低于,Eureka Server 会将这些实例保护起来,让这些实例不会过期,同时提示一个警告。这种机制叫做 Eureka Server 的自我保护模式。
为什么要启动自我保护
- 同时保留好数据与坏数据总比丢掉所有数据要好,当网络故障恢复后,这个 Eureka 节点会退出”自我保护模式“。
- Eureka 具有客户端缓存功能(也就是微服务的缓存功能)。即使 Eureka 集群中所有节点都宕机失效,微服务的 Provider 和 Consumer 都能正常通信
- 微服务的负载均衡策略会自动剔除死亡的微服务节点
如何关闭自我保护机制
注册中心配置自我保护 application.xml
eureka:
server:
enable-self-preservation: false # true:开启自我保护模式
eviction-interval-timer-in-ms: 60000 # 清理间隔,单位:毫秒
Eureka 优雅停服
配置了优雅停服以后,就不需要 Eureka Server 配置关闭自我保护。
通过 actuator 实现。
添加依赖
Spring Boot Actuator 模块提供了生产级别的功能,比如健康检查,审计,指标收集,HTTP 跟踪等,帮助我们监控和管理Spring Boot 应用。
服务提供者添加 actuator 依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
配置文件
服务提供者配置度量指标监控与健康检查
# 度量指标监控与健康检查
management:
endpoints:
web:
exposure:
include: shutdown # 开启 shutdown 访问
endpoint:
shutdown:
enabled: true # 开启 shutdown 实现停服
优雅停服
使用 post 请求访问 http://localhost:7070/actuator/shutdown
然后,对应服务提供者立即停止服务,在 Eureka 服务列表中也删除了!