疯狂SpringCloud微服务架构实战 (Eureka -- 常用配置)

1. 心跳检测配置

       客户端的实例会向服务器发送周期性的心跳,默认是30秒发送一次。可以通过修改客户端的 eureka.instance.leaseRenewallntervalInSeconds 属性来改变这个时间。

       服务器端接收心跳请求,如果在一定期限内没有接收到服务实例的心跳,那么会将该实例从注册表中清理掉,其他的客户端将无法访问这个实例。这个期限的默认值为90秒,且该时间可以通过修改客户端的 eureka.instance.leaseExpirationDurationInSeconds 属性来修改设定;也就是说,服务器90秒没有收到客户端的心跳,就会将这个实例从列表中清理掉;但需要注意的是,清理注册表有一个定时器在执行,默认是60秒执行一次,如果将 leaseExpirationDurationInSeconds 设置为小于60秒,虽然符合删除实例的条件,但是还没到60秒,这个实例将仍然存在注册表中 (因为还没有执行清理);我们可以在服务器端配置 eureka.server.eviction-interval-timer-in-ms 属性来修改注册表的清理时间间隔,该属性的单位是毫秒。

       需要特别注意的是:如果开启了自我保护模式,则实例不会被剔除。在测试时,为避免受自我保护的影响,建议先关闭自我保护模式,在服务器中配置:eureka.server.enable-self-preservation=false。

2. 注册表抓取时间间隔

       在默认情况下,客户端每隔30秒会去服务器端抓取注册表(可用的服务列表),并且将服务器端的注册表保存到本地缓存中。可以通过修改 eureka.client.registryFetch-IntervalSeconds 配置来改变注册表抓取间隔,但仍然需要考虑性能,改为哪个值比较合适,需要在性能与实时性方面进行权衡。

3. 配置与使用元数据

       框架自带的元数据包括:实例 id、主机名称、IP地址等,如果需要自定义元数据,并提供给其他客户端使用,可以配置 eureka.instance.metadata-map 属性来指定。元数据都会保存在服务器的注册表中,并且使用简单的方式与客户端进行共享。在正常情况下,自定义元数据不会改变客户端的行为,除非客户端知道这些元数据的含义,以下配置代码段使用了元数据:

eureka:
  instance:
    hostname: localhost
    metadata-map: 
      company-name: crazyit

       配置了一个名为 company-name 的元数据,值为 crazyit ,使用元数据的一方,可以调用 discoveryClient 的方法获取元数据,如以下代码所示:

@Autowired
private DiscoveryClient discoveryClient;

@RequestMapping(value = "/router", method=RequestMethod.GET)
public String router(){
    // 查询服务实例
    List siList = discoveryClient.getInstances("heart-beat-client");

    // 遍历实例并输出元数据值
    for(ServiceInstance service : siList){
        System.out.println(service.getMetadata().get("company-name"));
    }
    return "";
}

4. 自我保护模式

       在开发过程中,经常可以在 Eureka 的主界面中看到红色字体的提醒,内容如下:

       出现该提示意味着 Eureka 进入了自我保护模式。因为客户端会定时发送心跳给服务器端,如果心跳的失败率超过了一定的比例,服务会将这些实例保护起来,并不会马上将其从注册表中剔除。此时对于另外的客户端来说,有可能会拿到一些无法使用的实例,这种情况可能会导致灾难的 “蔓延”,这些情况可以使用容错机制予以解决。在开发过程中,为服务器配置 eureka.server.enable-self-preservation 属性,将值设置为 false 来关闭自我保护机制。关闭后再打开 Eureka 主界面,可以看到以下提示信息:

       自我保护模式已经关闭在出现网络或者其他问题时,将不会保护过期的实例。

你可能感兴趣的:(SpringCloud)