知识点总结
一. Eureka Server (以下简称ES)
- 在服务不是正常下线的情况下,ES 会每隔 60s(默认值) 将当前清单中超时 90s(默认值) 没有续约(心跳)的服务剔除。
- 在 ES 出现15分钟内统计心跳失败比例(本人认为是15分钟内统计的心跳次数)低于百分之85的情况下。会出现自我保护状态(ES 页面出现红色警告 EMERGENCY……)。ES 会将当前的服务实例保护起来,让这些实例不会过期,尽可能保护这些注册信息(本地很容易出现这种状态,生产环境出现的原因一般会因为 ES 网络波动), 关闭:eureka.server.enableSelfPreservation=false。
- 默认情况下 ES 是通过心跳来检测一个服务是否可用的,这种检测机制很不可靠,如果一个服务的数据库链接、redis 链接、消息代理失效了,我们也应当认为它是不可用的服务。为了更准确的确认服务的可用性,我们只需依赖 spring-boot-starter-actuator 模块,并设置 eureka.client.healthcheck.enabled=true 即可。如果客户端的 /health 端点做了特殊处理,比如前缀等等,也要做相应的处理。 如:eureka.instance.health-check-url-path=PREFIX/health
二. Eureka Client (以下简称EC)
- 服务续约(心跳)间隔时间:30s
- 服务失效时间:90s(即90秒内没有心跳则从注册中心剔除)
- 获取服务实例清单间隔:30s
- EC 启动后,不会立即向 ES 注册,他有一个延迟向服务端注册的时间,40s(默认值)
- 刚刚注册的 EC 也不会立即被其他服务调用,因为每个 EC 获取新实例列表的时间是 30s
三.详细配置
配置前缀:eureka.client
更加详细的配置看源码 org.springframework.cloud.netflix.eureka.EurekaClientConfigBean
参数名 | 说明 | 默认值 |
---|---|---|
enabled | 启动 Eureka 客户端 | true |
registryFetchIntervalSeconds | 从 Eureka 服务端获取注册信息的间隔时间,单位秒 | 30 |
instanceInfoReplicationIntervalSeconds | 更新实例信息的变化到 Eureka 服务端的间隔时间,单位秒 | 30 |
initialInstanceInfoReplicationIntervalSeconds | 初始化实例信息到 Eureka 服务端的间隔时间,单位秒 | 40 |
eurekaServiceUrlPollIntervalSeconds | 轮询 Eureka 服务端地址更改的间隔时间,单位秒。当我们与 Spring Cloud Config 配合时,动态刷底 Eureka 的 serviceUrl 地址时需要关注该参数 | 300 |
eurekaServerReadTimeoutSeconds | 读取 ES 信息的超时时间,单位秒 | 8 |
eurekaServerConnectTimeoutSeconds | 链接 ES 的超时时间,单位为秒 | 5 |
eurekaServerTotalConnections | 从 Eureka 客户端到所有 Eureka 服务端的链接总数 | 200 |
eurekaServerTotalConnectionsPerHost | 从 Eureka 客户端到每个 Eureka 服务端主机的链接总数 | 50 |
eurekaConnectionIdleTimeoutSeconds | Eureka 服务端链接的空闲关闭时间,单位为秒 | 30 |
heartbeatExecutorThreadPoolSize | 心跳连接池的初始化线程数 | 2 |
heartbeatExecutorExponentialBackOffBound | 心跳超时重试延迟的最大乘数值 | 10 |
cacheRefreshExecutorExponentialBackOffBound | 缓存刷新超时重试延迟的最大乘数值 | 10 |
useDnsForFetchingServiceUrls | 使用 DNS 来获取 Eureka 服务端的 ServiceUrl | false |
registerWithEureka | 是否要将自身的实例信息注册到 Eureka 服务端 | true |
preferSameZoneEureka | 是否偏好使用处于相同 Zone 的 Eureka 服务端 | true |
filterOnlyUpInstances | 获取实例时是否过滤,仅保留 UP 状态的实例 | true |
fetchRegistry | 是否从 Eureka 服务端获取注册信息 | true |
healthcheck.enabled | 使用 /health 检测服务是否可用(需要依赖 actuator 模块) | false |
配置前缀:eureka.instance
更加详细的配置看源码 org.springframework.cloud.netflix.eureka.EurekaInstanceConfigBean
参数名 | 说明 | 默认值 |
---|---|---|
preferIpAddress | 是否有优先使用 IP 地址作为主机名的标识 | false |
leaseRenewalIntervalInSeconds | Eureka 客户端向服务端发送心跳的时间间隔,单位秒 | 30 |
leaseExpirationDurationInSeconds | Eureka 服务端在收到最后一次心跳之后等待的时间上限,单位秒。超过该时间后服务端会将服务实例从服务清单中剔除,从而禁止服务调用请求被发送到该实例上 | 90 |
nonSecurePort | 非安全的通信端口 | 80 |
securePort | 安全的通信端口 | 443 |
nonSecurePortEnabled | 是否启动非安全的通信端口 | true |
securePortEnabled | 是否启动安全的通信端口 | |
appname | 服务名,默认取 spring.application.name 的配置值,如果没有则为 UNKNOWN | |
hostname | 主机名,不配置的时候将根据操作系统的主机名来获取 |
在上面的 eureka.instance 配置中,除了前三个配置参数在需要的时候可用做一些调整,其他的参数配置大多数情况下不需要进行配置,使用默认值即可。
四.快速搭建(Spring Cloud Dalston.SR5)
4.1 Eureka Server:
pom.xml
<!-- 可选 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- 必须依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
application.yml
server:
port: 8701
eureka:
client:
service-url:
defaultZone: http://peer2:8702/eureka/ #另一个 es 的地址
spring:
application:
name: eureka-server
启动类添加注解:
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
4.2 Eureka Client:
pom.xml
<!-- 必须依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
application.yml
server:
port: 8731
eureka:
client:
service-url:
defaultZone: http://sc:8701/eureka/,http://sc:8702/eureka/
healthcheck:
enabled: true
spring:
application:
name: zy-service
management:
security:
enabled: false #关闭访问 health 需要权限的问题。
启动类添加注解:
@SpringBootApplication
@EnableDiscoveryClient
public class EurekaClientApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaClientApplication.class, args);
}
}
参考资料
Spring Cloud 微服务实战