贝利信息

Java面试之微服务架构下服务发现与治理

日期:2026-01-11 00:00 / 作者:幻夢星雲
服务发现失败时,eureka.client.fetch-registry和register-with-eureka必须

配对检查,因二者是协作关系:前者控制是否拉取服务列表,后者控制是否注册自身,错配将导致注册失败或无法发现服务。

服务发现失败时,eureka.client.fetch-registryeureka.client.register-with-eureka 为什么必须配对检查

微服务启动后注册不到 Eureka Server,或无法拉取服务列表,八成是这两个布尔配置没对齐。它们不是独立开关,而是协作关系:fetch-registry 控制是否从 Server 拉取服务列表(影响 DiscoveryClient 的可用实例),register-with-eureka 控制是否把自己注册上去。

常见错误场景:

@LoadBalanced RestTemplate 在 Spring Cloud 2025+ 之后为什么经常失效

Spring Cloud 2025.0.0(即 Ilford 版本)起,RestTemplate 的负载均衡能力不再由 LoadBalancerAutoConfiguration 全自动装配,而是依赖 BlockingLoadBalancerClient + ServiceInstanceListSupplier,且默认只支持 Reactor 环境下的 WebClient。若项目没显式引入 spring-cloud-starter-loadbalancer@LoadBalanced 注解将静默失效——不会报错,但请求始终发往 localhost:8080。

修复方式:

Consul 作为注册中心时,spring.cloud.consul.discovery.health-check-path 配置不对会导致服务持续被下线

Consul 默认通过 HTTP GET 请求服务的 /actuator/health 端点判断健康状态。如果 Spring Boot Actuator 版本 ≥ 3.x,/actuator/health 默认返回 200,但 Consul 发起的请求头不含 Accept: application/vnd.spring-boot.actuator.v3+json,导致响应体为空或 406 —— Consul 将其视为健康检查失败,反复踢出服务。

解决路径只有两条:

Nacos 2.x 中 nacos.naming.cache.dir 不生效的真正原因

这个配置项在 Nacos 2.x 客户端(com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-discovery:2.2.10-RC1 及以上)中已被完全忽略。Nacos 客户端内部改用内存缓存 + 本地磁盘映射(~/.nacos/naming/ 下的 JSON 文件),但该路径由客户端硬编码决定,不受 Spring Boot 配置控制。

如果你看到日志里反复出现 fail to update cache from remote server,或服务列表更新延迟明显,并非缓存目录问题,而是:

本地缓存位置实际固定为 ${user.home}/.nacos/naming/,强行修改系统属性 nacos.naming.cache.dir 不会改变行为,只会让日志输出误导性路径。