Spring Cloud Eureka 配置

/ java / 没有评论 / 155浏览

介绍

Spring Cloud Eureka是Spring Cloud Netflix微服务套件中的一部分, 基于Netflix Eureka做二次封装, 主要负责完成微服务架构中的服务治理服务功能.Spring Cloud 通过为Eureka增加Spring Boot 风格的自动化配置,我们只需要简单的引入依赖和注解配置就能让Spring Boot构建的微服务应用轻松的与Eureka服务治理体系进行整合.

在Eureka的服务治理体系中, 主要分为服务端和客户端两个不同的角色, 服务端为服务注册中心, 而客户端为各个提供接口的微服务应用.

Eureka客户端配置主要分为一下两个方面

Eureka服务端更多的类似于一个现成产品, 大多数情况下我们不需要修改它的配置信息.

服务端的配置定义主要在org.springframework.cloud.netflix.eureka.server.EurekaServerConfigBean中, 这些参数均以 eureka.server作为前缀.

@ConfigurationProperties("eureka.server")
public class EurekaServerConfigBean implements EurekaServerConfig {
    public static final String PREFIX = "eureka.server";
    ...
}

依赖

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>

服务注册类配置

服务注册类的配置信息在org.springframework.cloud.netflix.eureka.EurekaClientConfigBean中定义, 配置信息都以 eureka.client为前缀.

@ConfigurationProperties("eureka.client")
public class EurekaClientConfigBean implements EurekaClientConfig, Ordered {
    public static final String PREFIX = "eureka.client";
    public static final String DEFAULT_URL = "http://localhost:8761/eureka/";
    public static final String DEFAULT_ZONE = "defaultZone";
    ...
}

依赖

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

eureka.client.service-url 指定注册中心地址

配参数的配置存储在HashMap中, 并且设置有一组默认值, 默认值的key为defaultZone、value为 http://localhost:8761/eureka/

private Map<String, String> serviceUrl = new HashMap();

public static final String DEFAULT_URL = "http://localhost:8761/eureka/";
public static final String DEFAULT_ZONE = "defaultZone";
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/,http://localhost:8762/eureka/....
http://<username>:<password>@localhost:8761/eureka
<username>: 用户名
<password>: 密码

其他配置

一下配置均以eureka.client为前缀

参数名说明默认值
enabled启用Eureka客户端true
registryFetchIntervalSeconds从Eureka服务端获取注册信息的间隔时间,单位为秒30
instanceInfoReplicationIntervalSeconds更新实例信息的变化到Eureka服务端的间隔时间, 单位为秒30
initialInstanceInfoReplicationIntervalSeconds初始化实例信息到Eureka服务端的间隔时间, 单位为秒40
eurekaServiceUrlPollIntervalSeconds轮询Eureka服务端地址更改的间隔时间,单位为秒.当我们于Spring Cloud Config配合,动态刷新Eureka的serverUrl地址时需要关注该参数300
eurekaServerReadTimeoutSeconds读取Eureka server信息的超时时间8
eurekaServerConnectTimeoutSeconds连接Eureka server的超时时间5
eurekaServerTotalConnections从Eureka客户端到Eureka服务端的连接总数200
eurekaServerTotalConnectionsPerHost从Eureka客户端到Eureka服务端主机的连接总数50
eurekaConnectionIdleTimeoutSecondsEureka服务端连接的空闲关闭时间, 单位为秒30
heartbeatExecutorThreadPoolSize心跳连接池的初始化线程数2
heartbeatExecutorExponentialBackOffBound心跳超时重试延迟时间的最大乘数值10
cacheRefreshExecutorThreadPoolSize缓存刷新线程池的初始化线程数2
cacheRefreshExecutorExponentialBackOffBound花村刷新重试延迟时间的最大乘数值10
useDnsForFetchingServiceUrls使用DNS来获取Eureka服务端的serviceUrlfalse
registerWithEureka是否要将自身的实例信息注册到Eureka服务端true
preferSameZoneEureka是否偏好使用处于相同Zone的Eureka服务端true
filterOnlyUpInstances获取实例时是否过滤,仅保留UP状态的实例true
fetchRegistry是否从Eureka服务端获取注册信息true

服务实例类配置

服务实例类的配置信息在 org.springframework.cloud.netflix.eureka.EurekaInstanceConfigBean 中定义. 以eureka.instance为前缀.

Eureka客户端向服务注册中心发送注册请求时,用来描述自身服务信息的对象,其中包含一些标准化的元数据, 比如服务名称、实例名称、实例IP、实例端口等用于服务治理的重要信息;以及一些用于负载均衡策略或是其他特殊用途的自定义元数据信息.
@XStreamAlias("metadata")
private volatile Map<String, String> metadata = new ConcurrentHashMap();
eureka.instance.metadataMap.zone=xian

在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}

在InstanceInfo中存在一些URL的配置, 比如 homePageUrl, statusPageUrl, healthCheckUrl, 分别代表应用的主页url, 状态页url, 健康检查url. 状态和健康检查使用了spring-boot-actuator模块提供的/info/health

必须确保/health在发送元数据的时候能被注册中心访问到, 否则注册中心不会根据应用的健康检查来更改状态(仅当开启了healthcheck功能),而/info如果不正确, 会导致在Eureka面板中单击服务实例时,无法访问到服务实例提供的信息接口.

由于Eureka的服务注册中心默认以HTTP的方式来访问和暴漏断电, 当使用HTTPS时, 应该使用绝对路径配置

erueka.instance.statusPageUrl=https://...../info
eureka.instance.healthCheckUrl=https://...../health
eureka.instance.homePageUrl=https://.../
参数名说明默认值
preferIpAddress是否优先使用IP地址作为主机名标识false
leaseRenewalIntervalInSecondsEureka客户端向服务端发送心跳间隔时间, 单位为秒30
leaseExpirationDurationInSecondsEureka服务端在收到最后一次心跳之后等待的时间上限,单位为秒.超过时间之后服务端会将该服务实例从服务清单中剔除,从而禁止服务调用请求被发送到该实例上90
nonSecurePort非安全通信端口80
securePort安全通信端口443
nonSecurePortEnabled是否启用非安全通信端口true
securePortEnabled是否启用安全通信端口
appname服务名称, 默认取spring.application.name的配置值,如果没有则为unknownunknown
hostname主机名,不配置的时候根据操作系统的主机名获取
参考书籍 << Spring Cloud 微服务实战 >>