Spring Cloud Gateway限流熔断异常处理:基于Resilience4j的微服务保护机制

星辰漫步
星辰漫步 2026-01-25T04:05:03+08:00
0 0 1

引言

在现代微服务架构中,服务间的调用变得越来越复杂,系统的稳定性和可靠性面临着严峻挑战。Spring Cloud Gateway作为API网关,在微服务架构中扮演着至关重要的角色,它不仅负责路由转发,还承担着流量控制、安全认证、限流熔断等关键功能。

当面对高并发场景时,微服务系统很容易出现雪崩效应,导致整个系统瘫痪。为了应对这一挑战,我们需要构建完善的微服务保护机制。Resilience4j作为一个轻量级的容错库,为Spring Cloud Gateway提供了强大的限流、熔断、降级等保护能力。

本文将深入探讨如何在Spring Cloud Gateway中集成Resilience4j,实现全面的微服务保护机制,包括异常处理流程设计、监控指标收集、自适应限流算法应用等关键技术点。

一、微服务保护机制概述

1.1 微服务架构面临的挑战

在微服务架构中,服务之间的调用呈现出复杂的网状结构。当某个服务出现故障或响应缓慢时,很容易引发连锁反应,导致整个系统的服务雪崩。主要挑战包括:

  • 服务依赖问题:服务间的相互依赖可能导致级联故障
  • 资源耗尽风险:高并发请求可能导致线程池耗尽、数据库连接池溢出
  • 性能下降:单个服务的延迟会直接影响整体系统的响应时间
  • 用户体验恶化:系统不稳定直接影响用户访问体验

1.2 Resilience4j的核心功能

Resilience4j是专门为Java 8和函数式编程设计的容错库,它提供了以下核心功能:

  • 断路器(Circuit Breaker):监控服务调用失败率,自动熔断故障服务
  • 限流器(Rate Limiter):控制请求速率,防止系统过载
  • 重试机制(Retry):自动重试失败的操作
  • 舱壁模式(Bulkhead):隔离资源,防止故障扩散
  • 降级处理(Fallback):提供备用方案,确保系统可用性

1.3 Spring Cloud Gateway与Resilience4j集成优势

将Resilience4j集成到Spring Cloud Gateway中,可以实现:

  • 统一的流量控制:在网关层统一管理所有服务的限流和熔断
  • 细粒度控制:支持按服务、按路由、按请求参数等维度进行控制
  • 实时监控:提供丰富的监控指标,便于问题定位和性能优化
  • 灵活配置:支持动态配置,无需重启服务即可调整策略

二、环境准备与依赖配置

2.1 项目结构说明

在开始实现之前,我们需要先建立合适的项目结构:

spring-cloud-gateway-resilience4j/
├── gateway-service/
│   ├── src/main/java/com/example/gateway/
│   │   ├── GatewayApplication.java
│   │   ├── config/
│   │   │   ├── Resilience4jConfig.java
│   │   │   └── GatewayConfig.java
│   │   ├── filter/
│   │   │   ├── RateLimitFilter.java
│   │   │   └── CircuitBreakerFilter.java
│   │   └── handler/
│   │       └── ExceptionHandler.java
│   └── src/main/resources/
│       ├── application.yml
│       └── bootstrap.yml
└── service-api/
    └── src/main/java/com/example/service/
        └── api/
            └── ServiceApiApplication.java

2.2 Maven依赖配置

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
         http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    
    <groupId>com.example</groupId>
    <artifactId>spring-cloud-gateway-resilience4j</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>pom</packaging>
    
    <properties>
        <java.version>11</java.version>
        <spring-cloud.version>Hoxton.SR12</spring-cloud.version>
        <resilience4j.version>1.7.1</resilience4j.version>
    </properties>
    
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            
            <dependency>
                <groupId>io.github.resilience4j</groupId>
                <artifactId>resilience4j-bom</artifactId>
                <version>${resilience4j.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    
    <modules>
        <module>gateway-service</module>
        <module>service-api</module>
    </modules>
</project>

2.3 Gateway服务依赖

<dependencies>
    <!-- Spring Cloud Gateway -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-gateway</artifactId>
    </dependency>
    
    <!-- Resilience4j Spring Cloud Gateway支持 -->
    <dependency>
        <groupId>io.github.resilience4j</groupId>
        <artifactId>resilience4j-spring-boot2</artifactId>
    </dependency>
    
    <dependency>
        <groupId>io.github.resilience4j</groupId>
        <artifactId>resilience4j-reactor</artifactId>
    </dependency>
    
    <!-- 监控和管理 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    
    <!-- Spring WebFlux -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-webflux</artifactId>
    </dependency>
    
    <!-- 配置中心支持 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-config</artifactId>
    </dependency>
    
    <!-- 服务发现 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
</dependencies>

三、Resilience4j配置与初始化

3.1 基础配置文件

# application.yml
server:
  port: 8080

spring:
  application:
    name: gateway-service
  cloud:
    gateway:
      routes:
        - id: user-service
          uri: lb://user-service
          predicates:
            - Path=/api/user/**
          filters:
            - name: CircuitBreaker
              args:
                name: userServiceCircuitBreaker
        - id: order-service
          uri: lb://order-service
          predicates:
            - Path=/api/order/**
          filters:
            - name: CircuitBreaker
              args:
                name: orderServiceCircuitBreaker
    config:
      import: optional:configserver:http://localhost:8888

resilience4j:
  circuitbreaker:
    instances:
      userServiceCircuitBreaker:
        failure-rate-threshold: 50
        wait-duration-in-open-state: 30s
        permitted-number-of-calls-in-half-open-state: 10
        sliding-window-size: 100
        sliding-window-type: COUNT_BASED
        automatic-transition-from-open-to-half-open-enabled: true
      orderServiceCircuitBreaker:
        failure-rate-threshold: 40
        wait-duration-in-open-state: 20s
        permitted-number-of-calls-in-half-open-state: 5
        sliding-window-size: 50
        sliding-window-type: COUNT_BASED
    configs:
      default:
        failure-rate-threshold: 50
        wait-duration-in-open-state: 30s
        permitted-number-of-calls-in-half-open-state: 10
        sliding-window-size: 100
        sliding-window-type: COUNT_BASED
        automatic-transition-from-open-to-half-open-enabled: true
  ratelimiter:
    instances:
      userServiceRateLimiter:
        limit-for-period: 100
        limit-refresh-period: 1s
        timeout-duration: 5s
      orderServiceRateLimiter:
        limit-for-period: 50
        limit-refresh-period: 1s
        timeout-duration: 3s
    configs:
      default:
        limit-for-period: 100
        limit-refresh-period: 1s
        timeout-duration: 5s

management:
  endpoints:
    web:
      exposure:
        include: health,info,metrics,circuitbreakers,ratelimiters
  endpoint:
    health:
      show-details: always

3.2 Resilience4j配置类

@Configuration
@EnableConfigurationProperties({CircuitBreakerProperties.class, RateLimiterProperties.class})
public class Resilience4jConfig {
    
    @Bean
    public CircuitBreakerRegistry circuitBreakerRegistry() {
        return CircuitBreakerRegistry.ofDefaults();
    }
    
    @Bean
    public RateLimiterRegistry rateLimiterRegistry() {
        return RateLimiterRegistry.ofDefaults();
    }
    
    @Bean
    public CircuitBreakerConfig defaultCircuitBreakerConfig() {
        return CircuitBreakerConfig.custom()
                .failureRateThreshold(50)
                .waitDurationInOpenState(Duration.ofSeconds(30))
                .permittedNumberOfCallsInHalfOpenState(10)
                .slidingWindowSize(100)
                .slidingWindowType(SlidingWindowType.COUNT_BASED)
                .automaticTransitionFromOpenToHalfOpenEnabled(true)
                .build();
    }
    
    @Bean
    public RateLimiterConfig defaultRateLimiterConfig() {
        return RateLimiterConfig.custom()
                .limitForPeriod(100)
                .limitRefreshPeriod(Duration.ofSeconds(1))
                .timeoutDuration(Duration.ofSeconds(5))
                .build();
    }
}

四、限流机制实现

4.1 基于时间窗口的限流策略

@Component
public class RateLimitFilter {
    
    private final RateLimiterRegistry rateLimiterRegistry;
    private final MeterRegistry meterRegistry;
    
    public RateLimitFilter(RateLimiterRegistry rateLimiterRegistry, 
                          MeterRegistry meterRegistry) {
        this.rateLimiterRegistry = rateLimiterRegistry;
        this.meterRegistry = meterRegistry;
    }
    
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        String routeId = getRouteId(exchange);
        
        if (routeId == null || routeId.isEmpty()) {
            return chain.filter(exchange);
        }
        
        RateLimiter rateLimiter = rateLimiterRegistry.rateLimiter(routeId);
        
        return Mono.fromCallable(() -> rateLimiter.acquirePermission())
                .subscribeOn(Schedulers.boundedElastic())
                .flatMap(acquired -> {
                    if (acquired) {
                        // 记录成功请求
                        recordSuccessRequest(routeId);
                        return chain.filter(exchange);
                    } else {
                        // 限流拒绝
                        return Mono.error(new ResponseStatusException(HttpStatus.TOO_MANY_REQUESTS));
                    }
                })
                .onErrorMap(ResponseStatusException.class, ex -> {
                    if (ex.getStatusCode() == HttpStatus.TOO_MANY_REQUESTS) {
                        recordRateLimitExceeded(routeId);
                    }
                    return ex;
                });
    }
    
    private void recordSuccessRequest(String routeId) {
        Counter.builder("gateway.rate.limiter.success")
                .tag("route", routeId)
                .register(meterRegistry)
                .increment();
    }
    
    private void recordRateLimitExceeded(String routeId) {
        Counter.builder("gateway.rate.limiter.exceeded")
                .tag("route", routeId)
                .register(meterRegistry)
                .increment();
    }
    
    private String getRouteId(ServerWebExchange exchange) {
        return exchange.getAttribute(GatewayFilterChain.class.getName());
    }
}

4.2 自适应限流算法实现

@Component
public class AdaptiveRateLimiter {
    
    private final RateLimiterRegistry rateLimiterRegistry;
    private final MeterRegistry meterRegistry;
    
    // 动态调整的限流参数
    private final Map<String, AtomicLong> requestCount = new ConcurrentHashMap<>();
    private final Map<String, AtomicLong> lastResetTime = new ConcurrentHashMap<>();
    
    public AdaptiveRateLimiter(RateLimiterRegistry rateLimiterRegistry, 
                              MeterRegistry meterRegistry) {
        this.rateLimiterRegistry = rateLimiterRegistry;
        this.meterRegistry = meterRegistry;
        
        // 启动定时任务,动态调整限流参数
        startDynamicAdjustment();
    }
    
    /**
     * 动态调整限流参数
     */
    private void startDynamicAdjustment() {
        ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
        scheduler.scheduleAtFixedRate(() -> {
            try {
                adjustRateLimits();
            } catch (Exception e) {
                log.error("Failed to adjust rate limits", e);
            }
        }, 0, 30, TimeUnit.SECONDS);
    }
    
    /**
     * 根据监控数据动态调整限流参数
     */
    private void adjustRateLimits() {
        // 获取当前系统负载情况
        double cpuLoad = getSystemCpuLoad();
        double memoryUsage = getMemoryUsage();
        
        rateLimiterRegistry.getAllRateLimiters().forEach(rateLimiter -> {
            String name = rateLimiter.getName();
            
            // 根据负载情况调整限流阈值
            int baseLimit = getBaseLimit(name);
            int adjustedLimit = calculateAdjustedLimit(baseLimit, cpuLoad, memoryUsage);
            
            // 更新限流配置
            RateLimiterConfig config = RateLimiterConfig.custom()
                    .limitForPeriod(adjustedLimit)
                    .limitRefreshPeriod(Duration.ofSeconds(1))
                    .timeoutDuration(Duration.ofSeconds(5))
                    .build();
            
            rateLimiterRegistry.replace(name, config);
        });
    }
    
    private int calculateAdjustedLimit(int baseLimit, double cpuLoad, double memoryUsage) {
        // CPU负载过高时降低限流
        if (cpuLoad > 0.8) {
            return Math.max(10, (int)(baseLimit * (1 - cpuLoad * 0.3)));
        }
        
        // 内存使用率过高时降低限流
        if (memoryUsage > 0.85) {
            return Math.max(10, (int)(baseLimit * (1 - memoryUsage * 0.2)));
        }
        
        return baseLimit;
    }
    
    private int getBaseLimit(String routeId) {
        // 根据路由ID获取基础限流值
        switch (routeId) {
            case "userService":
                return 100;
            case "orderService":
                return 50;
            default:
                return 100;
        }
    }
    
    private double getSystemCpuLoad() {
        // 获取系统CPU负载
        OperatingSystemMXBean osBean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
        return osBean.getSystemLoadAverage() / osBean.getAvailableProcessors();
    }
    
    private double getMemoryUsage() {
        // 获取内存使用率
        MemoryMXBean memoryBean = ManagementFactory.getMemoryMXBean();
        MemoryUsage heapUsage = memoryBean.getHeapMemoryUsage();
        return (double) heapUsage.getUsed() / heapUsage.getMax();
    }
}

五、熔断机制实现

5.1 断路器配置与管理

@Component
public class CircuitBreakerManager {
    
    private final CircuitBreakerRegistry circuitBreakerRegistry;
    private final MeterRegistry meterRegistry;
    
    public CircuitBreakerManager(CircuitBreakerRegistry circuitBreakerRegistry, 
                                MeterRegistry meterRegistry) {
        this.circuitBreakerRegistry = circuitBreakerRegistry;
        this.meterRegistry = meterRegistry;
        
        // 注册断路器事件监听器
        registerEventListeners();
    }
    
    /**
     * 注册断路器事件监听器
     */
    private void registerEventListeners() {
        circuitBreakerRegistry.getEventPublisher()
                .onStateTransition(event -> {
                    CircuitBreaker circuitBreaker = event.getCircuitBreaker();
                    String name = circuitBreaker.getName();
                    CircuitBreaker.State state = event.getStateTransition().getToState();
                    
                    // 记录状态转换事件
                    Counter.builder("gateway.circuit.breaker.state.transition")
                            .tag("route", name)
                            .tag("from", event.getStateTransition().getFromState().name())
                            .tag("to", state.name())
                            .register(meterRegistry)
                            .increment();
                    
                    log.info("CircuitBreaker {} transitioned from {} to {}", 
                            name, event.getStateTransition().getFromState(), state);
                })
                .onError(event -> {
                    CircuitBreaker circuitBreaker = event.getCircuitBreaker();
                    String name = circuitBreaker.getName();
                    
                    // 记录错误事件
                    Counter.builder("gateway.circuit.breaker.error")
                            .tag("route", name)
                            .register(meterRegistry)
                            .increment();
                })
                .onSuccess(event -> {
                    CircuitBreaker circuitBreaker = event.getCircuitBreaker();
                    String name = circuitBreaker.getName();
                    
                    // 记录成功事件
                    Counter.builder("gateway.circuit.breaker.success")
                            .tag("route", name)
                            .register(meterRegistry)
                            .increment();
                });
    }
    
    /**
     * 创建自定义断路器配置
     */
    public CircuitBreaker createCustomCircuitBreaker(String name, 
                                                   CircuitBreakerConfig config) {
        return circuitBreakerRegistry.circuitBreaker(name, config);
    }
    
    /**
     * 获取断路器状态信息
     */
    public CircuitBreakerState getState(String name) {
        CircuitBreaker circuitBreaker = circuitBreakerRegistry.circuitBreaker(name);
        return new CircuitBreakerState(
                circuitBreaker.getState(),
                circuitBreaker.getMetrics().getFailureRate(),
                circuitBreaker.getMetrics().getSlowCallRate()
        );
    }
    
    /**
     * 重置断路器状态
     */
    public void reset(String name) {
        CircuitBreaker circuitBreaker = circuitBreakerRegistry.circuitBreaker(name);
        circuitBreaker.reset();
    }
}

5.2 断路器过滤器实现

@Component
public class CircuitBreakerFilter implements GlobalFilter, Ordered {
    
    private final CircuitBreakerRegistry circuitBreakerRegistry;
    private final MeterRegistry meterRegistry;
    private final CircuitBreakerManager circuitBreakerManager;
    
    public CircuitBreakerFilter(CircuitBreakerRegistry circuitBreakerRegistry,
                               MeterRegistry meterRegistry,
                               CircuitBreakerManager circuitBreakerManager) {
        this.circuitBreakerRegistry = circuitBreakerRegistry;
        this.meterRegistry = meterRegistry;
        this.circuitBreakerManager = circuitBreakerManager;
    }
    
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        String routeId = getRouteId(exchange);
        
        if (routeId == null || routeId.isEmpty()) {
            return chain.filter(exchange);
        }
        
        CircuitBreaker circuitBreaker = circuitBreakerRegistry.circuitBreaker(routeId);
        
        // 使用Reactive方式包装请求
        return Mono.fromCallable(() -> {
            try {
                // 记录请求开始时间
                long startTime = System.currentTimeMillis();
                
                // 执行原始请求
                ServerWebExchange filteredExchange = exchange.mutate().build();
                Mono<Void> result = chain.filter(filteredExchange);
                
                // 监控请求耗时
                recordRequestDuration(routeId, System.currentTimeMillis() - startTime);
                
                return result;
            } catch (Exception e) {
                // 记录错误事件
                recordErrorEvent(routeId, e);
                throw e;
            }
        })
        .transformDeferred(ReactiveCircuitBreaker.from(circuitBreaker))
        .onErrorMap(throwable -> {
            if (throwable instanceof CircuitBreakerOpenException) {
                // 断路器打开时的处理
                recordCircuitBreakerOpen(routeId);
                return new ResponseStatusException(HttpStatus.SERVICE_UNAVAILABLE, 
                    "Service temporarily unavailable due to circuit breaker");
            }
            return throwable;
        });
    }
    
    private void recordRequestDuration(String routeId, long duration) {
        Timer.Sample sample = Timer.start(meterRegistry);
        sample.stop(Timer.builder("gateway.request.duration")
                .tag("route", routeId)
                .register(meterRegistry));
    }
    
    private void recordErrorEvent(String routeId, Throwable error) {
        Counter.builder("gateway.circuit.breaker.error.count")
                .tag("route", routeId)
                .tag("error.type", error.getClass().getSimpleName())
                .register(meterRegistry)
                .increment();
    }
    
    private void recordCircuitBreakerOpen(String routeId) {
        Counter.builder("gateway.circuit.breaker.open")
                .tag("route", routeId)
                .register(meterRegistry)
                .increment();
    }
    
    private String getRouteId(ServerWebExchange exchange) {
        // 从路由配置中获取路由ID
        return exchange.getAttribute("routeId");
    }
    
    @Override
    public int getOrder() {
        return Ordered.LOWEST_PRECEDENCE - 10;
    }
}

六、异常处理机制设计

6.1 统一异常处理器

@RestControllerAdvice
public class GlobalExceptionHandler {
    
    private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);
    
    /**
     * 处理限流异常
     */
    @ExceptionHandler(ResponseStatusException.class)
    public ResponseEntity<ErrorResponse> handleRateLimitException(ResponseStatusException ex) {
        if (ex.getStatusCode() == HttpStatus.TOO_MANY_REQUESTS) {
            log.warn("Rate limit exceeded: {}", ex.getMessage());
            
            ErrorResponse error = new ErrorResponse(
                "RATE_LIMIT_EXCEEDED",
                "请求频率过高,请稍后重试",
                System.currentTimeMillis()
            );
            
            return ResponseEntity.status(HttpStatus.TOO_MANY_REQUESTS)
                    .body(error);
        }
        
        return ResponseEntity.status(ex.getStatusCode())
                .body(new ErrorResponse(
                    "SERVICE_ERROR",
                    ex.getMessage(),
                    System.currentTimeMillis()
                ));
    }
    
    /**
     * 处理断路器打开异常
     */
    @ExceptionHandler(CircuitBreakerOpenException.class)
    public ResponseEntity<ErrorResponse> handleCircuitBreakerOpen(CircuitBreakerOpenException ex) {
        log.warn("Circuit breaker is open: {}", ex.getMessage());
        
        ErrorResponse error = new ErrorResponse(
            "CIRCUIT_BREAKER_OPEN",
            "服务暂时不可用,请稍后重试",
            System.currentTimeMillis()
        );
        
        return ResponseEntity.status(HttpStatus.SERVICE_UNAVAILABLE)
                .body(error);
    }
    
    /**
     * 处理超时异常
     */
    @ExceptionHandler(TimeoutException.class)
    public ResponseEntity<ErrorResponse> handleTimeout(TimeoutException ex) {
        log.warn("Request timeout: {}", ex.getMessage());
        
        ErrorResponse error = new ErrorResponse(
            "REQUEST_TIMEOUT",
            "请求超时,请稍后重试",
            System.currentTimeMillis()
        );
        
        return ResponseEntity.status(HttpStatus.REQUEST_TIMEOUT)
                .body(error);
    }
    
    /**
     * 处理通用异常
     */
    @ExceptionHandler(Exception.class)
    public ResponseEntity<ErrorResponse> handleGeneralException(Exception ex) {
        log.error("Unexpected error occurred", ex);
        
        ErrorResponse error = new ErrorResponse(
            "INTERNAL_ERROR",
            "服务器内部错误,请稍后重试",
            System.currentTimeMillis()
        );
        
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
                .body(error);
    }
}

// 错误响应实体类
public class ErrorResponse {
    private String code;
    private String message;
    private long timestamp;
    
    public ErrorResponse() {}
    
    public ErrorResponse(String code, String message, long timestamp) {
        this.code = code;
        this.message = message;
        this.timestamp = timestamp;
    }
    
    // Getters and Setters
    public String getCode() { return code; }
    public void setCode(String code) { this.code = code; }
    
    public String getMessage() { return message; }
    public void setMessage(String message) { this.message = message; }
    
    public long getTimestamp() { return timestamp; }
    public void setTimestamp(long timestamp) { this.timestamp = timestamp; }
}

6.2 自定义异常处理过滤器

@Component
public class ExceptionHandlingFilter implements GlobalFilter, Ordered {
    
    private final MeterRegistry meterRegistry;
    private final ObjectMapper objectMapper;
    
    public ExceptionHandlingFilter(MeterRegistry meterRegistry, ObjectMapper objectMapper) {
        this.meterRegistry = meterRegistry;
        this.objectMapper = objectMapper;
    }
    
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        return chain.filter(exchange)
                .onErrorMap(throwable -> {
                    // 记录异常统计信息
                    recordExceptionMetrics(throwable);
                    return throwable;
                })
                .doOnError(throwable -> {
                    log.error("Gateway error occurred: {}", throwable.getMessage(), throwable);
                });
    }
    
    private void recordExceptionMetrics(Throwable throwable) {
        String exceptionType = throwable.getClass().getSimpleName();
        
        Counter.builder("gateway.exception.count")
                .tag("exception.type", exceptionType)
                .register(meterRegistry)
                .increment();
        
        // 记录详细异常信息
        if (throwable instanceof ResponseStatusException) {
            ResponseStatusException ex = (ResponseStatusException) throwable;
            Counter.builder("gateway.status.exception.count")
                    .tag("status.code", String.valueOf(ex.getStatusCode().value()))
                    .register(meterRegistry)
                    .increment();
        }
    }
    
    @Override
    public int getOrder() {
        return Ordered.LOWEST_PRECEDENCE - 20;
    }
}

七、监控与指标收集

7.1 指标收集配置

@Component
public class MonitoringConfig {
    
    private final MeterRegistry meterRegistry;
    
    public MonitoringConfig(MeterRegistry meterRegistry) {
        this.meterRegistry = meterRegistry;
        
        // 注册自定义指标
        registerCustomMetrics();
    }
    
    private void registerCustomMetrics() {
        // 请求总量计数器
        Counter.builder("gateway.requests.total")
                .description("Total number of requests processed by gateway")
                .register(meterRegistry);
        
        // 成功请求计数器
        Counter.builder("gateway.requests.success")
                .description("Number of successful requests")
                .register(meterRegistry);
        
        // 失败请求计数器
        Counter.builder("gateway.requests.failed")
                .description("Number of failed requests")
                .register(meter
相关推荐
广告位招租

相似文章

    评论 (0)

    0/2000