共计 12247 个字符,预计需要花费 31 分钟才能阅读完成。
Eureka 目前的状态:Eureka 目前 1.x 版本还在更新,然而应该不会更新新的性能了,只是对现有性能进行保护,降级并兼容所需的依赖。Eureka 2.x 曾经胎死腹中了。然而,这也不代表 Eureka 就是不能用了。如果你须要一个简便易于部署的注册核心,Eureka 还是一个很好的抉择。云服务环境中,基本上所有实例地址和微服务名称都在一直变动,也并不太须要 Eureka 所短少的长久化个性。当你的集群属于中小规模的时候(节点小于 1000 个),Eureka 仍然是一个不错的抉择。当你的集群很大的时候,Eureka 的同步机制可能就限度了他的体现。
Eureka 的设计
Eureka 的设计比拟玲珑,没有简单的同步机制,也没有简单的长久化机制,集群关系只是简略的将收到的客户端申请转发到集群内的其余 Eureka 实例。Eureka 自身也只有注册核心的性能,不像其余品种的注册核心那样,将注册核心和配置核心合在一起,例如 Consul 和 nacos。
Eureka 的交互流程如下:
首先,Service A 通过 Eureka Client 发送注册申请 (Register)到同一可用区的 Eureka Server 1。之后通过 发送心跳申请(Renew)到这个 Eureka Server 1. Eureka Server 1 收到这些申请的时候,会解决这些申请并将这些申请转发到其余的集群内的 Eureka Server 2 和 Eureka Server 3. Eureka Server 2 和 Eureka Server 3 不会再转发收到的 Eureka Server 1 转发过去的申请。而后,Service B 还有 Service C 通过 Eureka 获取到了 Service A 的地位,最初调用了 Service A。
对于本地没有查问到的微服务,Eureka Server 还会从近程 Region 的 Eureka Server 去获取,例如这里对于 Service D,本地没有查到,Eureka Server 会返回近程 Region 的 Service D 的实例。因为本地有 Service A,所以必定不会返回近程 Region 的 Service A 的实例。并且,本地是定时拉取的近程 Region 的 Service 列表,并不是每次查问的时候现查问的。
个别的,微服务之间的相互调用,并不通过 Eureka,也不会波及到 Eureka 客户端了,而是通过负载均衡器调用,这个咱们前面就会提到。
Eureka 相干概念
这里咱们 疏忽所有的 AWS 相干 的术语以及配置还有相干逻辑解决。
Eureka 中的术语:
- Eureka 实例:每个注册到 Eureka 下面的实例就是 Eureka 实例。
- Eureka 实例状态:包含 UP(能够解决申请),DOWN(健康检查失败,不能失常解决申请),STARTING(启动中,不能解决申请),OUT_OF_SERVICE(人为下线,临时不解决申请),UNKNOWN(未知状态)。
- Eureka 服务器 :作为注册核心运行,次要提供 实例治理性能 (解决实例注册(register)申请、解决实例登记(cancel)申请、解决实例心跳(renew)申请、外部解决实例过期(evict))、 实例查问性能(各种查问实例信息的接口,例如通过 AppName 获取实例列表,通过实例 id 获取实例信息等等)
- Eureka 服务器集群:Eureka 服务器的集群,每个 Eureka 服务器都配置了区域以及可用区,Eureka 服务器收到的客户端申请会转发到同一区域内的其余 Eureka 服务器,能够配置优先发到同一可用区的 Eureka 服务器。非同一区域内 Eureka 服务器,通过定时拉取的形式进行同步。
- Eureka 客户端:申请 Eureka 服务器的客户端。封装发送实例注册(register)申请、实例登记(cancel)申请和实例心跳(renew)申请。
- VIP(或者是 Virtual Hostname): Eureka 中能够通过两种形式获取实例,一个是通过服务名称,另一种是通过 VIP。每个实例都有服务名称,以及 VIP。Eureka 服务器中的索引形式是以服务名称为 key 的索引,咱们也能够通过遍历所有实例信息的形式通过 VIP 字符串匹配获取相干的实例。在 Spring Cloud 体系中,一个实例的 VIP、SVIP(其实就是 Secure VIP,即 https 的地址)以及服务名称都是
spring.application.name
指定的服务名称。
Eureka 相干配置
-
Eureka 实例配置:Eureka 实例,每个注册到 Eureka 下面的实例就是 Eureka 实例。Eureka 实例蕴含以下元素,以及相干配置:
-
根本信息:包含 IP,端口等拜访这个 Eureka 实例所需的信息:
eureka: instance: #个别不必咱们本人设置,EurekaInstanceConfigBean 的结构器会通过 InetUtils 获取 ip 地址 #ip-address: #个别不必咱们本人设置,EurekaInstanceConfigBean 的结构器会通过 InetUtils 获取 hostname #hostname: #注册到 eureka 下面供其余实例拜访的地址应用 ip 进行注册,其余实例会通过 ip 进行拜访 prefer-ip-address: true #不必设置 non-secure-port,主动应用 server.port 作为 non-secure-port #non-secure-port: #如果 secure-port-enabled 是 true,则会主动应用 server.port 作为 secure-port; 咱们个别外部调用不必 ssl,所以不须要配置 secure-port #secure-port: #默认是启用 non-secure-port 的 non-secure-port-enabled: true #默认是不启用 secure-port 的,咱们个别外部调用不必 ssl secure-port-enabled: false #个性化的实例 id,包含 ip: 微服务名称: 端口 instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port} # app 名称,不填写在 Spring-cloud-netflix 体系下默认就是 spring.application.name appname: ${spring.application.name} #app 组名称归类用的,目前也没什么用 app-group-name: common #实例命名空间,目前也没什么用 namespace: public
-
根本链接信息:包含首页门路地址以及健康检查门路地址:
eureka: instance: # 健康检查地址,默认是 /actuator/health health-check-url-path: /actuator/health # 实例状态地址,默认是 /actuator/info status-page-url-path: /actuator/info # 首页地址,默认是 / home-page-url-path: /
-
实例注册行为,即实例注册后的行为,以及心跳距离等配置:
eureka: instance: # 服务过期工夫配置, 超过这个工夫没有接管到心跳 EurekaServer 就会将这个实例剔除 # 留神,EurekaServer 肯定要设置 eureka.server.eviction-interval-timer-in-ms 否则这个配置有效 # 这个配置个别为服务刷新工夫配置的三倍 # 默认 90s lease-expiration-duration-in-seconds: 15 #服务刷新工夫配置,每隔这个工夫会被动心跳一次 #默认 30s lease-renewal-interval-in-seconds: 5 registry: #请参考 wait-time-in-ms-when-sync-empty 配置阐明 default-open-for-traffic-count: 1 #初始冀望发送心跳申请的实例个数,默认为 1,在有新实例注册的时候,会 +1,有登记的时候会 -1,初始默认为 1 个别因为本人也注册到 eureka 上 expected-number-of-clients-sending-renews: 1 #实例注册后是否立即开始服务,默认为 false,个别注册后还须要做一些操作,所以注册实例的状态是 STARTING。前面扭转状态后会更新为 UP instance-enabled-onit: false
-
实例元数据:
eureka: instance: #元数据 map,咱们能够本人应用,放一些个性化的元数据,目前只有 configPath 和 zone 比拟有用。configPath 是应用 spring-cloud-config 的时候会设置 metadata-map: # spring cloud 体系中,可用区的配置放入元数据中,key 为 zone zone: zone1
-
-
Eureka 客户端配置:
-
Eureka 服务器地址配置,能够间接指定链接,也能够通过 region 和 zone 进行配置,也能够通过 DNS 配置:
eureka: instance: # 可用区列表,key 为 region,value 为 zone availability-zones: region1: zone1, zone2 region2: zone3 # 所在区域,通过这个读取 availability-zones 获取 zone,而后通过 zone 读取 service-url 获取对应的 eureka url # 这里的逻辑对应的类是 ConfigClusterResolver 和 ZoneAffinityClusterResolver region: region1 # key 为 zone,value 为 eureka 链接,以逗号分隔 service-url: # 默认 eureka 集群, 这里必须是 defaultZone,不能用 - 替换大写,与其余的配置不一样,因为切实 EurekaClientConfigBean 外面写死的 defaultZone: http://127.0.0.1:8211/eureka/ zone1: http://127.0.0.1:8212/eureka/ zone2: http://127.0.0.1:8213/eureka/ zone3: http://127.0.0.1:8214/eureka/ # 如果下面 eureka server 地址相干配置更新了,多久之后会从新读取感知到 eureka-service-url-poll-interval-seconds: 300 # 是否应用 dns 获取,如果指定了则通过上面的 dns 配置获取,而不是下面的 service-url use-dns-for-fetching-service-urls: false # dns 配置 # eureka-server-d-n-s-name: # dns 配置的 eureka server 的 port # eureka-server-port: # dns 配置的 eureka server 的 port 前面的 uri 前缀 context # eureka-server-u-r-l-context: # 如果设置为 true,则同一个 zone 下的 eureka 会跑到后面优先拜访。默认为 true prefer-same-zone-eureka: true
-
拉取服务实例信息相干配置:
eureka: instance: # 是否从 eureka 下面拉取实例 fetch-registry: true # 如果只想获取一个特定 virtual host name 的实例列表,就配置 registry-refresh-single-vip-address #registry-refresh-single-vip-address: # 客户端申请头指定服务端返回的实例信息是压缩的信息还是残缺信息,默认是残缺信息 # full, compact client-data-accept: full # eureka client 刷新本地缓存工夫 # 默认 30s registry-fetch-interval-seconds: 5 # eureka client 刷新本地缓存 (定时拉取 eureka 实例列表) 线程池大小,默认为 2 cache-refresh-executor-thread-pool-size: 2 # eureka client 刷新本地缓存 (定时拉取 eureka 实例列表) 线程池工作最大延迟时间,这个配置是定时拉取工作提早 (registry-fetch-interval-seconds) 的倍数,默认 10 倍 cache-refresh-executor-exponential-back-off-bound: 10 # 是否禁用增量拉取,如果网络条件不好,能够禁用,每次都会拉取全量 disable-delta: false # 只保留状态为 UP 的实例,默认为 true filter-only-up-instances: true #能够指定也从某些 region 拉取服务实例 #fetch-remote-regions-registry: # 是否打日志记录每次拉取实例信息与以后缓存内的实例信息变动 log-delta-diff: true #在 spring cloud 环境中,DiscoveryClient 用的其实都是 CompositeDiscoveryClient,这个 CompositeDiscoveryClient 逻辑其实就是多个 DiscoveryClient 共存,先拜访一个,没找到就通过下一个寻找 #这个 order 决定了程序,默认为 0 order: 0
-
以后实例注册相干配置:
eureka: instance: # 是否将本人注册到 eureka 下面 register-with-eureka: true # 是否在初始化的时候就注册到 eureka,个别设置为 false,因为实例还不能失常提供服务 should-enforce-registration-at-init: false # 是否在敞开的时候登记实例,默认为 true should-unregister-on-shutdown: true # 是否对于实例状态扭转更新进行限流,默认为 true on-demand-update-status-change: true # 实例信息同定时同步到 Eureka Server 的间隔时间。每隔这么长时间,查看实例信息(即 eureka.instance 配置信息)是否发生变化,如果发生变化,则同步到 Eureka Server,默认 30s # 次要查看两类信息,别离是服务地址相干信息,以及服务过期工夫与刷新工夫配置信息 instance-info-replication-interval-seconds: 30 # 实例信息同定时同步到 Eureka Server 的初始延迟时间,默认 40s initial-instance-info-replication-interval-seconds: 40
-
http 连贯相干配置:
eureka: instance: # 代理相干配置 # proxy-host: # proxy-port: # proxy-user-name: # proxy-password: # 是否对于发往 Eureka Server 的 http 申请启用 gzip,目前曾经过期了,只有 Eureka Server 启用了 gzip,申请就是 gzip 压缩的 g-zip-content: true # httpclient 的链接超时,默认 5s eureka-server-connect-timeout-seconds: 5 # httpclient 的读取超时,默认 5s eureka-server-read-timeout-seconds: 8 # httpclient 的闲暇连贯超时,默认 30s eureka-connection-idle-timeout-seconds: 30 # httpclient 的总连贯数量,默认 200 eureka-server-total-connections: 200 # httpclient 的每个 host 的连贯数量 eureka-server-total-connections-per-host: 50 # tls 相干配置,默认没有启用 # tls: # enabled: false # key-password: # key-store: # key-store-password: # key-store-type: # trust-store: # trust-store-password: # trust-store-type:
-
-
Eureka 服务器配置:
-
定时查看实例过期相干配置:实例注册后须要发送心跳证实这个实例是活着的,Eureka 服务器中也有定时工作查看实例是否曾经过期:
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 服务器中有定时过期的工作,查看迟迟没有心跳的实例,并登记他们。自我爱护次要针对集群中 网络呈现问题 ,导致有 很多实例无奈发送心跳 导致很多实例状态异样,然而 理论实例还在失常工作 的状况,不要让这些实例不参加负载平衡:
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 Server
启动一个 Eureka 注册核心服务器非常简单,咱们这里应用的是 Spring Cloud 封装好的启动包。Eureka 1.x 的 Eureka Server 是纯基于 servlet 的利用。为了与 Spring Cloud 联合应用,须要粘合模块,这就是 spring-cloud-netflix-eureka-server。在 spring-cloud-netflix-eureka-server 中,也有一个和 com.netflix.eureka.EurekaBootStrap
代码很相似的启动类,即 org.springframework.cloud.netflix.eureka.server.EurekaServerBootstrap
。在咱们启动 EurekaServer 实例的时候,只用退出对于 spring-cloud-starter-eureka-server 的依赖即可。之后通过 @EnableEurekaServer 注解即可启动一个 Eureka 服务器实例。
Eureka Server 的依赖:
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>spring-cloud-iiford</artifactId>
<groupId>com.github.hashjang</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>spring-cloud-iiford-eureka-server</artifactId>
<dependencies>
<dependency>
<groupId>com.github.hashjang</groupId>
<artifactId>spring-cloud-iiford-service-common</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
</project>
Eureka Server 的配置:
参考咱们下面的配置即可:application.yml
Eureka Server 的启动类:EurekaServerApplication.java
package com.github.hashjang.iiford.eureka.server;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {public static void main(String[] args) {SpringApplication.run(EurekaServerApplication.class, args);
}
}