1.在某网站拿个多机房eureka部署图
Eureka Server(北京,天津,青岛)
- 集群部署,节点间进行(异步)数据同步,保证最终一致性。
- 通过appName和instanceInfoId(微服务信息)来唯一区分一个服务实例,服务实例信息保存在Map中:
// 第一层的key是appName,第二层的key是instanceInfoId
private final ConcurrentHashMap<String, Map<String, Lease<InstanceInfo>>> registry
= new ConcurrentHashMap<String, Map<String, Lease<InstanceInfo>>>();
- Eureka Server同时也是一个Eureka Client,在不禁止Eureka Server的客户端行为时,它会向它配置文件中的其他Eureka Server进行拉取注册表、服务注册和发送心跳等操作。
- eureka指定时间收不到client的心跳时,将剔除服务。
- 自我保护机制的工作机制:
如果在15分钟内超过85%的客户端节点都没有正常的心跳,那么Eureka就认为自己出现了网络故障,Eureka Server自动进入自我保护机制,此时会出现以下几种情况:
(1)Eureka Server不再从注册列表中移除因为长时间没收到心跳而应该过期的服务。
(2)Eureka Server仍然能够接受新服务的注册和查询请求,但是不会被同步到其它节点上,保证当前节点依然可用。
(3)当网络稳定时,当前Eureka Server新的注册信息会被同步到其它节点中。
因此Eureka Server可以很好的应对因网络故障导致部分节点失联的情况,而不会像ZK那样如果有一半不可用的情况会导致整个集群不可用而变成瘫痪。
Eureka自我保护机制,通过配置 eureka.server.enable-self-preservation来true打开/false禁用自我保护机制,默认打开状态,建议生产环境打开此配置。
Eureka Client
- 启动后,将InstanceInfo(服务信息)发送给eureka server。并且从eureka server拉取其它微服务信息,保存到本地registry。该注册列表信息还定期(每30秒钟)从eureka server中拉取更新一次。
- 在运行过程中,Eureka Client 定时向注册中心发送 renew 心跳,证明“我还活着”。
- 停止服务提供者,向注册中心发起 cancel 请求,清空当前服务注册信息。
- Eureka Client 会拉取、更新和缓存 Eureka Server 中的信息。因此当所有的 Eureka Server 节点都宕掉,服务消费者依然可以使用缓存中的信息找到服务提供者,但是当服务有更改的时候会出现信息不一致。
- Eureka Client关键配置
(1)启用服务消费者从注册中心拉取服务列表的功能
eureka.client.fetch-registry=true
(2)每隔30s从server中拉取服务信息。
eureka.client.registry-fetch-interval-seconds=30
(3)Eureka Client每隔5s向Eureka Server发送心跳
eureka.instance.lease-renewal-interval-in-seconds=5
(4)到期时间(默认90秒).如果你约定时间内还没跟服务端说你还活着,就代表你已经死了。然后服务端就能把你踢了
eureka.instance.lease-expiration-duration-in-seconds =30
Eureka集群
- 没有主,从节点区分。某几个节点挂掉不会影响正常节点的工作,剩余的节点依然可以提供注册和查询服务。而 Eureka Client 在向某个 Eureka 注册时,如果发现连接失败,则会自动切换至其它节点。只要有一台 Eureka Server 还在,就能保证注册服务可用(保证可用性),只不过查到的信息可能不是最新的(不保证强一致性)。
Eureka基本流程总结
- Eureka Server 启动成功,等待服务端注册。在启动过程中如果配置了集群,集群之间定时通过 Replicate 同步注册表,每个 Eureka Server 都存在独立完整的服务注册表信息。
- Eureka Client 启动时根据配置的 Eureka Server 地址去注册中心注册服务。
- Eureka Client 会每 30s 向 Eureka Server 发送一次心跳请求,证明客户端服务正常。
- 当 Eureka Server 90s 内没有收到 Eureka Client 的心跳,注册中心则认为该节点失效,会注销该实例。
- 单位时间内 Eureka Server 统计到有大量的 Eureka Client 没有上送心跳,则认为可能为网络异常,进入自我保护机制,不再剔除没有上送心跳的客户端。
- 当 Eureka Client 心跳请求恢复正常之后,Eureka Server 自动退出自我保护模式。
- Eureka Client 定时全量或者增量从注册中心获取服务注册表,并且将获取到的信息缓存到本地。
- 服务调用时,Eureka Client 会先从本地缓存找寻调取的服务。如果获取不到,先从注册中心刷新注册表,再同步到本地缓存。
- Eureka Client 程序关闭时向 Eureka Server 发送取消请求,Eureka Server 将实例从注册表中删除。