eureka
服务注册与发现, 通过心跳机制续约包活,结合 ribbon 实现负载均衡,集群节点相互复制,相互守望
Register
EurekaClient 注册到 EurekaServer
EurekaClient 会发送自己元数据( ip, port, 服务名称),EurekaServer 会将其添加到服务注册列表ConcurrentHashMap 里
Renew
EurekaClient 默认每 30 秒发送心跳给 EurekaServer 续约包活,
EurekaServer 将 EurekaClient 心跳中的时间戳更新到服务列表,如果 EurekaServer 90 秒都没收到某个EurekaClient 的续约,就会将该服务从服务列表剔除(Eviction)
Get Registry
EurekaClient 默认每 30 秒从 EurekaServer 获取服务注册列表并更新缓存
Cancel
EurekaClient 服务的下线
Make Remote Call
EurekaClient 服务间进行远程调用,比如通过 RestTemplate + Ribbon 或 Fegin
Replicate
EurekaServer 集群节点之间同步服务注册列表
特性
1.AP
非强一致, 要求客户端支持负载均衡及失败重试
2.对等复制
每个节点都接受写操作, 节点之间相互同步数据
数据冲突问题
通过比较节点数据的版本号 lastDirtyTimestamp 来同步最新的数据
3.Zone, Region
默认数据同步只会发生在 Region 下面的多个 Zone 之间, 跨 Region 不会同步
4.self preservation
eureka server 收不到服务心跳有两种情况,一种是个别服务挂了,就走服务续约失效剔除的机制
如果 Eureka Server 默认90秒没有接收到某个微服务实例的心跳,Eureka Server 将会剔除该实例
收不到心跳还有一种情况就是微服务实例正常,但由于网络分区故障没收到心跳,这种情况就不应该剔除服务,所以就有了自我保护机制,如果在 15 分钟内超过 85% 的客户端节点都没有正常的心跳,Eureka Server 自动进入自我保护机制, 就会关闭服务续约失效剔除的机制
优点
1.java 语言开发, 便于 java 团队排查问题
2.跟 Zuul, ribbon 整合的比较好
一个服务启动后最长可能需要 90s 才能被其它服务感知到 -- 3处缓存
1.EurekaServer 对服务列表做了 30s response cache 缓存
2.Eureka Client 对 EurekaServer 返回的服务列表做了 30s 本地缓存
3.Ribbon 从 Eureka Client 本地获取服务列表 缓存 30s
问题
服务已经下线, eureka 返回的信息还在
1.应用实例异常挂掉没有请求 eureka 服务下线,需要等 eureka 的 evictionTask 去剔除
evictionTask 的时间间隔可以调小一点, 默认 60s, 可以调到 5s
eureka.server.eviction-interval-timer-in-ms
2.网络分区故障导致自我保护模式开启,需要等自我保护模式退出, 恢复租约失效剔除功能
开发测试环境可以关闭自我保护模式
eureka.server.enable-self-preservation=false
生产环境可以修改配置,增加触发自我保护的门槛
//# 默认0.85
eureka.server.renewalPercentThreshold=0.49
//# 默认30
eureka.instance.leaseRenewalIntervalInSeconds=10
3.应用实例正常关闭成功请求 eureka 服务下线,需要等 eureka 的 rest api 的 response cache 缓存过期才能更新
可以关闭
eureka.server.user-read-only-response-cache=false
或者调整过期时间
eureka.server.response-cache-auto-expiration-in-seconds=60
服务上线后, eureka client 未能及时获取到
可以适当提高拉取服务列表的频率
eureka.client.registry-fetch-interval-seconds=5
EurekaClientConfigBean
eureka.client 配置类
EurekaInstanceConfigBean
eureka.instance 配置类
LeaseManager
注册微服务实例接口, 用于服务注册, 服务注销, 服务续约, 服务续约过期剔除
LookupService
eureka client 从 eureka server 获取微服务实例的接口
---------------------------------------------
InstanceInfo 注册的服务实例信息
---------------------------------------------
instanceId 实例 id
app 应用名
hostName 主机名称
ipAddr ip 地址
port 端口号
securePort https 的端口号
------------------------
status 实例状态
------------------------
UP 可以接受请求
DOWN 不接受请求, 健康检测失败或服务下线了
STARTING 启动中, 暂不接受请求
OUT_OF_SERVICE 暂定服务
UNKNOWN
------------------------
leaseinfo 租约信息
lastUpdatedTimestamp 状态信息最后更新时间
lastDirtyTimestamp 实例信息最新过期时间, 用于多节点之间同步数据
---------------------------------------------
---------------------------------------------
LeaseInfo 租约信息
---------------------------------------------
// Client settings
// 续约间隔时间, 默认 30s
renewalIntervalInSecs
// 续约有效时长, 默认 90s
durationInSecs
// Server populated
// 注册时间
registrationTimestamp
// 最后一次续约时间
lastRenewalTimestamp
// 服务实例被剔除时间
evictionTimestamp
// 服务实例上线时间
serviceUpTimestamp
---------------------------------------------
eureka 主主集群
相互注册, 相互守望, 相互复制
7001 注册到 7002, 7002 注册到 7001, 通过心跳续约保活, 每个节点相互复制服务列表
1.配置文件
application-8761.properties
server.port=8761
eureka.instance.hostname=Eureka8761
eureka.client.serviceUrl.defaultZone=http://admin:002310@Eureka8762:8762/eureka
----------------------------------
application-8762.properties
server.port=8762
eureka.instance.hostname=Eureka8762
eureka.client.serviceUrl.defaultZone=http://admin:002310@Eureka8761:8761/eureka
2.eureka 客户端配置
eureka.client.serviceUrl.defaultZone=http://admin:002310@Eureka8761:8761/eureka, http://admin:002310@Eureka8762:8762/eureka
3.启动
java -jar springcloud-eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=8761
java -jar springcloud-eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=8762