Spring Cloud Eureka—配置详解

从使用的角度对Eureka中一些常用配置内容进行详细的介绍。
Eureka客户端的配置主要分为两个方面:

  • 服务注册相关的配置信息,包括服务注册中心的地址、服务获取的时间间隔、可用区域等。
  • 服务实例相关配置信息,包括服务实例的名词、IP地址、端口号、健康检查路径等。

    服务注册类配置

    关于服务注册的配置信息,我们看看
    org.springframework.cloud.netflix.eureka.EurekaClientConfigBean的源码可获得比官方文档更为详尽
    的说明,这些配置内容都以Eureka.client为前缀。

    指定注册中心

    主要通过eureka.client.serviceUrl参数实现。该参数定义如下所示,它的配置值存储在HashMap类型中,默认key为defaultZone、value为Http://localhost:8761/eureka/
    1
    2
    3
    4
    5
    6
    private Map<String, String> serviceUrl = new HashMap<>();
    {
    this.serviceUrl.put(DEFAULT_ZONE, DEFAULT_URL);
    }
    public static final String DEFAULT_URL = "http://localhost:8761" + DEFAULT_PREFIX + "/";
    public static final String DEFAULT_ZONE = "defaultZone";

可以通过如下设置来更改默认值

1
2
3
4
eureka:
client:
serviceUrl:
defaultZone: http://localhost:1111/eureka/

当构建了高可用的服务注册集群时,value的值可以配置多个注册中心的地址(通过逗号分隔),如下

1
2
3
4
eureka:
client:
serviceUrl:
defaultZone:http://peer1:8761/eureka/,http://peer2:8762/eureka/

其他配置

下面整理了org.springframework.cloud.netflix.eureka.EurekaClientConfigBean中定义的常用配置参数
以及对应的说明和默认值,这些参数均以eureka.client为前缀。

服务实例类配置

服务实例类的配置信息,可以通过查看
org.springframework.cloud.netflix.eureka.EurekaInstanceConfigBean的源码来获取详细内容,这些配
置都是以eureka.instance为前缀。

元数据

服务实例元数据:用来描述自身服务信息的对象,其中包含一些标准化的元数据,如:服务名称、实例名称、实例IP、实例端口等用于服务治理的重要信息;以及一些用于负载均衡策略或是其他特殊用途的自定义元数据信息。
配置信息通过org.springframework.cloud.netflix.eureka.EurekaInstanceConfigBean加载,但在真正进
行服务注册时,会被包装成com.netflix.appinfo.InstanceInfo对象发送给Eureka服务端。
可以通过eureka.instance.<properties>=<value>的格式对标准化元数据直接进行配置。可以通过eureka.instance.metadataMap..<key>=.<value>的格式对自定义元数据进行配置。

1
2
3
4
eureka:
instance:
metadataMap:
zone: shanghai

实例名配置

实例名是InstanceInfo中的instanceId参数,是区分同一服务中不同实例的唯一标志。在Spring Cloud Eureka
的配置中,针对同一主机中启动多实例的情况,对实例名的默认命名采用如下规则:

1
${spring.cloud.client.hostname}:${spring.application.name}:$   {spring.application.instance_id:${server.port}}

对于实例名的命名规则,可以通过eureka.instance.instanceId参数进行配置。
场景:在本地进行负载均衡调试时,需要启动同一服务的多个实例,我们可以通过(1)在命令行指定不同server.port来启动,(2)直接设置server.port=0或是(3)使用随机数server.port=${random.int[10000,19999]}来避免端口冲突。但是注册到Eureka Server的实例名是相同的,使得只有一个服务实例能够正常提供服务。
解决方法:通过设置实例名规则解决:

1
2
3
eureka:
instance:
instanceId: ${spring.application.name}:${random.int}

端点配置

在InstanceInfo中,可以看到一些URL的配置信息,比如homePageUrl(应用主页的URL)、statusPageUrl(状态也的URL)、healthCheckUrl(健康检查的URL)。其中状态页和健康检查的URL默认使用actuator提供的/info端点和/health端点。
我们必须确保Eureka客户端的/info端点和/health端点能够正确被注册中心访问到。
/info不正确——在Eureka面板中单击服务实例时,无法访问到服务实例提供的信息接口。
/health不正确——服务注册中心不会根据应用的健康检查来更改状态(仅当开启了healthcheck功能时,以该端点
信息作为健康检查标准)。
大多情况下,我们不需要修改这几个URL的配置,但在一些特殊情况下,如:为应用设置了context-path时,所有
spring-boot-actuator模块的监控端点都会增加一个前缀。如下:

1
2
3
4
5
6
management:
context-path: /hello
eureka:
instance:
statusPageUrlPath: ${management.context-path}/info
healthCheckUrlPath: ${management.context-path}/health

有时为了安全考虑,也可能会修改/info和/health端点的原始路径。这时需要做一些特殊配置,如下:

1
2
3
4
5
6
7
8
9
endpoints:
info:
path: /appInfo
health:
path: /checkHealth
eureka:
instance:
statusPageUrlPath: /${endpoints.info.path}
healthCheckUrlPath: /${endpoints.health.path}

以上示例使用的是相对路径进行配置,由于Eureka的服务注册中心默认使用HTTP的方式来访问和暴露这些端点,若客户端使用HTTPS的方式来暴露服务和监控端点时,相对路径无法满足。这时使用绝对路径配置方式。

1
2
3
4
5
eureka:
instance:
statusPageUrlPath: /${eureka.instance.hostname}/info
healthCheckUrlPath: /${eureka.instance.hostname}/health
homePageUrl: https://${eureka.instance.hostname}/

健康检测

默认情况下,Eureka中各个服务实例的健康检查并不是通过spring-boot-actuator模块的/health端点来实现的,
而是依靠客户端心跳的方式保持服务实例的存活,在Eureka的服务续约与剔除机制下,客户端的健康状态从注册到注册中心开始都会处于UP状态,除非心跳终止一段时间之后,服务注册中心将其剔除。默认的心跳实现方式可以有效检查客户端进程是否正常运作,但却无法保证客户端应用能够正常提供服务。由于大多数的应用都会有一些其他的外部资源依赖,比如数据库、缓存、消息代理等,如果应用与这些外部资源无法联通的时候,实际上已经不能提供正常的对外服务了,但此时心跳依然正常,所以它还是会被服务消费者调用,而这样的调用实际上并不能获得预期的结果。
在Spring Cloud Eureka中,可以通过配置,把Eureka客户端的健康检测交给spring-boot-actuator模块的/health端点,以实现更加全面的健康状态维护。
详细步骤如下:

  1. 加入spring-boot-starter-actuator模块的依赖。
  2. 在application.yml中增加参数配置

    1
    2
    3
    4
    eureka:
    client:
    healthcheck:
    enabled: true
  3. 如果客户端的/health端点路径做了特殊处理,则按2.3端点配置方式进行配置,让服务注册中心可以正确访问到健康检测端点。

    其他配置

    下面整理了org.springframework.cloud.netflix.eureka.EurekaInstanceConfigBean中定义的常用配置参
    数以及对应的说明和默认值,这些参数均以eureka.instance为前缀。

    在以上配置中,除了前三个在需要的时候可以调整,其他一般都使用默认值。