Spring Cloud服务治理之Eureka其他配置

Eureka的服务注册类配置

在实际使用Spring Cloud Eureka的过程中,我们所做的配置内容几乎都是对Eureka客户端配置进行操作,所以了解这部分配置内容,对于用好Eureka非常有用。

Eureka客户端的配置主要分下面两个方面。

服务注册相关配置信息,包括服务注册中心的地址、服务获取的间隔时间、可用区域等。

服务实例相关配置信息,包括服务实例名称、IP地址、端口号、健康检查路径等。

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

一 指定注册中心

通过在配置文件中配置eureka.client.serviceUrl参数来实现。

该参数定义如下,它的配置值存储在HashMap类型中,并且设置了一组默认值,默认值的key为defaultZone、value为http://localhost:8761/eurek/

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";

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

比如下面例子:

eureka.client.serviceUrl.defaultZone=http://peer1:1111/eureka/,http://peer2:1112/eureka/

另外,为了服务注册中心的安全考虑,很多时候我们都会为服务注册中心加入安全校验。这个时候,在配置serviceUrl时,需要在value值的URL中加入相应的安全校验信息,比如:

eureka.client.serviceUrl.defaultZone=http://:<password@localhost:1111/eureka。其中为安全校验信息的用户名,为该用户的密码。

二 其他配置

这些配置都是以eureka.client为前缀。
在这里插入图片描述
在这里插入图片描述

Eureka服务实例类配置

关于服务实例类的配置信息,可以通过查看org.springframework.cloud.netflix.eureka.EurekaInstanceConfigBean的源码来获取详细内容,这些配置信息都是以eureka.instance为前缀,下面针对一些常用的配置信息做一些详细的说明。

一 元数据

在org.springframework.cloud.netflix.eureka.EurekaInstanceConfigBean的配置信息中,有一大部分内容都是针对服务实例元数据的配置,那么什么是服务实例的元数据呢?它是Eureka客户端向服务注册中心发送请求时,用来描述自身服务信息的对象,其中包含了一些标准的元数据;以及一些用于负载均衡策略或是其他用途的自定义元数据信息。

在使用Spring Cloud Eureka的时候,所有的配置信息都是通过org.springframework.cloud.netflix.eureka.EurekaInstanceConfigBean进行加载,但在真正进行服务注册的时候,还是会包装成com.netfilx.appinfo.Instanceinfo对象发送给Eureka服务端。这两个类的定义非常相似,可以直接查看com.netfilx.appinfo.Instanceinfo类中的详细定义来了解原始Eureka对元数据的定义。

可以通过eureka.instance.=的格式对标准定义元数据直接进行配置,其中就是EurekaInstanceConfigBean对象中的成员变量名。而对于自定义的元数据,可以通过eureka.instance.metadataMap.=的格式进行配置,比如:

eureka.instance.metadataMap.zone=shanghai

二 实例名配置

实例名,即instanceInfo中的instanceId参数,它是区分同一实例的唯一标识。在Netflix Eureka的原生实现中,实例名采用主机名作为默认值,这样的设置使得同一主机上无法启动多个相同的服务实例。但在Spring Cloud Eureka的配置中,针对同一主机中启动多个实例的情况,对实例名的默认命名做了更为合理的扩展,它采用了如下默认的规则:

s p r i n g . c l o u d . c l i e n t . h o s t n a m e : {spring.cloud.client.hostname}: spring.cloud.client.hostname:{spring.application.name}:KaTeX parse error: Expected '}', got 'EOF' at end of input: …on.instance_id:{server.port}}

对于实例名的命名规则,我们可以通过eureka.instance.instanceId参数来进行配置。

比如在本地进行客户端负载均衡调试时,需要启动同一服务的多个实例,如果我们直接启动同一个应用必然会产生端口冲突。虽然可以在命令行中指定不同的server.port来启动,但是这样还是比较麻烦。实际上,我们可以直接通过设置server.port=0或者使用随机数server.port=${random.int[10000,19999]}来让Tomcat启动时候采用随机端口。但是这个时候我们发现注册到Eureka Serve的实例名都是相同的,这会使得只有一个服务实例能够正常提供服务。对于这个问题,我们就可以通过设置实例名规则来轻松解决:

eureka.instance.instanceId= s p r i n g . a p p l i c a t i o n . n a m e : {spring.application.name}: spring.application.name:{random.int}

通过上面的配置,利用应用名加随机数的方式来区分不同的实例,从而实现在同一主机上,不指定端口就能启动多个实例的效果。

三 端点配置

在InstanceInfo中,可以看到一些URL的配置信息,比如homePageUrl、statusPageUrl、healthCheckUrl。它们分别代表了应用主页的URL、状态页的URL、健康检查的URL。其中,状态页和监控检查的URL在Spring Cloud Eureka中默认使用了spring-boot-actuator模块提供的/info端点和/health端点。为了服务的正常运作,必须确认Eureka客户端的/health端点在发送元数据的时候,是一个能够被注册中心访问的地址,否则服务注册中心不会根据应用的健康状态来更改状态(仅当开启了healthcheck功能时,以该端点信息作为健康检查标准)。而/info端点如果不正确的话,会导致在Eureka面板单击服务实例时,无法访问到服务实例提供的信息接口。

在一些特殊的情况下,比如,为应用设置了context-path,这时,所有spring-boot-actuator模块的监控端点都会增加一个前缀。所以,我们就需要做类似如下的配置,为/info和/health端点也加上类似的前缀:

management.context-path=/hello
eureka.instance.statusPageUrlPath=${management.context-path}/info
eureka.instance.healthCheckUrlPath=${management.context-path}/health

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

endpoints.info.pah=/appinfo
endpoints.health.path=/cheakHealth
eureka.instance.statusPageUrlPath=/${endpoints.info.pah}
eureka.instance.healthCheckUrlPath=/${endpoints.health.path}

上面实例使用的是相对路径。

由于Eureka的服务注册中心默认会以HTTP的方式来访问和暴露这些端点,因此当客户端应用以HTTPS的方式来暴露服务和监控端点时,相对路径的配置方式就无法满足要求了。所以,Spring Cloud Eureka还提供了绝对路径的配置参数,例如:

eureka.instance.homePageUrl=https://${eureka.instance.homename}
eureka.instance.statusPageUrlPath=https://${eureka.instance.homename}/info
eureka.instance.healthCheckUrlPath=https://${eureka.instance.homename}/health
四 健康检查

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

在Spring Cloud Eureka中,我们可以通过简单的配置,把Eureka客户端的监控检查交给spring-boot-actuator模块的/health端点,以实现更加全面的健康状态维护。

详细步骤如下:

1 在pom.xml中加入spring-boot-starter-actuator模块的依赖。

2 在application.properties中增加参数配置eureka.client.healthcheck.enabled=true

五 其他配置

这些配置均以eureka.instance为前缀
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值