Eureka是Spring Cloud里面的一个组件,名为注册中心,分为Eureka Server与Eureka Client。Spring Cloud 微服务框架下有众多服务,各个服务都是独立部署运行的,需要一个统一的中心管理并注册各个服务,保存服务的metadata(ip地址,服务名等等),这时Eureka 便诞生出来了。
(1)Eureka Server服务端
Eureka服务端用作服务注册中心(注册服务)。支持集群部署
Eureka Server提供服务注册服务:各个节点启动后,会在Eureka Server中进行注册,这样Eureka Server中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到
(2)Eureka Client客户端
Eureka Client是一个Java客户端,用来处理服务注册与发现,简化与Eureka Server服务器的交互
Eureka-Client分类两类
1.Application Provider(生产者,服务提供者)
服务提供者。内嵌Eureka-Client,它向Eureka-Server注册自身服务、续约、下线等操作
2.Application Consumer(消费者,服务消费者)
服务消费者。内嵌Eureka-Client,它从Eureka-Server获取服务列表,分为全量获取和增量获取
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mDWiJVXM-1686810983011)(C:\Users\dongwei\AppData\Roaming\Typora\typora-user-images\image-20230607215622927.png)]
Eureka采用C-S设计架构。Eureka Server作为服务注册功能的服务注册中心。而系统中的其他微服务,使用Eureka的客户端连接到Eureka Server并维持心跳连接。这样系统的维护人员就可以通过Eureka Server来监控系统中各个微服务是否正常运行。Spring Cloud的一些其他模块(比如Zuul)就可以通过Eureka Server来发现系统中的其他微服务,并执行相关的逻辑
在应用启动时,Eureka客户端向服务端注册自己的服务信息,同时将服务端的服务信息缓存到本地。客户端会和服务端周期性的进行心跳交互,以更新服务租约和服务信息
Netflix Eureka是Spring Cloud的服务发现模块(Eureka默认端口:8761)。一个RESTful服务,用来定位运行在AWS地区(Region)中的中间层服务
客户端启动后,Jar中的定时任务会自动启动,定时向注册中心发送,客户端信息
注册中心也会通过定时任务查询各个客户端,查询没有反应,则会从服务器的注册列表中删除
Eureka Server: 扮演服务注册中心的角色,提供服务注册和发现的功能,每个Eureka Client向Eureka Server注册自己的信息,也可以 通过Eureka Server获取到其他服务的信息达到发现和调用其他服务的目的。
Replicate:服务同步,Eureka Server直接相互注册构建集群,注册表信息的同步拷贝,保持不同的Eureka Server集群中的注册表中的服务实例信息的一致性。提供了数据的最终一致性。
Cancel: 服务下线,Client在关闭时主动向Server注销服务实例元数据,这时Client的的服务实例数据将从Server的注册表中删除。
服务剔除,Client由于网络原因,没有发送请求给Server来进行服务下线,Eureka Server会每60秒遍历一次注册表中的信息,把超过90秒还没有续约的服务剔除。
Eureka Client:
Application Service:扮演了服务的提供者,提供业务服务,向Eureka Server注册和更新自己的信息,同时能从Eureka Server的注册表中获取到其他服务的信息。
服务注册-Register, Eureka Client 发送REST请求向Eureka Server注册自己的服务,提供自身的元数据,比如ip:port,url,Eureka Server接收请求后存储在一个双层的Map中。
服务续约-Renew,默认每隔30s发送一次心跳到Server维持和更新注册表中的服务实例元数据的有效性。当在一定时长内Server没有收到Client的心跳信息,将默认服务下线,将服务实例的信息从注册表中删除。
Application Client: 扮演了服务消费者,通过Eureka Server获取到注册到上面的其他服务的信息,从而根据信息找到所需的服务发起远程调用。
服务发现,Eureka Client在启动时, 发送REST请求向Eureka Server取到注册到上面的其他服务的信息,并缓存在本地,默认30s轮询一次。
服务调用,进行远程调用,一个Region可以包含多个Zone,优先调用同一个Zone的服务
数据存储层的registry是一个双层的ConcurrentHashMap,数据存储在内存中。
第一层的key是spring.application.name,value是第二层的ConcurrenthashMap;
第二层的ConcurrentHashMap的key是服务的InstanceId,value是Lease对象;
Lease对象包含了服务详情和服务治理的相关属性。
根据这个存储结构我们可以发现,Eureka Server 第一层都是存储着所有的服务名,以及服务名对应的实例信息。第二层是根据实例的唯一 ID 来存储的
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IrR2hERl-1686810983012)(C:\Users\dongwei\AppData\Roaming\Typora\typora-user-images\image-20230614222442490.png)]
Eureka实现了二级缓存来保存对外传输的服务信息。
一级缓存(readOnlyCacheMap):
ConcurrentHashMap
二级缓存(readWriteCacheMap):
Loading
Eureka Client 获取全量或者增量的数据时,会先从一级缓存中获取;如果一级缓存中不存在,再从二级缓存中获取;如果二级缓存也不存在,这时候先将存储层的数据同步到缓存中,再从缓存中获取。
通过 Eureka Server 的二层缓存机制,可以非常有效地提升 Eureka Server 的响应时间,通过数据存储层和缓存层的数据切割,根据使用场景来提供不同的数据支持。
删除二级缓存:
加载二级缓存:
更新一级缓存:
Eureka Server在运行期间会去统计心跳失败的比例在15分钟之内是否低于85% 如果发现85%以上的服务都没有心跳,Eureka Server会认为当前实例的客户端与自己的心跳连接出现了网络故障,那么Eureka Server会把这些实例保护起来,让这些实例不会过期导致实例剔除。
这样做的目的是为了减少网络不稳定或者网络分区的情况下,Eureka Server将健康服务剔除下线的问题。 使用自我保护机制可以使得Eureka 集群更加健壮和稳定的运行。
进入自我保护状态后,会出现以下几种情况
Eureka Server不再从注册列表中移除因为长时间没有收到心跳而应该剔除的过期服务
Eureka Server仍然能够接受新服务的注册和查询请求,但是不会被同步到其他节点上,保证当前节点依然可用。
protected volatile int numberOfRenewsPerMinThreshold; //每分钟最小续约数量
protected volatile int expectedNumberOfClientsSendingRenews; 预期每分钟收到续约的
客户端数量,取决于注册到eureka server上的服务数量的服务数量
Eureka的自我保护机制,都是围绕上面这两个变量来实现的。
NumberOfClientsSendingRenews; 预期每分钟收到续约的
客户端数量,取决于注册到eureka server上的服务数量的服务数量
Eureka的自我保护机制,都是围绕上面这两个变量来实现的。