3.1 Eureka的核心类
3.1.1 服务注册实例 InstanceInfo.java
3.1.2 应用实例的租约信息 LeaseInfo.java
3.1.3 实例信息的抽象接口,约定通用信息 ServiceInstance.java
- 由于 Spring Cloud Discovery适配了Zookeeper、Consul、Netflix Eureka等注册中心,因此ServiceInstance定义更为抽象和通用
3.1.4 标识服务实例的状态
-
OUT_OF_SERVICE标识停止服务,不会被路由到,经常用于升级部署的场景
3.3 Eureka的设计理念
3.3.1 概述
- 服务实例如何注册到服务中心
- 本质上是在服务启动的时候,调用REST API的register方法,可通过Eureka Client封装的API简化调用
- 服务实例如何从服务中心剔除
- 关闭应用时调用de-register方法
- Eureka Server判断租约超过一定时间没有进行续约,会主动剔除
- 服务实例信息的一致性问题
- AP优于CP
- Peer to Peer架构
- Zone及Region设计
- SELF PRESERVATION
3.3.2 AP优于CP
- CAP理论
- Consistency 数据一致性,要求多副本的数据保持一致
- Avaliability 可用性,要求任何时候请求能够正常响应
- Partition Tolerance 分区容忍性,要求集群内主机发生通信故障时,集群仍然可用(客观存在,必须实现)
3.3.3 Peer to Peer架构
- 主从复制
- 对等复制(peer to peer)
- Eureka Server启动时,拉取其他节点的服务注册信息
- Eureka Server接收到Register、renew或cancel事件后,向其他节点同步
- Eureka Server 通过http header 的 HEADER_REPLICATION区分是正常请求还是复制请求
3.3.4 Zone及Region设计
每个Region下,还分了多个AvaliabilityZone,相互独立,类似于一个Region下的多个机房,如下图:
3.3.5 SELF PRESERVATION设计
说明:针对应用实例的存活进行健康检查,如网络偶尔抖动或短暂不可用时造成的误判、Server和Client之间出现网络分区,极端情况下可能会使得Server清空部分服务的实例,严重影响Availability
Server和Client之间有个租约,计算最近一分钟接收到的续约的次数小于指定阀值的话,则关闭租约失效剔除,禁止剔除,从而保护注册信息。
3.4 Eureka参数调优及监控
3.4.1 核心参数
- Client端
- 基本参数
- 定时任务参数
- http参数
- Server端
- 基本参数
- response cache参数
- peer相关参数
- http参数
3.4.2 参数调优
- 服务下线,Eureka Server接口返回的信息还存在
- 实例异常挂掉,未告知Eureka Server下线,需要依赖Eureka Server的Eviction Task去剔除,调整调度频率,eureka.server.eviction-interval-timer-in-ms=xxx,默认60秒
- Eureka Server的REST API有response cache,需要等待缓存过期,可以根据情况考虑关闭readOnlyCacheMap,eureka.server.use-read-only-response-cache=false
- Eureka Server引入SELF PRESERVATION模式,导致过期不会被剔除,直到退出该模式,在测试环境可以关闭该模式,eureka.server.enable-self-preservation=false
- 服务上线,Eureka Client不能及时获取到
- 在测试环境,可以适当提高Client拉取Server注册信息的频率,eureka.client.registry-fetch-interval-seconds=xx,默认30秒
- emergency!eureka may be incorrectly claiming 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.enableSelfPreservation=false
- 生产环境,可以把 renewalPercentThreshold及leaseRenewalIntervalInSeconds参数调小一点,提高触发门槛
- eureka.instance.leaseRenewalIntervalInSeconds=10 #默认30
- eureka.server.renewalPercentThreshold=0.49 #默认0.85
3.4.3 指标监控
3.5 Eureka实战
3.5.1 Eureka Server在线扩容
- 参考:https://www.v2ex.com/t/498977
- 大概是通过spring cloud config配置中心管理配置,动态增加节点,修改配置,再refresh一下生效