前言
《SpringCloud项目实战系列》
在上一篇SpringCloud项目实战03 构建第一个微服务应用:helloworld已提到服务注册与发现中心(Eureka),本文将继续深入探讨Eureka的原理机制。
github:
https://github.com/dunzung/dcp-platform/tree/master/dcp-dmw/dcp-eureka
eureka server配置
eureka maven依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency>
eureka 注解@EnableEurekaServer
依托springboot程序类上加注解@EnableEurekaServer,表示该服务是服务注册与发现的server端,等待微服务来注册。
@EnableEurekaServer @SpringBootApplication public class EurekaServer { public static void main(String[] args) { SpringApplication.run(EurekaServer.class, args); } }
eureka服务注册中心,服务列表监控页展示
eureka几个核心概念
一、服务注册
eureka基于客户端与服务端模式,服务消费方和服务提供方都属于eureka的客户端。
一个服务提供方能够被服务消费方调用的前提是:
服务提供方必须在启动时,注册到服务注册中心-服务发现组件。这么做的目的是让服务消费方知道服务提供方的存在。
当然,服务消费方和服务提供方是一个相对概念,服务消费方可以是服务提供方,而服务提供方也可以是服务消费方。
另外eureka服务与eureka客户端通过发送心跳来证明客户端运行正常。
二、服务续约:心跳机制
当一个微服务(eureka客户端)注册到eureka服务注册中心后,那么问题来了,服务注册中心如何知道客户端是否还存活呢?
eureka的做法是:
每个客户端会以每隔30秒定时向服务注册中心发送一次心跳,来证明自己服务正常,这个过程就叫服务续约(renew)。
心跳默认间隔是30秒,可以通过下面属性进行更改。
eureka.instance.lease-renewal-interval-in-seconds
这么做的目的是避免客户端的注册信息被服务注册中心删除。如果客户端被服务注册中心删除,相当于客户端成为一个孤岛,无法对外提供服务。
对于服务注册中心来说,如果在默认时间内(90秒),也就是连续3次没有收到客户端的心跳,则会将该客户端实例从服务注册表中删除,避免客户端调用超时不可用。
三、客户端缓存服务注册列表
eureka客户端向注册中心完成注册后,同时会从注册中心获取所有服务注册列表,缓存到本地。如果客户端需要调用其他服务提供方数据,首先会从本地服务注册列表找到对应服务提供方实例,然后通过客户端均衡算法从服务提供方的多个实例中选一个实例进行调用。如果本地服务注册列表匹配不到服务提供方的具体实例,那么客户端则会从注册中心重新拉取所有服务注册表信息并缓存到本地。
一般情况下,客户端会定期(默认为30秒)从注册中心拉取服务注册列表,并更新到本地服务列表缓存。
传输协议
E客户端和服务注册中心用json/xml格式进行通信。在默认的情况下客户端使用压缩json格式来获取服务注册列表信息。
四、服务注销
当一个客户端下线前,会向注册中心发送下线请求后,该客户端将从注册中心服务列表删除。
五、自我保护机制
Eureka服务器自我保护模式开启的条件是:
当Eureka服务器每分钟收到心跳续租的数量低于一个阈值,就会触发自我保护模式。
只有当注册中心收到的心跳数大于阈值时,注册中心会自动退出自我保护模式。
心跳阀值计算公式:
客户端实例总数 ×(60/每个实例心跳间隔秒数)×自我保护系数(0.85)
其中,对于每个客户端心跳间隔时间默认是30秒,自我保护系数的默认值为0.85,该值可以通过
eureka.server.renewal-percent-threshold
属性进行更改。
也就是说,在默认情况下,如果有15%的客户端的心跳包丢失时,注册中心就会进入自我保护模式。
消除自我保护机制
eureka.server.enable-self-preservation = false
另外,如果注册中心是高可用的,也就是说有多个peer节点,peer节点之间如果出现同步失败,也会使注册中心进入自我保护状态。
注册中心会每间隔5分钟的间隔从peer节点(peer节点由eureka.client.service-url.defaultZone配置指定)中同步所有的服务注册列表给其他peer节点。
可以通过wait-time-in-ms-when-sync-empty属性指定时间间隔。
eureka.server.wait-time-in-ms-when-sync-empty
总结
springcloud的服务注册中心的注册逻辑还是比较简单,采用http协议进行数据传输,心跳机制维系服务注册中心与客户端。
另外提到eureka的peer节点,其实就是指的是eureka的高可用,接下来会详细介绍eureka如何做到高可用。
未完,,待续。
如果觉得本文对您有帮助的话,记得关注、转发哦,我会为大家持续提供原创干货。需要资料,请关注、转发+私信”微服务“,免费资料赠送。
本文暂时没有评论,来添加一个吧(●'◡'●)