SpringCloud中的Eureka注册中心详细解读
作者:爱敲代码的小楚
Eureka原理
概念:实现服务治理,即管理所有的服务信息和状态。 eureka分为两部分,Server端和Client端 Client端向Server端定时发送心跳包。 Server端根据Clinet端的心跳包,来维护一个服务列表(判断服务是否在线)。
- client功能
- 注册:每个微服务启动时,将自己的网络地址等信息注册到注册中心,注册中心会存储(内存中)这些信息。
- 获取服务注册表:服务消费者从注册中心,查询服务提供者的网络地址,并使用该地址调用服务提供者,为了避免每次都查注册表信息,所以client会定时去server拉取注册表信息到缓存到client本地。
- 心跳:各个微服务与注册中心通过某种机制(心跳)通信,若注册中心长时间和服务间没有通信,就会注销该实例。
- 调用:实际的服务调用,通过注册表,解析服务名和具体地址的对应关系,找到具体服务的地址,进行实际调用。
- server注册中心功能
- 服务注册表:记录各个微服务信息,例如服务名称,ip,端口等。注册表提供 查询API(查询可用的微服务实例)和管理API(用于服务的注册和注销)。
- 服务注册与发现:注册:将微服务信息注册到注册中心。发现:查询可用微服务列表及其网络地址。
- 服务检查:定时检测已注册的服务,如发现某实例长时间无法访问,就从注册表中移除。
1.服务注册
想要参与服务注册发现的实例首先需要向Eureka服务器注册信息 注册在第一次心跳发生时提交
- Renew:续租,心跳。Eureka客户需要每30秒发送一次心跳来续租
- Fetch Registry:Eureka客户端拉取注册表信息,并缓存在本地。可以30秒更新一次。
- Cancel:Eureka客户端在关闭时向Eureka服务器发送取消请求。这将从服务器的实例注册表中删除实例,从而有效地将实例从通信量中取出。
客户端配置选项
#续约发送间隔默认30秒,心跳间隔 eureka.instance.lease-renewal-interval-in-seconds=5 #表示eureka client间隔多久去拉取服务注册信息,默认为30秒,对于api-gateway,如果要迅速获取服务注册状态,可以缩小该值,比如5秒 eureka.client.registry-fetch-interval-seconds=5 # 续约到期时间(默认90秒) eureka.instance.lease-expiration-duration-in-seconds=60
服务器端配置选项
#关闭自我保护模式 eureka.server.enable-self-preservation=false #失效服务间隔 eureka.server.eviction-interval-timer-in-ms=3000
2.Eureka高可用
高可用:可以通过运行多个Eureka server实例并相互注册的方式实现。Server节点之间会彼此增量地同步信息,从而确保节点中数据一致。
写一个地址也行(但是server得互相注册),EurekaServer会自动同步,但为了避免极端情况,还是写多个。 集群中各个server会从其他server同步注册表信息。
#client配置 eureka: client: #设置服务注册中心的URL service-url: defaultZone: http://root:root@eureka-7801:7801/eureka/,http://root:root@eureka-7802:7802/eureka/
3.自我保护机制
- 默认情况下,Eureka Server在一定时间内(90s),没有接收到某个微服务心跳,就会将该服务注销。但是当网络出现问题、故障,微服务之间无法通信,就不应该直接注销了。所以Eureka Server的自我保护机制,是在短时间内出现大量客户端丢失,就不会从注册表中注销。
- 思想:宁可保留健康的和不健康的,也不盲目注销任何健康的服务。
- 关闭自我保护
eureka: server: enable-self-preservation: false
4.Eureka 健康检查
server和client通过心跳保持 服务列表,而只有状态为UP的服务才能被访问。看eureka界面中的status。 比如心跳一直正常,服务一直UP,但是此服务DB连不上了,无法正常提供服务(有的时候业务出现问题catch住异常,也可以手动传输DOWN让服务下线)。 此时,我们需要将 微服务的健康状态也同步到server。只需要启动eureka的健康检查就行。这样微服务就会将自己的健康状态同步到eureka。配置如下即可。 开启手动控制 在client端配置:将自己真正的健康状态传播到server。
eureka: client: healthcheck: enabled: true
Client端配置Actuator
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
改变健康状态的Service
@Service public class HealthStatusService implements HealthIndicator{ private Boolean status = true; public void setStatus(Boolean status) { this.status = status; } @Override public Health health() { // TODO Auto-generated method stub if(status) return new Health.Builder().up().build(); return new Health.Builder().down().build(); } public String getStatus() { // TODO Auto-generated method stub return this.status.toString(); }
5.Eureka监听事件
- EurekaInstanceCanceledEvent 服务下线事件
- EurekaInstanceRegisteredEvent 服务注册事件
- EurekaInstanceRenewedEvent 服务续约事件
- EurekaRegistryAvailableEvent 注册中心可用事件
- EurekaServerStartedEvent 注册中心启动
import org.springframework.cloud.netflix.eureka.server.event.EurekaInstanceCanceledEvent; import org.springframework.context.event.EventListener; import org.springframework.stereotype.Component; @Component public class CustomEvent { @EventListener public void listen(EurekaInstanceCanceledEvent e) { System.out.println(e.getServerId()+"下线事件"); } } 将Eureka Client停止后打印: api-listen-order:30.136.133.9:port下线事件
6.Eureka缺陷
集群之间的同步复制是通过HTTP的方式进行,基于网络的不可靠性,集群中的Eureka Server间的注册表信息难免存在不同步的时间节点,不满足CAP中的C(数据一致性)。
到此这篇关于SpringCloud中的Eureka注册中心详细解读的文章就介绍到这了,更多相关SpringCloud的Eureka注册中心内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!