Eureka的几个小知识点总结
前几天接触了Spring Cloud,了解了Eureka,现在简单的对几个比较重要的点做一个小总结,算是小小的复习;
首先是Eureka的简单的工作原理,Eureka框架包含两个组件,一个是Eureka Server,一个是Eureka Client;
Eureka Server叫服务注册中心,每个服务启动后都要注册在这;
Eureka Client叫服务实例,分为服务提供者和服务消费者,服务之间是通过REST调用的,Eureka Client内置一个使用负载轮询算法的负载均衡器;
服务启动后,向Eureka注册,Eureka Server会将注册信息向其他Eureka Server进行同步,当服务消费者要调用服务提供者,向服务注册中心获取服务提供者地址,然后会将服务提供者地址缓存在本地,下次再调用时,则直接从本地缓存中取,完成一次调用;
Eureka Client会向Eureka Server发送心跳(默认是30秒发送一次),如果Eureka Server在多个心跳周期内没有收到某个服务的心跳(默认是90秒),Eureka就会将这个服务从服务注册表除名(心跳机制)
Eureka Client会将从Eureka Server查询到的服务注册的信息缓存到本地,这样即使Eureka Server宕机,也可以使用自己本机缓存的信息(缓存机制)
再说说Eureka的自我保护机制,Eureka在用心跳机制的时候,如果Eureka Server出现了故障,Eureka Client就不能继续把心跳发送到Eureka Server,Eureka Server会将超过90秒没有接到心跳的服务除名,但是
Eureka Client这个时候是正常的,
这就会出现"误杀"的可能,而这个自我保护机制就是为了防止出现这种情况;
那么自我保护机制到底是怎么做的呢?Eureka Server会通过判断是否存在大量没有续约成功的服务,来判断是否要开启自我保护机制,
默认情况下,Eureka Server配置的自我保护阈值是0.85,如果Eureka Server判断自己在一段时间内根据接收到心跳续约的服务低于阈值,那么Eureka Server就会开启自我保护机制,不再除名注册表的信息;
要是在保护期间有服务下线,则关闭自我保护机制,确保不可用的服务除名;
如果要关闭这个自我保护机制,可以在配置文件里加下面这行代码:
eureka: server: enable-self-preservation: false
最后再搬来一个Eureka的工作流程:
是这位大佬写的:https://blog.csdn.net/qwe86314/article/details/94552801
1、Eureka Server 启动成功,等待服务端注册。在启动过程中如果配置了集群,集群之间定时通过 Replicate 同步注册表,每个 Eureka Server 都存在独立完整的服务注册表信息
2、Eureka Client 启动时根据配置的 Eureka Server 地址去注册中心注册服务
3、Eureka Client 会每 30s 向 Eureka Server 发送一次心跳请求,证明客户端服务正常
4、当 Eureka Server 90s 内没有收到 Eureka Client 的心跳,注册中心则认为该节点失效,会注销该实例
5、单位时间内 Eureka Server 统计到有大量的 Eureka Client 没有上送心跳,则认为可能为网络异常,进入自我保护机制,不再剔除没有上送心跳的客户端
6、当 Eureka Client 心跳请求恢复正常之后,Eureka Server 自动退出自我保护模式
7、Eureka Client 定时全量或者增量从注册中心获取服务注册表,并且将获取到的信息缓存到本地
8、服务调用时,Eureka Client 会先从本地缓存找寻调取的服务。如果获取不到,先从注册中心刷新注册表,再同步到本地缓存
9、Eureka Client 获取到目标服务器信息,发起服务调用
10、Eureka Client 程序关闭时向 Eureka Server 发送取消请求,Eureka Server 将实例从注册表中删除