SpringCloud组件中Eureka的原理是什么
更新:HHH   时间:2023-1-7


SpringCloud组件中Eureka的原理是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。


1. Eureka服务治理原理分析

    1. 关于服务注册:

(1)前面说过,服务注册中心会维护一个服务清单表,该清单表中存储了所有的服务名以及该服务名对应的所有服务实例信息(比如IP地址、端口号等),很快可以想到服务清单应该是一个Map结构。

(2)然后,服务提供者会通过Eureka客户端与服务中心(即Eureka服务端)进行服务注册,这个过程实际上就是将自己的服务名、IP地址、端口号等信息发送到服务注册中心进行保存。

    2. 关于服务发现(或者说服务同步):

(1)服务注册中心与服务提供方:

    服务提供方注册到服务注册中心后,会与服务中心始终保持一个服务清单同步,即通过Eureka客户端,获取到Eureka服务端中的所有服务清单数据,这个主要通过配置的注册中心地址来实现

eureka.client.serviceUrl.defaultZone=http://localhost:8081/eureka/

所以在单机服务注册中心的情况下,一旦服务注册中心挂了,就无法保证服务发现的准确性,但依旧能做的服务发现的,因为服务清单数据会缓存一份到服务提供方本地,即使服务注册中心挂了,依旧能通过这份缓存数据来进行服务发现以及调用,但是准确性就不能保证了,有可能某个服务已经下线或者上线了一个新的服务实例,都是无法感知到的

    或者说,是Eureka服务端将服务清单数据同步到各个Eureka客户端中,这样就会保证某个服务下线或上线能够及时的被其他服务感知到,就能保证服务发现,但问题是Eureka的这种服务清单数据同步方式会导致数据一致性比较差。

(2)Eureka服务注册中心集群:Eureka的集群模式说白了,就是将服务注册中心本身也看做一个服务,集群中的服务注册中心节点之间互相注册,就能够同步节点之间的服务清单,保证高可用性,即使某个服务注册中心节点挂了,其余服务注册中心节点也能进行服务治理。

    3. 关于服务续约:

    服务注册后,服务提供方还必须要时时向服务注册中心进行一次“心跳”请求,该请求用来告诉服务注册中心自己还“活着”,防止Eureka对该服务执行服务剔除,将该服务从服务列表中排除。这就是服务续约操作。

    服务续约有两个重要配置属性,可以依据项目需要进行调整

eureka.instance.lease-expiration-duration-in-seconds=90
eureka.instance.lease-renewal-interval-in-seconds=30

eureka.instance.lease-expiration-duration-in-seconds,该参数表示设置判断服务失效的时间,单位为秒,默认90秒

eureka.instance.lease-renewal-interval-in-seconds参数表示设置服务续约任务的调用间隔时间,也就是多久进行一次服务续约请求,单位为秒,默认30秒

这两个参数配置其实需要注意一下,因为假如注册的服务非常多,达到数百个,而且每个服务都部署了上百个实例,那么可以算算每天仅仅是服务治理所进行的日请求次数就能达到上千万次。以一个例子来进行简单的计算,

  • 以默认参数来说,100个服务部署在20个服务器上,那么就相当于一共有2000个服务实例。

  • 每个服务实例每分钟请求2次拉取注册表,每分钟请求2次发送心跳,也就是每分钟4次请求服务注册中心,2000个服务实例服务注册中心每分钟会有8000次请求。每秒大概估算为150次左右

  • 那么一天就会对服务注册中心进行8000*24*60=1152万次请求,也就是每天千万级请求量。

所以这两个配置参数也是需要进行适当调整的。至于为什么服务注册中心能够承受千万级日请求量,后面分析源码在详细介绍。

    4. 服务下线:在整个系统运行过程中,某个服务可能会由于各种各样的原因导致宕机下线,此时对于那些服务调用者来说,肯定是不能去调用这些服务的,所以服务中心就必须对这些下线的服务进行剔除。

    5. 对于服务消费者:服务消费者实际上通常也是一个服务,服务消费者和服务提供者一样,需要通过Eureka客户端来获取服务注册中心的可用服务清单,然后才能依据清单进行服务调用,具体的调用以及配置在后面结合Ribbon和Feign进行讲解。服务消费者主要需要配置两个参数

  • eureka.client.registry-fetch-interval-seconds=30:该参数表示从服务注册中心更新服务清单的时间间隔,单位是秒,默认为每30秒获取一次。

  • eureka.client.fetch-registry=true:该参数表是否获取服务清单,该参数必须为true,也默认为true

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注天达云行业资讯频道,感谢您对天达云的支持。

返回大数据教程...