微服务:Eureka,Ribbon,Hystrix( 五 )

可以在程序中可以使用 DiscoveryClient 获取指定微服务的所有元数据信息:
@RestController@RequestMapping("/page")public class PageController {?@AutowiredRestTemplate restTemplate;?@AutowiredDiscoveryClient discoveryClient;?@GetMapping("/getProduct/{id}")public Products getProduct(@PathVariable Integer id) {// 1.获得 Eureka 中注册的 lagou-service-product 实例集合List<ServiceInstance> instances = discoveryClient.getInstances("lagou-service-product");// 2.获得实例集合中的第一个ServiceInstance instance = instances.get(0);// 3.根据实例信息拼接 IP 地址String host = instance.getHost();int port = instance.getPort();// 获取打印自定义元数据Map<String, String> metadata = https://www.isolves.com/it/cxkf/jiagou/2021-03-03/instance.getMetadata();Set> entries = metadata.entrySet();for (Map.Entry entry : entries) {System.out.println(entry.getKey() + " : " + entry.getValue());}String url = "http://" + host + ":" + port + "/product/query/" + id;// 调用并返回return restTemplate.getForObject(url, Products.class);}?}Eureka 客户端详解服务提供者(也是 Eureka 客户端)要向 EurekaServer 注册服务,并完成服务续约等工作 。
服务注册详解(服务提供者):
1)当导入了 eureka-client 依赖坐标,配置 Eureka 服务注册中心地址;
2)服务在启动时会向注册中心发起注册请求,携带服务元数据信息;
3)Eureka 注册中心会把服务的信息保存在 Map 中 。
服务续约详解(服务提供者):
服务每隔 30 秒会向注册中心续约 (心跳) 一次(也称为报活),如果没有续约,租约在 90 秒后到期,然后服务会被失效 。每隔 30 秒的续约操作称之为心跳检测 。

  • Eureka Client - 30s 续约一次,在 Eureka Server 更新自己的状态(Client 端进行配置) 。
  • Eureka Server - 90s 还没有进行续约,将该微服务实例从服务注册表(Map)剔除(Client端进行配置) 。
  • Eureka Client - 30s 拉取服务最新的注册表并缓存到本地(Client 端进行配置) 。
  • 往往不需要调整这两个配置 。
# 向 Eureka 服务中心集群注册服务eureka:instance:# 租约续约间隔时间,默认 30 秒lease-renewal-interval-in-seconds: 30# 租约到期,服务时效时间,默认值 90 秒, 服务超过 90 秒没有发生心跳,EurekaServer 会将服务从列表移除lease-expiration-duration-in-seconds: 90获取服务列表(服务注册表)详解(服务消费者):
每隔 30 秒服务会从注册中心中拉取一份服务列表,这个时间可以通过配置修改;往往不需要调整 。
# 向 Eureka 服务中心集群注册服务eureka:client:service-url:# 每隔多久拉取一次服务列表registry-fetch-interval-seconds: 301)服务消费者启动时,从 Eureka Server 服务列表获取只读备份,缓存到本地 。
2)每隔 30 秒,会重新获取并更新数据 。
3)每隔 30 秒的时间可以通过配置 eureka.client.registry-fetch-interval-seconds 修改 。
Eureka 服务端详解服务下线:
1)当服务正常关闭操作时,会发送服务下线的 REST 请求给 Eureka Server 。
2)服务中心接受到请求后,将该服务置为下线状态
失效剔除:
Eureka Server会定时(间隔值是 eureka.server.eviction-interval-timer-in-ms,默认 60s)进行检查,如果发现实例在在一定时间(此值由客户端设置的 eureka.instance.lease-expiration-duration-in-seconds 定义,默认值为 90s)内没有收到心跳,则会注销此实例 。
自我保护机制:
自我保护模式正是一种针对网络异常波动的安全保护措施,使用自我保护模式能使 Eureka 集群更加的健壮、稳定的运行 。
自我保护机制的工作机制是:如果在 15 分钟内超过 85% 的客户端节点都没有正常的心跳,那么 Eureka 就认为客户端与注册中心出现了网络故障,Eureka Server 自动进入自我保护机制,此时会出现以下几种情况:
  1. Eureka Server 不再从注册列表中移除因为长时间没收到心跳而应该过期的服务 。
  2. Eureka Server 仍然能够接受新服务的注册和查询请求,但是不会被同步到其它节点上,保证当前节点依然可用 。
  3. 当网络稳定时,当前 Eureka Server 新的注册信息会被同步到其它节点中 。
默认情况下,如果 Eureka Server 在一定时间内(默认 90 秒)没有接收到某个微服务实例的心跳,Eureka Server 将会移除该实例 。但是当网络分区故障发生时,微服务与 Eureka Server 之间无法正常通信,而微服务本身是正常运行的,此时不应该移除这个微服务,所以引入了自我保护机制 。


推荐阅读