这是我参与2022首次更文挑战的第23天,活动详情查看:2022首次更文挑战」
使用 Eureka 作为微服务注册中心时,在使用时遇到了一些问题和错误,在此记录一下问题和解决方法,感兴趣的可以深入源码具体了解。
1. 为什么defaultZone地址必须包含/eureka路径而访问时不需要?
1.1 问题描述
在创建Eureka服务注册中心时,需要在配置文件中配置注册中心的地址,常见的格式为:
eureka.client.serviceUrl.defaultZone=<http://localhost:8761/eureka。
而服务启动后,登录后台管理相关客户端注册信息时,需要登录的地址为:http://localhost:8761
1.2 问题原因
该问题需要从源码的角度来看,Eureka server在启动时创建了过滤器,而过滤的匹配规则就是根据/eureka/*,因此在定义注册地址为http://localhost:8761/eureka/ 时,过滤器根据匹配规则处理后剩下的地址就是 http://localhost:8761。
1.3 自定义路径
为了更好的自定义,SpringBoot中还提供了自定义注册中心地址的功能,只需要在配置文件中设置服务路径的地址即可。
# 定义服务路径信息
server.servlet.context-path=/center
设置并启动服务后,此时服务注册中心地址时为:http://localhost:8761/center/eureka/
2. Eureka 服务请求 localhost:8761 的错误
2.1 问题描述
在启动 Eureka 服务时,服务启动失败,并提示找不到 host:8761 的服务。
2.2 问题原因
出现该问题的主要原因是 Eureka 内部回默认配置一个服务地址为 host:8761 的注册中心地址,而 Eureka 服务在启动时因为配置原因会注册到该地址,最终出现找不到服务的报错信息。
public EurekaClientConfigBean() {
this.serviceUrl.put("defaultZone", "http://localhost:8761/eureka/");
...
}
2.3 问题解决
该问题主要出现在集群配置时,Eureka服务中心也作为客户端注册到其他服务中心,只需要配置时覆盖默认配置即可解决。
# 定义注册中心路径
eureka.client.service-url.defaultZone=http://127.0.0.1:9091/eureka
服务中心单机的情况下,服务中心可以不配置该路径。
3. 注册中心路径用 defaultZone 还是 default-zone
同样是在配置 Eureka 时,客户端需要定义注册中心的路径信息,以便能够在服务启动后注册到服务中心,注册中心路径通常是使用eureka.client.serviceUrl.defaultZone作为key。
根据Eureka源码中逻辑,在配置文件中没有指定region属性时,会使用默认的region="us-east-1",此时对应的zone="defaultZone",即寻找defaultZone指定的注册中心地址,因此Eureka客户端或服务端集群配置服务地址都应该用defaultZone而不是default-zone。
- 如果配置文件中没有定义
defaultZone,会使用默认的http://localhost:8761/eureka/地址 - 如果默认地址访问时不存在,可能会报错,如 2. 问题