13.6、场景5 微服务调用失败
场景 5:微服务调用失败
欢迎回到第 13 章的学习。在上一节,我们学习了前端性能问题的排查方法。现在我们要学习场景 5:微服务调用失败。
本节将学习:服务间调用失败、追踪调用链路、分析网络问题、查看服务日志、以及熔断和重试机制。
服务间调用失败
服务间调用失败的作用是什么? 识别微服务调用失败问题,快速定位失败原因。
如何识别服务间调用失败? 查看以下指标:
- 服务间调用错误率
- 服务间调用超时率
- 服务间调用失败次数
常见失败原因:
- 网络问题
- 服务不可用
- 超时问题
- 协议不匹配
服务间调用失败查询:
# 服务间调用错误率 sum(rate(http_client_requests_total{status=~"5.."}[5m])) by (target_service) / sum(rate(http_client_requests_total[5m])) by (target_service) # 服务间调用超时率 sum(rate(http_client_requests_total{error="timeout"}[5m])) by (target_service) / sum(rate(http_client_requests_total[5m])) by (target_service)
追踪调用链路
追踪调用链路的作用是什么? 使用 Trace 追踪服务间调用的完整链路,了解调用失败的位置。
如何追踪调用链路? 在 Grafana Tempo 中查看服务间调用的 Trace,分析调用链路。
TraceQL 查询示例:
# Invoking between query services failed Trace {service.name="order-service"} && {http.status_code=~"5.."} # A call to query a specific target service failed {service.name="order-service"} && {peer.service="user-service"} && {status="error"}
分析网络问题
分析网络问题的作用是什么? 分析网络层面的问题,识别网络故障。
如何分析网络问题? 分析以下指标:
- 网络延迟
- 网络错误
- 网络超时
- 网络带宽
常见网络问题:
- 网络延迟过高
- 网络丢包
- 网络连接中断
- DNS 解析失败
网络问题分析:
# 网络延迟 avg(http_client_request_duration_seconds) by (target_service) # 网络错误 sum(rate(http_client_requests_total{error!=""}[5m])) by (error_type) # DNS 解析时间 avg(dns_lookup_duration_seconds)
查看服务日志
查看服务日志的作用是什么? 通过服务日志分析调用失败的详细信息,找到失败原因。
如何查看服务日志? 使用 LogQL 查询服务日志,分析错误信息。
LogQL 查询示例:
# 查询服务调用失败日志 {service="order-service"} && {level="error"} && {message=~".*user-service.*"} # 查询网络错误日志 {error_type="network_error"} # 查询超时日志 {error_type="timeout"}
熔断和重试机制
熔断和重试机制的作用是什么? 实施熔断和重试机制,提高服务的可靠性。
熔断机制: 当服务失败率达到阈值时,自动熔断,避免连锁故障。
重试机制: 当服务调用失败时,自动重试,提高成功率。
熔断和重试配置示例:
// Spring Cloud Circuit Breaker provisioning @Configuration public class CircuitBreakerConfig { @Bean public CircuitBreaker userServiceCircuitBreaker() { return CircuitBreaker.of("user-service", CircuitBreakerConfig.custom() .failureRateThreshold(50) .waitDurationInOpenState(Duration.ofSeconds(30)) .slidingWindowSize(10) .build()); } } // Feign Client Retry the configuration @FeignClient(name = "user-service", fallback = UserServiceFallback.class) public interface UserServiceClient { @GetMapping("/api/users/{id}") User getUser(@PathVariable Long id); }
本节小结
在本节中,我们学习了场景 5:微服务调用失败:
第一个是服务间调用失败。 识别微服务调用失败问题,快速定位失败原因。
第二个是追踪调用链路。 使用 Trace 追踪服务间调用的完整链路,了解调用失败的位置。
第三个是分析网络问题。 分析网络层面的问题,识别网络故障。
第四个是查看服务日志。 通过服务日志分析调用失败的详细信息,找到失败原因。
第五个是熔断和重试机制。 实施熔断和重试机制,提高服务的可靠性。
故障排查流程: 服务间调用失败 → 追踪调用链路 → 分析网络问题 → 查看服务日志 → 实施熔断和重试机制 → 验证修复效果。
这就是场景 5:微服务调用失败。通过场景 5 的学习,我们掌握了微服务调用失败的排查方法。
在下一节,我们将学习场景 6:内存泄漏。学习如何排查内存泄漏问题。