专栏目录
31. FeignClient 实现断路器以及线程隔离限流的思路 5.所有项目的parent与spring-framework-common说明 19.Eureka的服务端设计与配置 16.Eureka架构和核心概念 36. 验证断路器正确性 28.OpenFeign的生命周期-进行调用 4.maven依赖回顾以及项目框架结构 40. spock 单元测试封装的 WebClient(上) 38. 实现自定义 WebClient 的 NamedContextFactory 1. 背景 37. 实现异步的客户端封装配置管理的意义与设计 35. 验证线程隔离正确性 29.Spring Cloud OpenFeign 的解析(1) 41. SpringCloudGateway 基本流程讲解(2) 44.避免链路信息丢失做的设计(1) 14.UnderTow AccessLog 配置介绍 15.UnderTow 订制 40. spock 单元测试封装的 WebClient(下) 17.Eureka的实例配置 7.从Bean到SpringCloud 6.微服务特性相关的依赖说明 12.UnderTow 简介与内部原理 11.Log4j2 监控相关 23.订制Spring Cloud LoadBalancer 21.Spring Cloud LoadBalancer简介 20. 启动一个 Eureka Server 集群 22.Spring Cloud LoadBalancer核心源码 24.测试Spring Cloud LoadBalancer 30. FeignClient 实现重试 8.理解 NamedContextFactory 43.为何 SpringCloudGateway 中会有链路信息丢失 41. SpringCloudGateway 基本流程讲解(1) 39. 改造 resilience4j 粘合 WebClient 44.避免链路信息丢失做的设计(2) 18.Eureka的客户端核心设计和配置 27.OpenFeign的生命周期-创建代理 42.SpringCloudGateway 现有的可供分析的请求日志以及缺陷 25.OpenFeign简介与使用 10.使用Log4j2以及一些核心配置 26.OpenFeign的组件 33. 实现重试、断路器以及线程隔离源码 13.UnderTow 核心配置 32. 改进负载均衡算法 3.Eureka Server 与 API 网关要考虑的问题 45. 实现公共日志记录 9.如何理解并定制一个Spring Cloud组件 2.微服务框架需要考虑的问题 34.验证重试配置正确性

19.Eureka的服务端设计与配置

干货满满张哈希
• 阅读 1017

19.Eureka的服务端设计与配置

本系列代码地址:https://github.com/HashZhang/spring-cloud-scaffold/tree/master/spring-cloud-iiford

19.Eureka的服务端设计与配置

Eureka Server 配置是 Eureka Server 需要的一些配置,包括之前多次提到的定时检查实例过期的配置,自我保护相关的配置,同一 zone 内集群相关的配置和跨 zone 相关的配置。在 Spring Cloud 中,Eureka 客户端配置以 eureka.server 开头,对应配置类为 EurekaServerConfigBean

根据上一节 Eureka 客户端分析,我们知道 Eureka 客户端主要访问如下几个接口:

  • 注册:POST /eureka/apps/appID
  • 心跳:PUT /eureka/apps/appID/instanceID
  • 获取所有服务实例:GET /eureka/apps
  • 增量获取所有服务实例:GET /eureka/apps/delta

Eureka Server 处理这些请求的核心逻辑,以及相关配置如下图所示:

19.Eureka的服务端设计与配置

19.Eureka的服务端设计与配置

实例注册后需要发送心跳证明这个实例是活着的,Eureka Server 中也有定时任务检查实例是否已经过期。

eureka:
    server:
      #主动检查服务实例是否失效的任务执行间隔,默认是 60s
      eviction-interval-timer-in-ms: 3000
      #这个配置在两个地方被使用:
      #如果启用用了自我保护,则会 renewal-threshold-update-interval-ms 指定的时间内,收到的心跳请求个数是否小于实例个数乘以这个 renewal-percent-threshold
      #定时任务检查过期实例,每次最多过期 1 - renewal-percent-threshold 这么多比例的实例
      renewal-percent-threshold: 0.85

19.Eureka的服务端设计与配置

服务器中有定时过期的任务,检查迟迟没有心跳的实例,并注销他们。自我保护主要针对集群中网络出现问题,导致有很多实例无法发送心跳导致很多实例状态异常,但是实际实例还在正常工作的情况,不要让这些实例不参与负载均衡。

eureka:
    server: 
      #注意,最好所有的客户端实例配置的心跳时间相关的配置,是相同的。这样使用自我保护的特性最准确。
      #关闭自我保护
      #我们这里不使用自我保护,因为:
      #自我保护主要针对集群中网络出现问题,导致有很多实例无法发送心跳导致很多实例状态异常,但是实际实例还在正常工作的情况,不要让这些实例不参与负载均衡
      #启用自我保护的情况下,就会停止对于实例的过期
      #但是,如果出现这种情况,其实也代表很多实例无法读取注册中心了。
      #并且还有一种情况就是,Eureka 重启。虽然不常见,但是对于镜像中其他的组件更新我们还是很频繁的
      #我倾向于从客户端对于实例缓存机制来解决这个问题,如果返回实例列表为空,则使用上次的实例列表进行负载均衡,这样既能解决 Eureka 重启的情况,又能处理一些 Eureka 网络隔离的情况
      #自我保护模式基于每分钟需要收到 renew (实例心跳)请求个数,如果启用了自我保护模式,只有上一分钟接收到的 renew 个数,大于这个值,实例过期才会被注销
      enable-self-preservation: false
      # 每分钟需要收到 renew (实例心跳)请求个数是需要动态刷新的,这个刷新间隔就是 renewal-threshold-update-interval-ms
      #更新流程大概是:计算当前一共有多少实例,如果大于之前期望的实例量 * renewal-percent-threshold(或者没开启自我保护模式),则更新期望的实例数量为当前一共有多少实例
      #之后根据期望的实例数量,计算期望需要收到的实例心跳请求个数 = 期望的实例数量 * (60 / expected-client-renewal-interval-seconds) * renewal-percent-threshold
      #公式中 60 代表一分钟,因为公式用到了 expected-client-renewal-interval-seconds,也就是实例平均心跳间隔,为了使这个公式准确,最好每个实例配置一样的心跳时间
      #默认 900000ms = 900s = 15min
      renewal-threshold-update-interval-ms: 900000
      #上面提到的实例平均心跳间隔,或者说是期望的心跳间隔,为了使这个公式准确,最好每个实例配置一样的心跳时间
      #默认 30s
      expected-client-renewal-interval-seconds: 30
      #这个配置在两个地方被使用:
      #如果启用用了自我保护,则会 renewal-threshold-update-interval-ms 指定的时间内,收到的心跳请求个数是否小于实例个数乘以这个 renewal-percent-threshold
      #定时任务检查过期实例,每次最多过期 1 - renewal-percent-threshold 这么多比例的实例
      renewal-percent-threshold: 0.85

19.Eureka的服务端设计与配置

上面我们提到了,同一区域内的 Eureka 服务器实例,收到的客户端请求,会转发到同一区域内的的其他 Eureka 服务器实例。同时,在某一 Eureka 服务器实例启动的时候,会从同一区域内其他 Eureka 服务器同步实例列表。并且,转发到其他 Eureka 服务器实例是异步转发的,这就有专门的线程池进行转发。同时,转发的也是 HTTP 请求,这就需要 HTTP 连接池:

eureka:
    server: 
      #Eureka Server 从配置中更新同一区域内的其他 Eureka Server 实例列表间隔,默认10分钟
      peer-eureka-nodes-update-interval-ms: 600000
      #启动时从其他 Eureka Server 同步服务实例信息的最大重试次数,直到实例个数不为 0,默认为 0,这样其实就是不同步
      registry-sync-retries: 0
      #启动时从其他 Eureka Server 同步服务实例信息重试间隔
      registry-sync-retry-wait-ms: 30000
      #集群内至少有多少个 UP 的 Eureka Server 实例数量,当前 Eureka Server 状态为 UP。默认 -1,也就是 Eureka Server 状态不考虑 UP 的集群内其他 Eureka Server 数量。
      min-available-instances-for-peer-replication: -1
      #请求其他实例任务的最大超时时间,默认 30 秒
      max-time-for-replication: 30000
      #用来处理同步任务的线程数量,有两个线程池,一个处理批量同步任务,默认大小为20
      max-threads-for-peer-replication: 20
      #另一个处理非批量任务(如果没用 AWS Autoscaling 对接相关特性则没有啥用),默认大小为20
      max-threads-for-status-replication: 20
      #处理批量任务的线程池队列长度,默认为 10000
      max-elements-in-peer-replication-pool: 10000
      #处理非批量任务的线程池队列长度,默认为 10000
      max-elements-in-status-replication-pool: 10000
      #Eureka Server 通过 httpclient 访问其他 Eureka Server 同步实例,httpclient 的连接超时,默认 200ms
      peer-node-connect-timeout-ms: 200
      #httpclient 的读取超时,默认 200ms,一般不用太长
      peer-node-read-timeout-ms: 200
      #httpclient 的最大总连接数量,默认 1000
      peer-node-total-connections: 1000
      #httpclient 的对于某一 host 最大总连接数量,默认 500
      peer-node-total-connections-per-host: 500
      #httpclient 的连接空闲保持时间,默认 30s
      peer-node-connection-idle-timeout-seconds: 30

19.Eureka的服务端设计与配置

Eureka 服务器会定时拉取其他区域的服务实例列表缓存在本地。在查询本地查询不到某个微服务的时候,就会查询这个远程区域服务实例的缓存。相关配置如下:

eureka:
    server: 
      #请求其他 Region 的 httpclient 的连接超时,默认 1000ms
      remote-region-connect-timeout-ms: 1000
      #请求其他 Region 的 httpclient 的读取超时,默认 1000ms
      remote-region-read-timeout-ms: 1000
      #请求其他 Region 的 httpclient 的最大总连接数量,默认 1000
      remote-region-total-connections: 1000
      #请求其他 Region 的 httpclient 的对于某一 host 最大总连接数量,默认 500
      remote-region-total-connections-per-host: 500
      #请求其他 Region 的 httpclient 的连接空闲保持时间,默认 30s
      remote-region-connection-idle-timeout-seconds: 30
      #请求其他 Region 的 http 请求是否开启 gzip,对于其他 Region 我们认为网络连接是比较慢的,所以默认开启压缩
      g-zip-content-from-remote-region: true
      #    remote-region-urls-with-name:
      #      region2eureka1: http://127:0:0:1:8212/eureka/
      #      region2eureka2: http://127:0:0:1:8213/eureka/
      #    remote-region-app-whitelist:
      #如果需要从其他 Region 获取实例信息,这个获取间隔,默认为 30s
      remote-region-registry-fetch-interval: 30
      #如果需要从其他 Region 获取实例信息,这个任务的线程池,默认为 20个
      remote-region-fetch-thread-pool-size: 20

Eureka 服务实例信息缓存配置

Eureka Server 在内存中存储所有服务实例信息,并且对于响应做了多层缓存。

eureka:
    server: 
        # 增量实例队列实例过期时间,默认 3 分钟
        retention-time-in-m-s-in-delta-queue: 180000
        # 增量实例队列过期任务间隔,默认 30s
        delta-retention-timer-interval-in-ms: 30000
        # 响应缓存中有两个主要元素,一个是 readOnlyCacheMap,另一个是 readWriteCacheMap
        # 是否使用 readOnlyCacheMap,默认为 true
        # 如果为是,则从 readOnlyCacheMap 读取,否则直接读取 readWriteCacheMap
        use-readonly-response-cahce: true
        # 初始 readWriteCacheMap 大小,默认 1000
        initial-capacity-of-response-cache: 1000
        # LoadingCache 缓存过期时间,默认 180s
        response-cache-auto-expiration-in-seconds: 9
        # 定时从 LoadingCache 同步到只读缓存的间隔时间,默认为 30s
        response-cache-update-interval-ms: 3000

19.Eureka的服务端设计与配置

我们这一节详细分析了 Eureka Server 相关的配置。下一节,我们将给大家提供一个配置模板,启动一个 Eureka Server 集群。

微信搜索“我的编程喵”关注公众号,每日一刷,轻松提升技术,斩获各种offer

19.Eureka的服务端设计与配置

点赞
收藏
评论区
推荐文章

暂无数据