前言
上一篇文章Eureka简介及简单使用 我们通过一些简单示例,对Eureka有了一些简单了解。
我们这片文章将深入了解Eureka,详细介绍Eureka的基础架构、节点间的通信机制以及一些进阶配置等。
正文
基础架构
Eureka服务治理基础架构的三个核心要素:
- 服务注册中心:Eureka提供的服务端,提供服务注册与发现功能。也就是上篇文章里的eureka-server。
- 服务提供者:提供服务的应用,可以是SpringBoot应用,也可以是其他技术平台且遵循Eureka通信机制的应用。它将自己提供的服务注册到Eureka,以供其他应用发现。也就是上篇文章里的sakura-service。
- 服务消费者:消费者应用从服务注册中心获取服务列表,从而使消费者可以知道去何处调用其所需要的服务。也就是上篇文章里的sakura-consumer。
注:很多时候,客户端既是服务提供者也是服务调用者。
服务治理机制
要理解服务治理机制,我们先看一下这张图。
根据上图,我们来详细了解下Eureka从服务注册到服务调用,及各个元素所涉及的一些重要通信行为。
服务提供者
服务提供者主要有服务注册、服务续约、服务下线等行为,我们分别来看下。
服务注册
服务提供者在启动的时候会通过发送REST请求的发送将自己注册到Eureka Server上,同时带上自身服务的一些元数据信息。Eureka Server接受到这个REST请求之后,将元数据信息存储在一个双层结构Map中,其中第一层key是服务名,第二层key是具体服务的实例名。
服务注册时,需要
eureka.client.register-with-eureka
参数为true(默认为true),如果设置为false该服务实例将不会进行服务注册操作。服务续约
服务注册完成后,服务提供者会维护一个心跳,用来持续告诉Eureka Server:“我还活着”,以防止Eureka Server的“剔除任务”将该服务实例从服务列表剔除,我们称该操作为服务续约。
服务续约有两个重要参数可以进行配置(Eureka Server的配置文件里),如下:
1
2
3
4# 定义服务续约任务的调用间隔时间,默认30s
30 =
# 定义服务失效的时间,默认90s
90 =服务下线
在系统运行过程中存在临时关闭或者重启某个实例的情况,在该实例服务关闭期间,我们不希望客户端继续调用服务关闭的实例。所以在客户端程序中,当服务实例进行正常的关闭操作时,它会触发一个服务下线的REST请求给Eureka Server,告诉注册中心“我要下线了”,注册中心收到请求后会将该服务状态置为下线(DOWN),并把该下线事件传播出去。
服务消费者
服务消费者主要有获取服务、服务调用等行为,我们分别来看下。
获取服务
当我们启动服务消费者时,它会发送一个REST请求给服务注册中心,来获取上面注册的服务清单。为了性能考虑,Eureka Server会维护一份只读的服务清单来返回给客户端,同时该缓存清单会每个30s更新一次。
如果想要修改缓存清单更新时间,可以通过下面参数进行修改,该参数默认30s。
1
30 =
获取服务列表是服务消费者的基础,可以通过修改下面参数为false使服务消费者不生效,该值默认为true。
1
true =
服务调用
服务消费者在获取到服务清单后,通过服务名可以获取到提供该服务的实例名和该实例的元数据信息。有了这些服务实例的详细信息,服务消费者可以根据自己的需要选择要调用的实例。如采用轮询等方式,进而实现客户端负载均衡。
对于访问实例的选择,Eureka中有Region和Zone的概念,一个Region中可以包含多个Zone,每个服务客户端需要被注册到一个Zone中,所以每个客户端对应一个Region和一个Zone。在进行服务调用的时候,优先访问同处于一个Zone的服务提供方,若访问不到,就访问其他的Zone。
服务注册中心
服务注册中心主要有服务同步、失效剔除、自我保护等行为,我们分别来看下。
服务同步
如上图,两个服务提供者分别注册到了两个不同的服务注册中心上,即它们的信息分别被两个服务注册中心维护。由于服务注册中心之间相互注册为服务,当服务提供者发送注册请求到一个注册中心时,注册中心会将该请求转发给集群中相连的其他注册中心,从而实现注册中心之间的服务同步。
服务同步后,两个服务提供者的服务信息可以在这两台注册中心中任意一台上获取到。
失效剔除
有些时候,我们服务实例不一定会正常下线,可能由于内存溢出、网络故障等原因导致该实例无法正常工作,而注册中心无法收到下线请求。为剔除这些无法提供服务的实例,Eureka Server在启动时会创建一个定时任务,每个一段时间(默认60s)将当前清单中超时(默认90s)没有续约的服务实例剔除出去。
自我保护
我们知道,服务注册到Eureka Server之后,会维护一个心跳连接,告诉Eureka Server自己还活着。Eureka Server在运行期间,会统计心跳的比例在15min之内是否低于85%,如果出现低于的情况(如单机调试、生产环境网络问题等),Eureka Server会将当前的实例信息保护起来,让这些实例不会过期,尽可能保护这些注册信息。但是保护期内如果实例出现问题,服务调用方拿到已经不存在的服务实例,就会出现调用失败的情况,所以服务调用方需要有容错机制,如请求重试、断路器等。
Eureka Server进入自我保护后,注册中心信息面板上会出现类型下面的红色警告信息:
1
EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.
我们本地调试很容易触发Eureka的自我保护机制,这可能导致我们的服务实例不是那么准确。我们可以通过设置下面参数来关闭自我保护机制,该值默认为true,表示开启自我保护机制。
1
false =
源码分析
我们通过@EnableDiscoveryClient
这个注解,可以找到com.netflix.discovery.DiscoveryClient
这个类,过程略。
我们来看下这个类,这个类是Netflix开源包中的内容,位于eureka-client
包下。
这个类主要有以下功能:
- 向Eureka Server注册服务实例;
- 向Eureka Server服务租约;
- 当服务关闭时,向Eureka Server取消租约;
- 查询Eureka Server中的服务实例列表。
为保证与Eureka Server交互,我们需要配置一个Eureka Server的URL列表,即之前所说的eureka.client.service-url
参数。
关于这个类,我们主要看一下它的initScheduledTasks
方法。我们可以看到这个方法在DiscoveryClient
的构造器里被调用。
1 | private void initScheduledTasks() { |
可以看到这个方法里面主要有几个定时任务线程,分别被两个if包围,分别是if (clientConfig.shouldFetchRegistry())
和if (clientConfig.shouldRegisterWithEureka())
,这两个参数也是我们上面说的可以配置的,代表着是否开启服务消费eureka.client.fetch-registry=true
和是否开启服务注册eureka.client.register-with-eureka=true
。
对于if (clientConfig.shouldRegisterWithEureka())
逻辑里我们可以看到创建了InstanceInfoReplicator
的一个实例并启动,该类继承Runable接口,我们找到它的run方法,如下:
1 | public void run() { |
可以看到里面调用了discoveryClient.register()
方法,这个方法便是服务注册的主要方法,我们看下:
1 | boolean register() throws Throwable { |
可以看到注册操作通过REST进行,发送一个com.netflix.appinfo.InstanceInfo
对象,该对象就是注册时客户端给服务端的服务元数据。
继续跟进registrationClient.register
方法,找到RestTemplateEurekaHttpClient
实现的register
方法,代码如下:
1 | public EurekaHttpResponse<Void> register(InstanceInfo info) { |
可以看到注册是以gzip和POST请求发送的。
在com.netflix.eureka.resources.ApplicationsResource
类,可以看到服务注册中心是如何处理服务注册请求的,如下:
1 |
|
1 |
|
经过一些校验然后进行注册。
1 |
|
最终通过publishEvent
方法将注册事件传播出去,提供给其他Eureka Server。这一块的过多代码我们不在分析。
再来看下com.netflix.discovery.DiscoveryClient
这个类剩下的两个Timer,它们分别调用了new HeartbeatThread()
和new CacheRefreshThread()
,明显知道两个分别是心跳检测和刷新线程,里面也可以看到它们也可以通过参数进行配置一些信息。
我们先来看下HeartbeatThread
类,代码如下:
1 | private class HeartbeatThread implements Runnable { |
可以看到renew
方法,这是服务续约的主要方法,我们看下代码:
1 | boolean renew() { |
这段代码不再过多介绍。
我们再来看下CacheRefreshThread
类,这个类可以获取服务列表并缓存。
1 | class CacheRefreshThread implements Runnable { |
refreshRegistry
方法和fetchRegistry
方法代码较多,我只展示了关键部分。
1 |
|
1 | private boolean fetchRegistry(boolean forceFullRegistryFetch) { |
关于fetchRegistry
方法,可以看到它会根据是否第一次进行服务获取而发起了不同的REST请求和响应,如果是第一次,会获取全部服务信息getAndStoreFullRegistry
方法,否则获取更新部分的信息getAndUpdateDelta
。
关于Eureka中的Region、Zone和serviceUrls,我们来看下,通过配置的eureka.client.service-url
属性,我们可以很方便的找到org.springframework.cloud.netflix.eureka.EurekaClientConfigBean
类中的getEurekaServerServiceUrls
方法,它的代码如下:
1 | public List<String> getEurekaServerServiceUrls(String myZone) { |
这个方法在com.netflix.discovery.endpoint.EndpointUtils
的getServiceUrlsFromConfig
方法会被调用,用于获取Region和Zone。
1 | public static List<String> getServiceUrlsFromConfig(EurekaClientConfig clientConfig, String instanceZone, boolean preferSameZone) { |
从上面代码可以看出,当我们没有为Region配置Zone时,将默认采用defaultZone,若要为应用指定Zone,可以通过eureka.client.availability-zones
来进行指定,Zone可以设置多个,通过逗号分隔来进行设置,可以判断Region和Zone是一对多的关系。
设置Zone可以在负载均衡时实现区域亲和特性,例如Ribbon的负载均衡策略会优先访问客户端处于同一个Zone的服务端实例,该Zone域没有服务端可用实例后才会访问其他Zone。我们结合实际部署物理结构,可以有效地设计出针对区域性故障的容错集群。
配置信息
我们上面讲了许多源码,可能很多同学也没有细看,大家更注重的是Eureka的快速上手和使用,这儿,我把Eureka配置的一些参数总结下,来供大家参考,用于解决一些实际问题。
Eureka client 配置项
参数Key | 说明 | 参数Value类型 | 参数Value默认值 | 注意 |
---|---|---|---|---|
eureka.client.register-with-eureka | 是否向注册中心注册当前实例 | boolean | true | 对于高可用的Eureka Server集群,该值需为true,以形成一组相互注册的Server集群 |
eureka.client.fetch-registry | 是否需要检索服务信息(从注册中心获取服务信息) | boolean | true | 同上 |
eureka.client.enabled | 是否启用Eureka Client | boolean | true | |
eureka.client.service-url | 服务注册地址(注册中心地址)(一般使用默认配置eureka.client.service-url.defaultZone) | Map<String,String> | 该值由于是Map,有一个默认key值defaultZone(常用),也可以自己指定Zone,如下格式eureka.client.service-url.testZone=http://172.30.13.173:8002/eureka/,http://172.30.13.173:8003/eureka/ 参数是服务注册中心地址,多个地址以逗号隔开,其中testZone需要通过eureka.client.availability-zones参数指定 | |
eureka.client.availability-zones | 可用的Zone列表(一般无需配置) | Map<String,String> | 该值由于是Map,有一个默认key值us-east-1(代表Region),也可以自己指定Region,如下格式eureka.client.availability-zones.testRegion=testZone,testZone1 参数表示可用的Zone,以逗号分开,其中testRegion需要通过eureka.client.region指定 | |
eureka.client.region | Eureka Client Region域 | String | us-east-1 | |
eureka.client.registry-fetch-interval-seconds | 从注册中心同步服务信息的间隔时间(单位:秒) | int | 30 | |
eureka.client.prefer-same-zone-eureka | 是否偏好使用处于相同Zone的Eureka服务端 | boolean | true | |
eureka.client.filter-only-up-instances | 获取实例时是否过滤,仅保留UP状态的实例 | boolean | true | |
eureka.client.use-dns-for-fetching-service-urls | 使用DNS来获取Eureka服务端的serviceUrl | boolean | false | |
eureka.client.heartbeat-executor-thread-pool-size | 心跳连接池的初始化线程数 | int | 2 | |
eureka.client.heartbeat-executor-exponential-back-off-bound | 心跳超时重试延迟时间的最大乘数值 | int | 10 | |
eureka.client.cache-refresh-executor-thread-pool-size | 缓存刷新线程池的初始化线程数 | int | 2 | |
eureka.client.cache-refresh-executor-exponential-back-off-bound | 缓存刷新超时重试延迟时间的最大乘数值 | int | 10 | |
eureka.client.healthcheck.enabled | 是否进行健康状态检测 | boolean | true | |
eureka.client.instance-info-replication-interval-seconds | 更新实例信息的变化到Eureka服务端的间隔时间,单位为秒 | int | 30 | |
eureka.client.initial-instance-info-replication-interval-seconds | 初始化实例信息的变化到Eureka服务端的间隔时间,单位为秒 | int | 40 | |
eureka.client.eureka-service-url-poll-interval-seconds | 轮询Eureka服务地址更改的时间间隔,单位秒 | int | 300 | 当我们与Spring Cloud Config配合,动态刷新Eureka的serviceURL地址时需要关注该参数 |
eureka.client.eureka-server-read-timeout-seconds | 读取Eureka Server信息超时时间,单位秒 | int | 8 | |
eureka.client.eureka-server-connect-timeout-seconds | 连接Eureka Server的超时时间,单位秒 | int | 5 | |
eureka.client.eureka-server-total-connections | 从Eureka客户端到Eureka服务端的连接总数 | int | 200 | |
eureka.client.eureka-server-total-connections-per-host | 从Eureka客户端到每个Eureka服务端的连接总数 | int | 50 | |
eureka.client.eureka-connection-idle-timeout-seconds | Eureka服务端空闲连接关闭时间,单位秒 | int | 30 | |
eureka.client.eureka-server-port | 获取要用于构造服务url的端口,以便在eureka服务器列表来自DNS时联系eureka服务器 | String | 如果返回服务url eurekaServerServiceUrls(字符串),则不需要此信息。当useDnsForFetchingServiceUrls设置为true时,将使用DNS机制,eureka客户机希望DNS以某种方式配置,以便它能够动态获取更改的eureka服务器。更改在运行时生效 | |
eureka.client.eureka-server-d-n-s-name | 获取要查询的DNS名称,以获得eureka服务器列表 | String | 如果通过实现serviceUrls返回服务url,则不需要此信息。当useDnsForFetchingServiceUrls设置为true时,将使用DNS机制,eureka客户机希望DNS以某种方式配置,以便它能够动态获取更改的eureka服务器。更改在运行时生效 | |
eureka.client.eureka-server-u-r-l-context | 获取要用于构造服务URL的URL上下文,以便在eureka服务器列表来自DNS时通知eureka服务器 | String | 如果从eurekaServerServiceUrls返回服务url,则不需要此信息。当useDnsForFetchingServiceUrls设置为true时,将使用DNS机制,eureka客户机希望DNS以某种方式配置,以便它能够动态获取更改的eureka服务器。更改在运行时生效 | |
eureka.client.proxy-host | 获取eureka服务的代理主机 | String | ||
eureka.client.proxy-port | 获取eureka服务的代理端口 | String | ||
eureka.client.proxy-user-name | 获取eureka服务的代理用户名 | String | ||
eureka.client.proxy-password | 获取eureka服务的代理密码 | String | ||
eureka.client.g-zip-content | eureka注册表的内容是否要进行压缩 | boolean | true | |
eureka.client.allow-redirects | 服务器是否可以将客户机请求重定向到备份服务器/集群 | boolean | false | 如果设置为false,服务器将直接处理请求,如果设置为true,它可能向客户机发送HTTP重定向,并提供一个新的服务器位置。 |
eureka.client.should-enforce-registration-at-init | 客户端是否应在初始化期间强制注册 | boolean | false | |
eureka.client.should-unregister-on-shutdown | 客户端关闭时是否应显式地从远程服务器注销自己 | boolean | true | |
eureka.client.registry-refresh-single-vip-address | 客户端是否只对单个VIP的注册地址信息感兴趣 | String | ||
eureka.client.client-data-accept | 客户端数据接收的EurekaAccept名称 | String | full | full支持LegacyJacksonJson、JacksonJson、XStreamJson、XStreamXml、JacksonXml;compact支持JacksonJsonMini、JacksonXmlMini |
eureka.client.fetch-remote-regions-registry | 将获取eureka注册表信息的区域的逗号分隔列表 | String | 配置此参数后,必须为每个availability zones定义regions用于返回availabilityZones参数。否则,将导致客户端启动失败。 | |
eureka.client.decoder-name | 临时解码器 | String | 这是一个临时配置,一旦最新的编解码器稳定下来,就可以删除它(因为只有一个编解码器) | |
eureka.client.encoder-name | 临时编码器 | String | 这是一个临时配置,一旦最新的编解码器稳定下来,就可以删除它(因为只有一个编解码器) | |
eureka.client.order | 该参数可使“CompositeDiscoveryClient”对服务提供者上可用的客户端排序 | int | 0 | |
eureka.client.disable-delta | eureka客户端是否应该禁用对delta的抓取,从而每次都是请求获取全部服务信息 | boolean | false | 注意,设置为true后不会增量更新服务注册信息,而是全量更新,delta获取(增量更新)可以极大地减少流量,因为eureka服务器的更改速度通常比获取速度低得多。更改在运行时的下一个服务注册信息获取周期中有效,该周期由registryFetchIntervalSeconds指定 |
eureka.client.log-delta-diff | 是否根据服务注册信息记录eureka服务端和eureka客户端之间注册信息的差异 | boolean | false | Eureka客户端尝试仅检索来自Eureka服务器的增量更改,以最小化网络流量。在接收到增量之后,eureka客户端将协调来自服务器的信息,以验证它没有遗漏某些信息。当客户端与服务器通信出现网络问题时,可能会发生协调失败。如果对账失败,eureka客户端将获得完整的服务注册信息。在获得完整的注册表信息时,eureka客户端可以记录客户端和服务器之间的差异,而这个设置控制着这一点。更改在运行时的下一个注册信息获取周期中有效,该周期由registryFetchIntervalSecondsr指定 |
eureka.client.on-demand-update-status-change | 是否将客户端状态同步到远程Eureka服务器 | boolean | true | 如果设置为true,则通过ApplicationInfoManager将本地状态变化注册/更新到远程eureka服务器 |
eureka.client.backup-registry-impl | 获取服务注册信息实现类的名称,该类需要实现BackupRegistry接口,在Eureka客户端启动时只能触发一次,来拿到服务注册信息 | String | 对于需要额外弹性来处理注册信息的应用程序来说,这个参数可能会用到,否则服务注册信息我们是无法显式操作的 | |
eureka.client.property-resolver | property参数转换,可以实现自定义property文件类 | PropertyResolver | 需要实现PropertyResolver接口的类 | |
eureka.client.dollar-replacement | 在序列化/反序列化eureka服务器中的信息时,获取美元符号$ 的替换字符串 | String | _- | |
eureka.client.escape-char-replacement | 在序列化/反序列化eureka服务器中的信息时,获取下划线符号_ 的替换字符串 | String | __ |
Eureka instance 配置项
参数Key | 说明 | 参数Value类型 | 参数Value默认值 | 注意 |
---|---|---|---|---|
eureka.instance.hostname | 主机名 | String | 不配置的话将根据操作系统的主机名来获取 | |
eureka.instance.appname | 服务名 | String | unknown | 默认取spring.application.name的配置值,两者都没有配置为默认值unknown |
eureka.instance.instance-id | 实例ID | String | 一般如下配置eureka.instance.instance-id=${server.address}:${server.port} | |
eureka.instance.prefer-ip-address | 是否使用IP定义主机名标识 | boolean | false | |
eureka.instance.lease-renewal-interval-in-seconds | Eureka客户端向服务端发送心跳的时间间隔,单位秒 | int | 30 | |
eureka.instance.lease-expiration-duration-in-seconds | Eureka服务端在收到最后一次心跳之后等待的时间上限,单位秒 | int | 90 | 超过改时间后服务端会将该实例从服务清单上剔除,从而禁止服务调用请求被发送到该实例上 |
eureka.instance.non-secure-port | 非安全通信端口号 | int | 80 | |
eureka.instance.non-secure-port-enabled | 是否开启非安全通信端口号 | boolean | true | |
eureka.instance.secure-port | 安全通信端口号 | int | 443 | |
eureka.instance.secure-port-enabled | 是否开启安全通信端口号 | boolean | false | |
eureka.instance.namespace | 获取用于查找属性的名称空间 | String | eureka | SpringCloud下该属性不生效,会被忽略 |
eureka.instance.virtual-host-name | 获取为此实例定义的虚拟主机名 | String | unknown | 这通常是其他实例使用虚拟主机名查找此实例的方式。如果你需要查找此实例,这个主机名也是完全合格的 |
eureka.instance.secure-virtual-host-name | 获取此实例的安全的虚拟主机名 | String | unknown | |
eureka.instance.environment | 实例所属环境 | Environment | 设置后会读取指定环境下的spring.application.name属性 | |
eureka.instance.health-check-url-path | 实例健康检测的相对路径 | String | /actuator/health | |
eureka.instance.health-check-url | 实例健康状态检测的绝对地址URL | String | 如果页面就是在当前服务实例下,只需提供healthCheckUrlPath参数即可,否则可能代理的其他的服务器信息,需要提供绝对地址,如果提供了绝对地址,优先使用绝对地址 | |
eureka.instance.secure-health-check-url | 实例健康状态检查安全访问地址 | String | ||
eureka.instance.home-page-url-path | Eureka实例展示主页的相对路径 | String | / | |
eureka.instance.home-page-url | Eureka实例展示主页的绝对路径 | String | 参照health-check-url | |
eureka.instance.status-page-url-path | 实例状态信息监控相对地址 | String | /actuator/info | |
eureka.instance.status-page-url | 实例状态信息监控绝对地址 | String | 参照health-check-url | |
eureka.instance.instance-enabled-onit | 是否使该实例在向eureka注册后是否可以立即进行通信 | boolean | false | 有时,应用程序可能需要进行一些预处理,然后才能处理请求;如不需预处理,可设置为true |
eureka.instance.registry.default-open-for-traffic-count | 该实例,注册服务中心,默认打开的通信数量 | int | 1 | |
eureka.instance.registry.expected-number-of-clients-sending-renews | 单位时间期望的续约连接数量 | int | 1 | 此数需要大于0,以确保注册中心可以根据注册数量调整失效清除策略,如果设为0,即使注册成功也不会重置速率阈值 |
eureka.instance.data-center-info | 返回部署此实例的数据中心。如果实例部署在AWS中,则此信息用于获取一些特定于AWS的实例信息 | DataCenterInfo | DataCenterInfo.Name.MyOwn | |
eureka.instance.initial-status | 实例初始化状态 | InstanceStatus | UP | |
eureka.instance.ip-address | 配置实例的IPAdress | String | 此信息仅用于测试,因为与其他实例的通信主要使用getHostName中提供的信息进行 | |
eureka.instance.app-group-name | 获取要在eureka中注册的应用程序组的名称 | String | ||
eureka.instance.a-s-g-name | 用于AWS平台自动扩展的与此实例关联的组名 | String | ||
eureka.instance.default-address-resolution-order | 默认的地址解析顺序 | String[] | [] | |
eureka.instance.metadata-map | 该服务实例的子定义元数据,可以被服务中心接受到 | Map<String,String> |
Eureka Server配置项
参数Key | 说明 | 参数Value类型 | 参数Value默认值 | 注意 |
---|---|---|---|---|
eureka.server.enable-self-preservation | Eureka Server是否启用自我保护机制 | boolean | true | |
eureka.server.response-cache-update-interval-ms | eureka server刷新readCacheMap的时间,单位毫秒 | long | 30000 | client读取的是readCacheMap,这个时间决定了多久会把readWriteCacheMap的缓存更新到readCacheMap上,默认30s |
eureka.server.response-cache-auto-expiration-in-seconds | eureka server缓存readWriteCacheMap失效时间,单位秒 | long | 180 | 这个只有在这个时间过去后缓存才会失效,失效前不会更新,过期后从registry重新读取注册服务信息,registry是一个ConcurrentHashMap。 |
eureka.server.eviction-interval-timer-in-ms | 每次主动失效检测间隔,单位毫秒 | long | 60000 | |
eureka.server.renewal-percent-threshold | 阈值因子,一段时间内心跳比例是否低于此值,低于此值开启自我保护 | double | 0.85 | |
eureka.server.renewal-threshold-update-interval-ms | 阈值更新的时间间隔 | int | 900000 | 结合阈值因子参数我们可以看到,默认情况下,当15min内心跳比例低于85%,Eureka会进入自我保护模式 |
eureka.server.rate-limiter-enabled | 是否启用请求频率限制 | boolean | false | |
eureka.server.rate-limiter-burst-size | 请求频率大小限制 | int | 10 | |
eureka.server.rate-limiter-full-fetch-average-rate | 请求频率的平均值 | int | 100 | |
eureka.server.rate-limiter-registry-fetch-average-rate | 注册服务、拉去服务列表数据的请求频率的平均值 | int | 500 | |
eureka.server.rate-limiter-throttle-standard-clients | 是否对标准的client进行频率请求限制。如果是false,则只对非标准client进行限制 | boolean | false | |
eureka.server.rate-limiter-privileged-clients | 设置信任的client list | Set | ||
eureka.server.peer-eureka-nodes-update-interval-ms | eureka节点间间隔多长时间更新一次数据,单位毫秒 | int | 600000 | |
eureka.server.peer-eureka-status-refresh-time-interval-ms | eureka服务状态的相互更新的时间间隔,单位毫秒 | int | 30000 | |
eureka.server.peer-node-connect-timeout-ms | eureka对等节点间连接超时时间,单位毫秒 | int | 200 | |
eureka.server.peer-node-connection-idle-timeout-seconds | eureka对等节点连接后的空闲时间,单位秒 | int | 30 | |
eureka.server.peer-node-read-timeout-ms | 节点间的读数据连接超时时间,单位毫秒 | int | 200 | |
eureka.server.peer-node-total-connections | eureka server 节点间连接的总共最大连接数量 | int | 1000 | |
eureka.server.peer-node-total-connections-per-host | eureka server 节点间连接的单机最大连接数量 | int | 500 | |
eureka.server.enable-replicated-request-compression | 发送复制数据是否在request中总是压缩 | boolean | false | |
eureka.server.batch-replication | 指示群集节点之间的复制是否应批处理以提高网络效率 | boolean | false | |
eureka.server.max-elements-in-peer-replication-pool | 允许备份到备份池的最大复制事件数量 | int | 10000 | 这个备份池负责除状态更新的其他事件。可以根据内存大小,超时和复制流量,来设置此值得大小 |
eureka.server.max-elements-in-status-replication-pool | 允许备份到状态备份池的最大复制事件数量 | int | 10000 | |
eureka.server.max-idle-thread-age-in-minutes-for-peer-replication | 多个服务中心相互同步信息线程的最大空闲时间,单位min | long | 15 | |
eureka.server.max-idle-thread-in-minutes-age-for-status-replication | 状态同步线程的最大空闲时间,单位min | long | 10 | |
eureka.server.max-threads-for-peer-replication | 服务注册中心各个instance相互复制数据的最大线程数量 | int | 20 | |
eureka.server.max-threads-for-status-replication | 服务注册中心各个instance相互复制状态数据的最大线程数量 | int | 1 | |
eureka.server.max-time-for-replication | instance之间复制数据的通信时长,单位毫秒 | int | 300000 | |
eureka.server.min-available-instances-for-peer-replication | 正常的对等服务instance最小数量 | int | -1 | -1表示服务中心为单节点。 |
eureka.server.min-threads-for-peer-replication | instance之间相互复制开启的最小线程数量 | int | 5 | |
eureka.server.min-threads-for-status-replication | instance之间用于状态复制,开启的最小线程数量 | int | 1 | |
eureka.server.number-of-replication-retries | instance之间复制数据时可以重试的次数 | int | 5 | |
eureka.server.registry-sync-retries | 在服务节点启动时,eureka尝试获取注册信息的次数 | int | 0 | |
eureka.server.registry-sync-retry-wait-ms | 在服务节点启动时,eureka多次尝试获取注册信息的间隔时间 | int | 30000 | |
eureka.server.wait-time-in-ms-when-sync-empty | 当eureka server启动的时候,不能从对等节点获取instance注册信息的情况,应等待多长时间 | int | 300000 | |
eureka.server.disable-delta-for-remote-regions | 过期数据,是否也提供给远程region | boolean | false | |
eureka.server.disable-transparent-fallback-to-other-region | 回退到远程区域中的应用程序的旧行为 (如果已配置) 如果本地区域中没有该应用程序的实例, 则将被禁用 | boolean | false | |
eureka.server.g-zip-content-from-remote-region | 指示在服务器支持的情况下, 是否必须为远程区域压缩从eureka服务器获取的内容 | boolean | true | |
eureka.server.remote-region-connect-timeout-ms | 连接eureka remote note的连接超时时间,单位毫秒 | int | 1000 | |
eureka.server.remote-region-app-whitelist | remote region 应用白名单 | Map<String,String> | ||
eureka.server.remote-region-connection-idle-timeout-seconds | 连接eureka remote note的连接空闲时间,单位秒 | int | 30 | |
eureka.server.remote-region-fetch-thread-pool-size | 执行remote region 获取注册信息的请求线程池大小 | int | 20 | |
eureka.server.remote-region-read-timeout-ms | remote region 从对等eureka加点读取数据的超时时间,单位毫秒 | int | 1000 | |
eureka.server.remote-region-registry-fetch-interval | 从remote region 获取注册信息的时间间隔,单位秒 | int | 30 | |
eureka.server.remote-region-total-connections | remote region 连接eureka节点的总连接数量 | int | 1000 | |
eureka.server.remote-region-total-connections-per-host | remote region 连接eureka节点的单机连接数量 | int | 50 | |
eureka.server.remote-region-trust-store | remote region抓取注册信息的存储文件,而这个可靠的存储文件需要全限定名来指定 | String | “” | |
eureka.server.remote-region-trust-store-password | remote region 储存的文件的密码 | String | “changeit” | |
eureka.server.remote-region-urls | 远程region URL地址 | String | remote region url.多个逗号隔开 | |
eureka.server.remote-region-urls-with-name | 远程region URL地址名称 | Map<String,String> | remote region url.多个逗号隔开 | |
eureka.server.a-s-g-cache-expiry-timeout-ms | 缓存ASG信息的过期时间,单位毫秒 | int | 60000 | |
eureka.server.a-s-g-query-timeout-ms | 查询ASG信息的超时时间,单位毫秒 | int | 300 | |
eureka.server.a-s-g-update-interval-ms | 服务更新ASG信息的频率,单位毫秒 | int | 30000 | |
eureka.server.a-w-s-access-id | AWS访问ID | String | ||
eureka.server.a-w-s-secret-key | AWS安全密钥 | String | ||
eureka.server.binding-strategy | AWS绑定策略 | AwsBindingStrategy | eip | |
eureka.server.list-auto-scaling-groups-role-name | 用于从第三方AWS 帐户描述自动扩展分组的角色的名称 | String | ||
eureka.server.prime-aws-replica-connections | 是否应该建立连接引导 | boolean | true | |
eureka.server.e-i-p-bind-rebind-retries | 服务端尝试绑定候选EIP的次数 | int | 3 | |
eureka.server.e-i-p-binding-retry-interval-ms | 服务端绑定EIP的时间间隔.如果绑定就检查;如果绑定失效就重新绑定。当且仅当已经绑定的情况,单位毫秒 | int | 300000 | |
eureka.server.e-i-p-binding-retry-interval-ms-when-unbound | 服务端绑定EIP的时间间隔.当且仅当服务为绑定的情况,单位毫秒 | int | 60000 | |
eureka.server.route53-bind-rebind-retries | 服务端尝试绑定route53的次数 | int | 3 | |
eureka.server.route53-binding-retry-interval-ms | 服务端间隔多长时间尝试绑定route53,单位毫秒 | int | 300000 | |
eureka.server.route53-domain-t-t-l | route53 domain生存时间 | int | 30 | |
eureka.server.delta-retention-timer-interval-in-ms | 间隔多长时间,清除过期的delta数据 | int | 30000 | |
eureka.server.disable-delta | 过期数据,是否也提供给client | boolean | false | |
eureka.server.log-identity-headers | eureka服务端是否记录client的身份header | boolean | true | |
eureka.server.retention-time-in-m-s-in-delta-queue | 缓存增量数据的时间,以便在检索的时候不丢失信息 | int | 180000 | |
eureka.server.sync-when-timestamp-differs | 当时间戳不一致的时候,是否进行同步 | boolean | true | |
eureka.server.use-read-only-response-cache | 是否采用只读缓存策略,只读策略对于缓存的数据不会过期 | boolean | true | |
eureka.server.json-codec-name | json的转换的实现类名 | String | ||
eureka.server.property-resolver | 属性解析器 | PropertyResolver | ||
eureka.server.xml-codec-name | eureka server xml的编解码实现名称 | String |
总结
这篇文章通过对Eureka的一些分析,简单了解了Eureka的一些工作原理,对我们使用Eureka还是蛮有帮助的。
参考资料
- SpringCloud 微服务实战
- Eureka源码