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

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 处理这些请求的核心逻辑,以及相关配置如下图所示:

实例注册后需要发送心跳证明这个实例是活着的,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

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

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

上面我们提到了,同一区域内的 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

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

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

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

SpringCloud升级之路2020.0.x版-19.Eureka的服务端设计与配置的更多相关文章

  1. SpringCloud升级之路2020.0.x版-18.Eureka的客户端核心设计和配置

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

  2. SpringCloud升级之路2020.0.x版-16.Eureka架构和核心概念

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

  3. SpringCloud升级之路2020.0.x版-3.Eureka Server 与 API 网关要考虑的问题

    本系列为之前系列的整理重启版,随着项目的发展以及项目中的使用,之前系列里面很多东西发生了变化,并且还有一些东西之前系列并没有提到,所以重启这个系列重新整理下,欢迎各位留言交流,谢谢!~ 之前我们提到了 ...

  4. SpringCloud升级之路2020.0.x版-17.Eureka的实例配置

    本系列代码地址:https://github.com/HashZhang/spring-cloud-scaffold/tree/master/spring-cloud-iiford 上一节我们提到过, ...

  5. SpringCloud升级之路2020.0.x版-1.背景

    本系列为之前系列的整理重启版,随着项目的发展以及项目中的使用,之前系列里面很多东西发生了变化,并且还有一些东西之前系列并没有提到,所以重启这个系列重新整理下,欢迎各位留言交流,谢谢!~ Spring ...

  6. SpringCloud升级之路2020.0.x版-41. SpringCloudGateway 基本流程讲解(1)

    本系列代码地址:https://github.com/JoJoTec/spring-cloud-parent 接下来,将进入我们升级之路的又一大模块,即网关模块.网关模块我们废弃了已经进入维护状态的 ...

  7. SpringCloud升级之路2020.0.x版-6.微服务特性相关的依赖说明

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

  8. SpringCloud升级之路2020.0.x版-10.使用Log4j2以及一些核心配置

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

  9. SpringCloud升级之路2020.0.x版-34.验证重试配置正确性(1)

    本系列代码地址:https://github.com/JoJoTec/spring-cloud-parent 在前面一节,我们利用 resilience4j 粘合了 OpenFeign 实现了断路器. ...

随机推荐

  1. spring、springmvc、springboot、springcloud的联系与区别

    spring和springMvc: 1. spring是一个一站式的轻量级的java开发框架,核心是控制反转(IOC)和面向切面(AOP),针对于开发的WEB层(springMvc).业务层(Ioc) ...

  2. linux驱动之LED驱动

    通过之前的学习,了解到linux驱动编写的流程是:先通过注册函数注册我们编写的入口函数,然后在入口函数中获取设备号->注册字符设备->自动创建设备节点->获取设备树信息,最后通过销毁 ...

  3. Java | 日期类型的绍介和操作

    Date类 Date类在java.util.Date,Date类表示特定的瞬间,精确到毫秒.(毫秒是千分之一秒)毫秒可以对时间和日期进行计算,可以把日期转换为毫秒进行计算,计算完毕,再把毫秒转换为日期 ...

  4. 深入理解C++11 阅读笔记

    二 保证稳定性和兼容性保持与C99兼容 预定义宏 C99语言标准增加的一些预定义宏,C++11同样增加了对这些宏的支持 __func__预定义标识符 功能是返回所在函数的名字,在C++11中,标准甚至 ...

  5. Codeforces Round#687 Div2 题解

    打这场的时候迷迷糊糊的,然后掉分了( A Prison Break: 题面很复杂,但是题意很简单,仅需求出从这个点到四个角的最大的曼哈顿距离即可 #include <bits/stdc++.h& ...

  6. asp.net 读取 connectionStrings

    connectionStrings 在vs.net 2005 beta 2开始,如果你在web.config中使用了数据库连接字符串的配置,那么应该按如下的方法去写: <connectionSt ...

  7. keeplived+mycat+mysql高可用读写分离水平分表(谁看谁都会)

    一:环境准备: 应用 主机 mysql-master 192.168.205.184 mysql-slave 192.168.205.185 mycat-01,keeplived,jdk 192.16 ...

  8. [刘阳Java]_酷炫视频播放器制作_JS篇

    此文章是接着上次写的<酷炫视频播放器制作_界面篇>将其完善,我们主要给大家介绍一下如何利用JS脚本来控制视频的播放.为了让大家能够保持对要完成的功能有直接的了解,我们还是将效果图附到文章里 ...

  9. LeetCode 847. Shortest Path Visiting All Nodes

    题目链接:https://leetcode.com/problems/shortest-path-visiting-all-nodes/ 题意:已知一条无向图,问经过所有点的最短路径是多长,边权都为1 ...

  10. Redux-基本概念

    相关文档 1)         英文文档: https://redux.js.org/ 2)         中文文档: http://www.redux.org.cn/ 3)         Git ...