SpringCloud之Eureka理论篇

1.Eureka是什么

百度百科对于Eureka是这样解释的:

Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。SpringCloud将它集成在其子项目spring-cloud-netflix中,以实现SpringCloud的服务发现功能。

首先Eureka是一个服务发现框架,然后Eureka 通信是使用restful风格的,由Netflix 公司开源,然后被spring整合到springcloud的生态中作为服务注册发现组件,到2.x版本,Netflix停止对Eureka的维护工作。到底什么是服务发现框架呢?
可以这样理解,现在不是流行微服务嘛,然后我们进行微服务拆分的时候,我们根据业务拆出很多的服务出来,然后服务之间是是有依赖关系的,比如用户服务要去调用订单服务获取这个月我的订单等等,这样子的场景有很多,我用户服务应该怎样调用呢,直接使用httpclient类似这样的http请求工具,然后比如说我订单服务ip是10.0.1.21,端口8081,我就直接在我的用户服务里面请求这个http://10.0.1.21:8081/xxx,路径,我们这个服务往往有很多份,部署在不同的机器不同端口上,以后这个订单服务可能会换机器,你就到代码里面修改,或者配置类里面修改,这个调用路径要自己维护,麻烦的一批,我们微服务有很多的服务,服务之间的数据依赖,业务依赖也是很乱,我们总不能自己维护对方的ip跟端口吧,这时候服务发现与注册框架就起到作用了,它可以帮我们维护这个对方服务的ip+port,你只需要告诉它你要调用哪个服务就行了,这是服务发现框架的用处之一;其二就是,比如说我用户服务调用订单服务,订单服务有很多,服务多了就会出现各种问题,比如说服务挂了,用户服务调用的时候正好就调用到了挂的那个服务上,服务注册发现框架能够在一定时间内帮我们剔除这些挂的服务或者是为我们失败之后进行重试等等。

github地址:我是个链接
spring地址:我是个链接

2.原理图解

Eureka是由Server端(服务端)与 Client端(客户端)组成
SpringCloud之Eureka理论篇_第1张图片

  1. 不管是Eureka Server 还是Eureka Client 都可以单实例部署 与集群部署
  2. Eureka Server 向Client暴露restful风格服务接口,供客户端调用
  3. Eureka客户端又可以分为服务提供者与服务调用者(服务消费者),当我们服务提供者启动的时候,会对Eureka Server 发送注册信息,表示我可以提供服务了,然后服务提供着会每30秒向Eureka Server 进行续约(renew),告诉Server我还活着,如果Eureka Server 90秒没有收到Client的续约就会将此服务从服务列表中剔除。
  4. 服务调用者启动的时候也会向Eureka Server 注册,并且向Eureka Server 获取服务列表信息,缓存到本地,然后定时向Eureka Server拉取服务列表,这里定时时间默认是30秒。
  5. 这个服务列表其实就是维护了个 map ,key 就是服务名, 然后value 就是个list,是一个个的具体实例,包括ip,port等等其他信息。
  6. 服务调用者通过服务名拿到实例列表,然后根据一定的策略(这个策略可以是我们后期的负载均衡等)选出一个来,进行调用。

3.注册中心对比

我们知道,现在市面上的服务注册与发现框架贼多,像zookeeper ,etcd ,consul,nacos,eureka,sofa stack(蚂蚁金服开源)里面的服务注册组件等等。
SpringCloud之Eureka理论篇_第2张图片
(本图来源:链接)

4.详解

4.1 客户端详解

客户端分为服务提供者与服务消费者

服务注册:服务提供者服务启动的时候,会向服务注册中心注册,然后将自己的一些元数据信息上报给Eureka Server端,Eureka Server端会将这些信息保存到一个map中.
服务续约(心跳):服务会每30秒向注册中心进行服务续约,然后如果超过90秒注册中心没有收到该服务的续约,注册中心Eureka Server 就会从服务列表中剔除该服务,当然我们可以通过配置来调整 服务续约的时间间隔,与服务失效时间。

eureka:
 instance:
	# 服务续约时间间隔,这里默认是30秒
  lease-renewal-interval-in-seconds: 30
   # 如果超过多少秒 没有进行服务续约,注册中心就剔除该服务,这里默认是90
  lease-expiration-duration-in-seconds: 90

获取服务列表:服务消费者启动的时候,会向注册中心Eureka Server 获取一份服务列表,然后缓存到本地,之后每隔一段时间就去注册中心拉取一次最新的服务列表。这里这个间隔默认是30秒,当然我们也可以通过配置来修改

eureka:
 client:
 	# 每隔多长时间去服务注册中心拉取更新服务列表
  registry-fetch-interval-seconds: 30

4.2 服务端详解

服务下线:当客户端正常关闭的时候,会向服务注册中心发送下线请求,然后注册中心将该服务从服务列表中剔除。
服务剔除:客户端每隔30秒进行服务续约,然后超过默认90秒没有收到该服务的服务续约,注册中心就会从服务列表中将该服务剔除。
自我保护机制:SpringCloud之Eureka理论篇_第3张图片
这张图想必大家都见过,我记得我第一次玩这个Eureka的时候,经常会出现这个两行红字,当时慌的一批,其实这就是Eureka 开启了自我保护机制,这句话就是这里面这些实例续约低于阈值,然后Eureka为了安全起见,这些实例不会过期,也就是不会被剔除。其实在15分钟内85%的客户端没有心跳,Eureka 就会认为注册中心与客户端出现了网络故障,就会自己开启自我保护机制。
为什么要开启自我保护机制?
首先我们服务每隔30秒要进行服务续约,然后90秒没有收到该服务的服务续约,注册中心就会将该服务从服务列表中剔除。但是当网络分区故障发生时,客户端们无法与注册中心进行通信,但是这些服务实例都是正常运行的,此时就不能移除这些服务,所以就有了自我保护机制。
自我保护机制会干啥?
首先是服务列表里面的服务实例不会被剔除,保证了大多数服务依然可用。然后就是Eureka Server注册中心依然会接受服务的注册与查询请求,但是不会被同步到其他节点上去,当网络稳定时,才会将新注册的信息同步到其他节点上去,最后是我们可以通过配置来决定是否开启这个自我保护机制(默认是打开的):

eureka:
 server:
   # 关闭自我保护模式
  enable-self-preservation: false 

你可能感兴趣的:(springcloud,eureka,springcloud,注册中心)