Eureka使用常见问题

950 阅读3分钟

这是我参与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. 问题