SpringCloud Eureka 详解

先上图。。。一切围绕图展开
Eureka服务注册与发现
Eureka服务治理体系有三个核心角色:

服务提供者:
提供服务的应用,它将自己提供的服务注册到注册中心,以供其他应用发现。

  • 服务注册
    “服务提供者”在启动的时候会通过发送REST请求的方式将自己注册到Eureka Server上,同时带上了自身服务的一些元数据信息。Eureka Server接收到这个请求之后,将元数据的信息存储在一个双层Map中,其中第一层的key是服务名(spring.application.name),第二层的key是具体服务的实例ID(eureka.instance.instance-id)。
    eureka.client.register-with-eureka=true表示注册该服务,如果为false,将不会注册该服务
  • 服务续约
    在注册之后,服务提供者会维护一个心跳用来持续告诉Eureka Server“我还活着”,以防止Eureka Server“剔除任务”将该服务实例从服务列表中排除出去。
    eureka.instance.lease-renwal-interval-in-seconds=30用于定义服务续约的调用间隔时间,默认30秒
    eureka.instence.lease-expiration-duration-in-seconds=90用于定义服务失效的时间,默认90秒(如果90秒内没有接收到心跳,则该服务会被“剔除”)
  • 服务下线
    在系统运行过程中必然会面临关闭或重启服务的某个实例的情况,在服务关闭期间,我们自然不希望客户端会继续调用关闭了的实例,所以在客户端程序中,当服务实例进行正常的关闭操作时,它会触发一个服务下线的REST请求给Eureka Server,告诉服务注册中心:“我要下线了”,将该服务状态设置为下线(DOWN),并把该下线事件传播出去。

服务消费者:
从服务注册中心获取服务列表,从而使消费者可以知道去何处调用所需要的服务。

  • 获取服务
    当我们启动一个服务消费者的时候,它会发送一个REST请求给服务注册中心,来获取注册在Eureka Server上的服务清单,为了性能考虑,Eureka Server 会维护一份只读的服务清单来返回给客户端,同时缓存该清单,每隔30秒更新一次。
    eureka.client.fetch-registry=true用于定义是否获取服务注册信息,默认是true
    eureka.client.registry-fetch-interval-seconds=30用于修改缓存清单的更新时间,默认30秒

  • 服务调用
    当消费者获取服务清单后,通过服务名来获得具体服务的实例名和该实例的元数据信息,然后根据需要决定具体调用哪个实例。

服务注册中心:
Eureka提供的服务端,提供服务与发现功能。

  • 失效剔除
    有些时候,服务实例并不是正常下线,可能由于内存溢出,网络故障等原因使的服务不能正常工作,而服务注册中心并没有收到“服务下线”的请求,为了从服务列表中将这些无法提供服务的实例剔除,Eureka Server在启动时会创建一个定时任务,默认每隔60秒将当前清单中超时(默认90秒)没有续约的服务剔除出去。

  • 自我保护
    当我们在本地调试基于Eureka的程序时,很容易触发Eureka Server 的自我保护机制。服务注册到Eureka Server之后,会维护一个心跳连接,告诉Eureka Server自己还活着,Eureka Server在运行期间会统计心跳失败的比例在15分钟之内低于85%,如果出现低于这个值(单机调试很容易满足,生产环境通常是网络不稳定导致),Eureak Server会将当前的实例注册信息保护起来,让这些信息不会过期(不会注销任何微服务),尽可能的保护这些注册信息,当网络故障恢复后,Eureka Server节点会自动退出自我保护模式,但在这段保护时间内,实例若出现问题,那么客户端很容易拿到实际已经不存在的服务实例,会出现调用失败的情况,所以客户端必须要有容错机制,比如请求重试,熔断器等机制。
    自我保护模式是一种应对网络异常的安全保护措施,它的思想是宁可同时保留所有微服务(健康的微服务和不健康的微服务都会保留),不盲目注销任何健康的微服务。
    进入保护模式的条件:
    如果Eureka Server最近1分钟收到renew的次数小于阈值(即预期的最小值,默认为0.85),则会触发自我保护模式,此时Eureka Server此时会认为这是网络问题,它不会注销任何过期的实例,即使该实例确实是人为停掉的。
    退出保护模式的条件:
    直到最近收到renew的次数大于阈值后,则Eureka Server退出自我保护模式。

eureka.server.enable-self-preservation=false用来关闭保护机制,关闭之后注册中心可以将不可用的实例正确剔除(不推荐此操作)。

注: 在开发中,很多时候,一个服务即是服务提供者也是服务消费者,不要对上图理解有误

发布了8 篇原创文章 · 获赞 0 · 访问量 202

猜你喜欢

转载自blog.csdn.net/weixin_43175427/article/details/105425294