13.6场景5 微服务调用失败

分类: 故障排查 Troubleshooting 实战

场景 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:内存泄漏。学习如何排查内存泄漏问题。