基于Spring Cloud的微服务构建学习-3 Spring Cloud Eureka配置详解
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于Spring Cloud的微服务构建学习-3 Spring Cloud Eureka配置详解相关的知识,希望对你有一定的参考价值。
配置详解
在Eureka的服务治理体系中,主要分为服务端与客户端。服务端为服务注册中心,而客户端为各个提供接口的微服务应用。当部署高可用注册中心时,每个服务端也已经成为了客户端,因此,在使用Spring Cloud Eureka的过程中,我们所做的配置内容几乎都是对Eureka客户端配置进行的操作,所以了解这部分的配置内容,对于用好Eureka非常有帮助。
而Eureka服务端更多类似于一个现成产品,大多数情况下,我们不需要修改它的配置信息。
Eureka客户端配置分类
- 服务注册相关配置,包括服务注册中心的地址、服务获取的时间间隔、可用区域等。
- 服务实例相关配置,包括服务实例的名称、IP地址、端口号、健康检查路径等。
服务注册类配置
关于服务注册类的配置信息,我们可以通过查看org.springframework.cloud.netflix.eureka.EurekaClientConfig
的源码来获得比官方文档中更为详尽的内容。这些配置信息都已eureka.client
为前缀。
指定注册中心
指定注册中心主要通过eureka.client.serviceUrl
参数实现。
如果我们构建了高可用注册中心集群时,我们可以为参数的value值配置多个注册中心的地址。例如:
eureka.client.serviceUrl.defaultZone=http://peer1:1111/eureka,http://peer2:1112/eureka/
为了服务注册中心的安全考虑,很多时候我们都会为服务注册中心加入安全校验。这个时候,在配置serviceUrl时,需要在value值得URL中加入相应的安全校验信息,比如:
http://<username>:<password>@localhost:1111/eureka
其他常用配置
这些常用配置均已eureka.client
为前缀
参数名 | 说明 | 默认值 |
---|---|---|
enabled | 启用Eureka客户端 | true |
registryFetchIntervalSeconds | 从Eureka服务端获取注册信息的间隔时间,单位为秒 | 30 |
instanceInfoReplicationIntervalSeconds | 更新实例信息的变化到Eureka服务端的间隔时间,单位为秒 | 30 |
initialInstanceInfoReplicationIntervalSeconds | 初始化实例信息到Eureka服务端的间隔时间,单位为秒 | 40 |
eurekaServiceUrlPollIntervalSeconds | 轮询Eureka服务端地址更改的间隔时间,单位为秒。当我们与Spring CLoud Config整合,动态刷新Eureka的serviceURL地址时需要关注该参数 | 300 |
eurekaServerReadTimeoutSeconds | 读取Eureka Server信息的超时时间,单位为秒 | 8 |
eurekaServerConnectTimeoutSeconds | 链接Eureka Server的超时时间,单位为秒 | 5 |
eurekaServerTotalConnections | 从Eureka客户端到所有Eureka服务端的连接总数 | 200 |
eurekaServerTotalConnectionsPerHost | 从Eureka客户端到每个Eureka服务端主机的连接总数 | 50 |
eurekaConnectionIdleTimeoutSeconds | Eureka服务端连接的空闲关闭时间,单位为秒 | 30 |
heartbeatExecutorThreadPoolSize | 心跳连接池的初始化线程数 | 2 |
heartbeatExecutorExponentialBackOffBound | 心跳超时重试延迟时间的最大乘数值 | 10 |
cacheRefreshExecutorThreadPoolSize | 缓存刷新线程池的初始化线程数 | 2 |
cacheRefreshExecutorExponentialBackOffBound | 缓存刷新重试延迟时间的最大乘数值 | 10 |
useDnsForFetchingServiceUrls | 使用DNS来获取Eureka服务端的serviceUrl | false |
registerWithEureka | 是否要将自身的实例信息注册到Eureka服务端 | true |
preferSameZoneEureka | 是否偏好使用处于相同Zone的Eureka服务端 | true |
filterOnlyUpInstances | 获取实例时是否过滤,仅保留UP状态的实例 | true |
fetchRegistry | 是否从Eureka服务端获取注册信息 | true |
服务实例类配置
关于服务实例类配置信息,我们可以通过查看org.springframework.cloud.netflix.eureka.EurekaInstanceConfigBean
的源码来获取详细内容,这些配置信息都以eureka.instance
为前缀。
元数据
元数据是Eureka客户端在想服务注册中心发送注册请求时,用来描述自身服务信息的对象,其中包含了一些标准化的元数据,比如服务名称、实例名称、实例IP、实例端口等用于服务治理的重要信息;以及一些用于负载均衡策略或是其他特殊用途的自定义元数据信息。
我们可以通过eureka.instance.<properties>=<value>
的格式对标准化元数据直接进行配置,其中properties
就是EurekaInstanceConfigBean
对象中的成员变量名。而对于自定义元数据,可以通过eureka.instance.metadataMap.<key>=<value>
的格式来进行配置,比如:
eureka.instance.metadataMap.zone=shanghai
实例名配置
即InstanceInfo
中的instanceId
参数,它是区分同一服务中不同实例的唯一标识。在Netflix Eureka的原生实现中,实例名采用主机名作为默认值,这样会使得在同一
主机上无法启动多个相同的服务实例。所以,在Spring Cloud Eureka的配置中,针对统一主机中启动多实例的情况,对实例名的默认命名作了更为合理的扩展,它采用了如下默认规则:
${spring.cloud.client.hostname}:${spring.application.name}:${spring.application.instance_id:${server.port}}
对于实例名的命名规则,我们也可以通过eureka.instance.instanceId
参数来进行配。如:
eureka.instance.instanceId=${spring.application.name}:${random.int}
通过上面的配置,利用应用名加随机数的方式来区分不同的实例,从而实现在统一主机上,不指定端口就能轻松启动多个实例的效果。
端点配置
- homePageUrl:应用主页的URL
- statusPageUrl:状态页的URL
- healthCheckUrl:健康检查的URL
其中,状态页和健康检查的URL在Spring Cloud Eureka中默认使用了spring-boot-actuator模块提供的/info
端点和/health
端点。并且这些端点起着很重要的作用
为了服务的正常运作,我们必须确保Eureka客户端的/health
端点在发送元数据的时候,是一个能被注册中心访问到的地址,否则服务注册中心不会根据应用的健康检查来更改状态(仅当开启了healthcheck功能时,以该端点信息作为健康检查标准)。而/info
端点如果不正确的话,会导致在Eureka面板中单机服务实例时,无法访问到服务实例提供的信息接口。
大多数情况下,我们并不需要修改这几个URL配置。
健康检测
默认情况下,Spring CLoud Eureka中各个服务实例的健康检测并不是通过spring-boot-actuator模块的/health
端点来实现的,而是依靠客户端心跳的方式来保持服务实例的存活。因此,默认的心跳方式作为健康检测并不保险。因为不能检测服务是否能有效提供服务。
在Spring Cloud Eureka中,我们可以通过简单的配置,把Eureka客户端的健康检测交给spring-boot-actuator模块的/health
端点,以实现更加全面的健康状态维护。
详细步骤如下:
- 在pom.xml中引入spring-boot-starter-actuator模块的依赖
xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
- 在
application.properties
中增加参数配置eureka.client.healthcheck.enabled=true
其他配置
均以eureka.instance
为前缀:
参数名 | 说明 | 默认值 |
---|---|---|
preferIpAddress | 是否优先使用IP地址作为主机名的标识 | false |
leaseRenewalIntervalInSeconds | Eureka客户端向服务端发送心跳的时间间隔,单位为秒 | 30 |
leaseExpirationDurationInSeconds | Eureka服务端在收到最后一次心跳之后等待的时间上限,单位为秒。超过该时间之后服务端会将该服务实例从服务清单中剔除,从而禁止服务调用请求被发送到该实例上 | 90 |
nonSecurePort | 非安全的通信端口号 | 80 |
securePort | 安全的通信端口号 | 443 |
nonSecurePortEnabled | 是否启用非安全的通信端口号 | true |
securePortEnabled | 是否启用安全的通信端口号 | |
appname | 服务名,默认取spring.application.name的配置值,如果没有则为unknown | |
hostname | 主机名,不配置的时候讲根据操作系统的主机名来获取 |
参考文献
spring cloud 微服务实战
以上是关于基于Spring Cloud的微服务构建学习-3 Spring Cloud Eureka配置详解的主要内容,如果未能解决你的问题,请参考以下文章
基于Spring Cloud的微服务构建学习-3 服务治理-Spring Cloud Eureka之高可用注册中心
基于Spring Cloud的微服务构建学习-2 Spring Boot
基于Spring cloud gateway定制的微服务网关
基于 Spring Cloud + Vue.js完整的微服务架构实战