
目录4.5 服务调用测试与问题排查 —— 微服务开发中的真实调试一、先建立完整调用链第1步进入 Gateway第2步Gateway找 blog-service第3步进入 blog-service第4步Feign调用 user-service第5步Feign找服务第6步二、第一类问题Nacos没有服务实例排查步骤1. 看Nacos控制台三、为什么服务没有注册原因1没有开启服务发现原因2缺少依赖原因3Nacos地址错误四、第二类问题Gateway 404第一步看Route第二步检查Path第三步检查StripPrefix五、第三类问题Feign 404API接口服务实现六、第四类问题Feign超时1. 数据库慢2. 服务阻塞3. Feign超时时间太短七、第五类问题服务启动成功但是调用失败八、开启Feign日志九、微服务排错思维第一步入口第二步路由第三步服务发现第四步业务服务第五步远程调用第六步数据库十、面试高频问题Q1Feign调用失败如何排查Q2Nacos显示服务存在但是Feign调用失败怎么办Q3Gateway返回404可能原因十一、这一节的核心价值微服务故障定位能力4.6 微服务项目整体复盘继续。现在进入4.5 服务调用测试与问题排查 —— 微服务开发中的真实调试这一部分非常重要。前面我们已经搭好了理论链路客户端 ↓ Gateway ↓ blog-service ↓ Feign ↓ Nacos ↓ user-service但是实际开发中80%的时间不是写代码而是在排查调用失败。例如Feign调用失败Nacos找不到服务Gateway返回404服务返回503超时注册了但是调用不到这一节就是训练你的排错思维。一、先建立完整调用链假设请求GET /blog/detail/1第1步进入 Gateway请求localhost:9000/blog/detail/1Gateway匹配- id: blog-route uri: lb://blog-service predicates: - Path/blog/**第2步Gateway找 blog-serviceGateway问Nacosblog-service有哪些实例Nacos返回blog-service 192.168.1.20:8082第3步进入 blog-service执行BlogController.detail()第4步Feign调用 user-service代码userFeignClient.getUserById(userId);第5步Feign找服务Feign我要调用 user-serviceNacos返回user-service 192.168.1.30:8081第6步HTTP调用GET 192.168.1.30:8081/user/10001任何一步失败都会报错。二、第一类问题Nacos没有服务实例这是最常见。例如FeignFeignClient(user-service)调用。报错Load balancer does not contain an instance for the service user-service意思负载均衡器没有找到实例。排查步骤1. 看Nacos控制台进入localhost:8848/nacos服务列表。看user-service有没有。正常服务名 实例数量 user-service 1 blog-service 1 gateway-service 1如果user-service 0说明服务没有注册。三、为什么服务没有注册原因1没有开启服务发现检查启动类。需要EnableDiscoveryClient SpringBootApplication public class UserApplication { }原因2缺少依赖pom需要dependency groupId com.alibaba.cloud /groupId artifactId spring-cloud-starter-alibaba-nacos-discovery /artifactId /dependency原因3Nacos地址错误例如配置spring: cloud: nacos: discovery: server-addr: localhost:8848部署服务器后错误。因为localhost不是Nacos服务器。应该server-addr: 192.168.1.100:8848四、第二类问题Gateway 404例如访问localhost:9000/blog/list返回404 Not Found排查第一步看Route访问/actuator/gateway/routes你之前已经使用过。检查有没有{ id:blog-route }第二步检查Path配置predicates: - Path/blog/**请求/blogs/list不匹配。所以404。第三步检查StripPrefix例如Gateway收到/api/blog/list配置filters: - StripPrefix1发送/blog/list如果服务Controller是RequestMapping(/api/blog)那么路径错。这是非常常见的问题。五、第三类问题Feign 404例如Feign调用userFeignClient.getUserById(1L)结果404说明服务找到了。但是接口路径不存在。例如FeignGetMapping(/user/{id}) UserDTO getUserById( PathVariable Long id );实际ControllerGetMapping(/users/{id})少了一个s。结果404。排查检查API接口GetMapping(/user/{id})服务实现GetMapping(/user/{id})必须一致。六、第四类问题Feign超时错误Read timed out含义请求发出去了。但是服务迟迟没返回。可能1. 数据库慢例如SQLselect * from blog where title like %xxx%没有索引。2. 服务阻塞例如代码Thread.sleep(10000);3. Feign超时时间太短默认可能几秒。修改spring: cloud: openfeign: client: config: default: connectTimeout:5000 readTimeout:5000七、第五类问题服务启动成功但是调用失败这个非常容易迷惑。例如控制台Started UserApplication但是调用失败。为什么因为启动成功 ≠ 注册成功。需要看Nacos。完整状态应该Java启动成功 ↓ 连接Nacos ↓ 注册实例 ↓ Nacos显示服务 ↓ 才能调用八、开启Feign日志调试远程调用非常有用。配置logging: level: com.xxx.feign: DEBUG然后看到Feign Request GET /user/10001 Response: 200九、微服务排错思维以后遇到问题不要乱改。按照链路排查第一步入口Gateway有没有收到看日志Gateway request /blog/list第二步路由Gateway有没有转发检查Route。第三步服务发现Nacos有没有实例第四步业务服务Controller有没有收到第五步远程调用Feign有没有发请求第六步数据库SQL是否正常。形成请求 ↓ Gateway ↓ 服务发现 ↓ 服务调用 ↓ 业务逻辑 ↓ 数据库逐层排查。十、面试高频问题Q1Feign调用失败如何排查回答首先确认调用方服务是否正常启动然后检查Nacos是否存在目标服务实例再检查Feign接口路径和服务Controller映射是否一致最后检查网络、超时以及业务异常。Q2Nacos显示服务存在但是Feign调用失败怎么办回答检查服务实例IP是否正确端口是否开放健康状态Controller路径服务是否真正监听端口Q3Gateway返回404可能原因回答Route未匹配Path配置错误StripPrefix配置错误下游接口不存在十一、这一节的核心价值你现在不是单纯学习Feign怎么写而是在建立微服务故障定位能力真实工作更多时候不是“怎么调用”。而是“为什么调用失败”。到这里这个博客系统案例已经完成✅ 服务拆分✅ common模块✅ 用户服务✅ 博客服务✅ Gateway✅ JWT认证✅ Feign服务调用✅ Nacos服务发现✅ 调试排错下一节建议进入4.6 微服务项目整体复盘重点一次请求完整链路各组件职责项目架构图面试如何介绍这个项目如何回答“为什么这么设计”这一部分非常适合你后面写简历项目描述。