深入理解SpringCloud之Eureka组件
Eureka的理解
-
Eureka是什么:Eureka是一种基于REST(Representational State Transfer)的服务,主要用于AWS云,用于定位服务,以实现中间层服务器的负载平衡和故障转移。
-
Eureka的作用:AWS Elastic Load Balancer是面向最终用户Web流量的边缘服务的负载平衡解决方案。Eureka满足了中层负载平衡的需求。
Eureka核心注解
@EnableDiscoveryClient和@EnableEurekaClient共同点就是:都是能够让注册中心能够发现,扫描到改服务。
不同点:@EnableEurekaClient只适用于Eureka作为注册中心,@EnableDiscoveryClient可以是其他注册中心。
从Spring Cloud Edgware开始,@EnableDiscoveryClient 或@EnableEurekaClient 可省略。
只需加上相关依赖,并进行相应配置,即可将微服务注册到服务发现组件上。
服务注册到注册中心
-
服务提供者在启动会向EurekaServer注册信息(包括服务名(EurekaServiceId)、service id、ip、port、心跳周期等)
-
EurekaServer获取注册请求,将服务实例信息存入到读写缓存中.服务消费者根据Eureka service id向EurekaSerer 获取要访问服务的注册信息,第一次请求会一次性拉取对应Eureka Service id 的全部服务实例信息。
-
EurekaServer收到请求后,会首先在只读缓存查找 ,如果找到则直接返回,否则再查找读写缓存,如果找到则将再存入到只读缓存中,然后返回查找结果服务提供者获取信息的,将服务实例信息缓存到本地,在使用时根据算法从N个服务中中选取一个服务并向这个服务发送请求
服务者与消费者
-
消费者和提供者是双向的,每个服务可能既是消费者又是服务者,所以默认每隔30秒向EurekaServer发送一次心跳,Eureka Server收到心跳后,更新服务的实例 同时 拉取服务的实例(第一次是全量,之后是增 量),更新的服务实例加入到”最近租约变更记录队列”中
-
拉取服务实例 根据 Eureka Server服务实例更新变动的返回值,进行增量,当然你本地也可以禁用全部拉取的服务实例,每次都进行全量添加
-
Eureka Server有个实例过期清理定时器,如果在指定时间内没有收到心跳(默认90s),则认为服务已经下线,会从读写缓存中移除此实例,将并此变化更新“最近租约变更记录队列”。通常建议将存活的最长时间设 置为3个心跳。
-
主动下线:在服务实例结束前,主动通知Eureka Server,在默认配置下,此时服务消费者最长在30s左右知道此服务已经下线。
-
被动下线:服务进度崩溃/网络异常,此时服务消费者最长在(3次心跳+一次刷新 频率30s)(共约120s左右)内知道此服务已经下线
Eureka缓存
Server有两个缓存,一个只读缓存,一个是读写缓存。
读写缓存:每次有服务实例状态变化(如注册服务、下线等)只会更新读写缓存
只读缓存永不过期,但是可能存在过期数据;此时为了保证只读数据的准确性,会有个定时器定时同步两个缓存然后将状态变化的服务实例添加到”最近租约变更记录队列”。
执行频率默认30s,为了提高实时性,可以关闭只读缓存。“最近租约变更记录队列” 里的数据也有有效期,默认为180s。当有注册、状态变更、下线时,会将创建最近租约变更记录加入此队列中用于注册信息增量获取后台任务定时顺序扫描队列,当数据最后更新时间超过一定时长后进行移除。
Eureka Server配置中心集群
-
每个EurekaServer注册的消息发生变化时,会各个服务之间定时同步,中间过程每个服务的数据可能不一致,但是最终会变得一致。
-
Eureka Server集群之间的状态是采用异步方式同步的,所以不保证节点间的状态一定是一致的,不过基本能保证最终状态是一致的。
-
com.netflix.eureka.registry.PeerAwareInstanceRegistryImpl eureka集群配置
eureka.server.peer-eureka-nodes-update-interval-ms 新的节点或者重启 服务间相互发现,设置定时更新服务。 -
当Eurekaserver启动时,他会从其它节点获取所有的注册信息。如果获取同步失败,它在一定时间(此值由决定)内拒绝服务。
-
复印所有的eureka操作到集群中其他节点,请求再次转发到其它的Eureka Server,调用同样的接口,传入同样的参数,除了会在header中标记isReplication=true,从而避免重复的replicate
-
注册登录的实例,并且复印此实例的信息到所有的eureka server的节点。如果其它Eureka server调用此节点,只在本节点更新实例信息,避免通知其他节点执行更新