50天独立打造企业级API网关(四):全链路可观测性与AI Copilot智能运维

21 阅读10分钟

系列文章第4篇 | 50天手搓Spring Cloud Gateway:44项功能+561测试用例的完整实践


系列导航

  • 第一篇:架构设计与动态路由实现
  • 第二篇:安全防护体系与性能优化
  • 第三篇:弹性设计与限流降级
  • 第四篇:全链路可观测性与AI Copilot ← 本篇
  • 第五篇:Kubernetes部署与测试保障
  • 第六篇:高级路由与负载均衡实战

一、全链路可观测性架构

1.1 四位一体可观测性体系

graph TB
    subgraph "可观测性体系"
        A[实时监控]
        B[分布式追踪]
        C[过滤器链分析]
        D[日志系统]
    end
    
    subgraph "智能分析"
        E[历史对比]
        F[流量拓扑]
        G[异常检测]
        H[告警系统]
    end
    
    A --> E
    B --> F
    C --> G
    D --> H
    
    style A fill:#e1f5ff
    style B fill:#fff4e1
    style C fill:#e1ffe1
    style D fill:#f0e1ff

可观测性覆盖维度:

维度指标采集方式存储
JVMHeap/Non-Heap/GC/ThreadMicrometerPrometheus
CPUProcess CPU/System LoadOperatingSystemMXBeanPrometheus
HTTPQPS/P50/P95/P99/Error RateGlobalFilter拦截Prometheus
链路TraceId/SpanId/耗时TraceCaptureFilterJaeger
过滤器selfTime/totalTime/成功率FilterChainTrackingFilter内存+API
日志访问日志/错误日志AccessLogFilterES/K8s PVC

二、实时监控

网关暴露以下核心监控指标(通过Prometheus暴露):

graph LR
    A[Gateway实例] --> B[Micrometer Registry]
    B --> C[metrics Endpoint]
    C --> D[Prometheus拉取]
    D --> E[Grafana展示]
    D --> F[AI Copilot查询]
    
    style A fill:#e1f5ff
    style D fill:#fff4e1
    style F fill:#e1ffe1

核心监控指标:

类别指标名称类型说明
JVMjvm_memory_used_bytesGauge堆内存使用量
JVMjvm_memory_max_bytesGauge堆内存最大值
JVMjvm_gc_pause_secondsTimerGC暂停时间
JVMjvm_threads_live_threadsGauge活跃线程数
CPUprocess_cpu_usageGauge进程CPU使用率
CPUsystem_load_average_1mGauge1分钟系统负载
HTTPhttp_server_requests_secondsTimer请求耗时分布
HTTPgateway_requests_totalCounter请求总数
HTTPgateway_errors_totalCounter错误总数

2.2 项目截图:监控仪表板

24.png 25.png 26.png 27.png

图24-27:实时监控仪表板。JVM内存监控(24)、CPU使用率(25)、HTTP指标QPS/响应时间/错误率(26)、历史趋势图(27)。

28.png 29.png 30.png 31.png

图28-31:Pod选择器(28)、路由表状态(29)、更多监控维度(30-31)。


三、分布式追踪

3.1 TraceId传递机制

每个请求进入网关时,生成唯一TraceId,并在整个调用链中传递:

sequenceDiagram
    participant C as Client
    participant G as Gateway
    participant S1 as Service-01
    participant S2 as Service-02
    participant J as Jaeger
    
    C->>G: Request
    G->>G: Generate TraceId: abc123
    G->>G: Add Header: X-Trace-Id: abc123
    G->>S1: Forward Request + X-Trace-Id
    S1->>S2: Call + X-Trace-Id
    S1-->>G: Response
    G-->>C: Response + X-Trace-Id
    
    G->>J: Report Span (Gateway)
    S1->>J: Report Span (Service-01)
    S2->>J: Report Span (Service-02)
    
    Note over G,J: 完整调用链可视化

3.2 TraceCapture过滤器实现

@Component
public class TraceCaptureGlobalFilter implements GlobalFilter, Ordered {
    
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        ServerHttpRequest request = exchange.getRequest();
        String traceId = getOrGenerateTraceId(request);
        
        // 记录请求信息
        TraceContext context = TraceContext.builder()
            .traceId(traceId)
            .path(request.getURI().getPath())
            .method(request.getMethod().name())
            .headers(extractHeaders(request.getHeaders()))
            .timestamp(System.currentTimeMillis())
            .build();
        
        return chain.filter(exchange)
            .doOnSuccess(v -> {
                context.setStatusCode(exchange.getResponse().getStatusCode().value());
                context.setDuration(calculateDuration(context.getTimestamp()));
                
                // 慢请求或错误请求才保存
                if (isSlowRequest(context) || isErrorRequest(context)) {
                    traceRepository.save(context);
                }
            })
            .doOnError(throwable -> {
                context.setError(throwable.getMessage());
                traceRepository.save(context);
            });
    }
    
    private boolean isSlowRequest(TraceContext context) {
        return context.getDuration() > slowRequestThreshold;
    }
    
    private boolean isErrorRequest(TraceContext context) {
        return context.getStatusCode() >= 400;
    }
}

3.3 项目截图:请求链路追踪

23.png

图23:请求链路追踪,展示完整的分布式追踪详情,包括Trace ID、Span ID、各服务调用链、耗时分布。


四、过滤器链性能分析(核心亮点)

4.1 selfTime vs totalTime

这是过滤器链分析的核心概念,准确定位性能瓶颈的关键:

指标含义用途
totalTime从过滤器开始到请求完成的总时间(包含下游服务响应)请求 profiling
selfTime仅过滤器自身逻辑执行时间(不含下游)过滤器优化

示例对比:

FilterChainTracking: totalTime=430ms, selfTime=6ms    ← 过滤器很快,totalTime包含后端响应
RemoveCachedBody:    totalTime=424ms, selfTime=1ms    ← 过滤器非常快
LoadBalancerFilter:  totalTime=45ms,  selfTime=45ms   ← 过滤器本身慢(需要优化!)
AuthenticationFilter:totalTime=200ms, selfTime=5ms    ← 过滤器很快,totalTime包含下游

关键洞察:大多数过滤器的totalTime相似,因为它们共享相同的下游服务响应时间。相邻过滤器totalTime的差值等于前一个过滤器的selfTime。

4.2 过滤器链追踪实现

@Component
public class FilterChainTrackingGlobalFilter implements GlobalFilter, Ordered {
    
    // 过滤器统计信息存储(滑动窗口100条记录)
    private final ConcurrentHashMap<String, FilterStats> statsMap = new ConcurrentHashMap<>();
    
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        String filterName = this.getClass().getSimpleName();
        long startTime = System.currentTimeMillis();
        
        return chain.filter(exchange)
            .doOnSuccess(v -> recordSuccess(filterName, startTime))
            .doOnError(throwable -> recordError(filterName, startTime, throwable));
    }
    
    private void recordSuccess(String filterName, long startTime) {
        long duration = System.currentTimeMillis() - startTime;
        FilterStats stats = statsMap.computeIfAbsent(filterName, k -> new FilterStats());
        stats.recordSelfTime(duration);
    }
    
    /**
     * 计算P50/P95/P99分位数
     */
    public Percentiles calculatePercentiles(String filterName) {
        FilterStats stats = statsMap.get(filterName);
        if (stats == null) {
            return Percentiles.EMPTY;
        }
        
        List<Long> sortedTimes = stats.getSortedSelfTimes();
        return Percentiles.builder()
            .p50(getPercentile(sortedTimes, 0.50))
            .p95(getPercentile(sortedTimes, 0.95))
            .p99(getPercentile(sortedTimes, 0.99))
            .avg(stats.getAverageSelfTime())
            .build();
    }
}

4.3 项目截图:过滤器链分析

41.png

图41:过滤器链性能分析,展示每个过滤器的自身耗时、P99延迟、性能瓶颈识别。Key Finding:NettyWriteResponse的高自身时间(553.8ms)表明下游服务响应慢。


五、AI Copilot:35+智能工具实战

5.1 AI Copilot架构

AI Copilot是网关的智能运维助手,支持35+工具调用,能够自主查询系统状态、分析问题、提供优化建议。

graph TB
    subgraph "AI Copilot"
        A[用户输入自然语言]
        B[LLM理解意图]
        C[选择工具]
        D[执行工具]
        E[分析结果]
        F[生成回答]
    end
    
    subgraph "工具集 35+"
        G[list_routes]
        H[get_route_detail]
        I[get_service_detail]
        J[nacos_service_discovery]
        K[query_prometheus_metrics]
        L[query_stress_test_results]
        M[get_diagnostic_data]
        N[create_route]
        O[update_route]
    end
    
    A --> B
    B --> C
    C --> D
    D --> E
    E --> F
    
    C --> G
    C --> H
    C --> I
    C --> J
    C --> K
    C --> L
    C --> M
    C --> N
    C --> O
    
    style A fill:#e1f5ff
    style B fill:#fff4e1
    style F fill:#e1ffe1

5.2 支持的AI提供商

区域提供商模型
国内Qwen(通义千问)、DeepSeekqwen-plus, qwen-turbo, deepseek-chat
海外OpenAI、Anthropic、GoogleGPT-4, GPT-3.5-turbo, Claude-3, Gemini
本地Ollamallama2, mistral

5.3 动态Prompt管理

AI Copilot的Prompt存储在数据库中,支持动态更新,无需重启:

CREATE TABLE ai_copilot_prompts (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    prompt_key VARCHAR(100) UNIQUE NOT NULL,
    prompt_type VARCHAR(50) NOT NULL,
    content TEXT NOT NULL,
    description VARCHAR(500),
    enabled BOOLEAN DEFAULT true,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

Prompt类型:

类型说明示例Key
SYSTEM系统级Prompt,定义AI行为system_default, system_route_gen
TASK任务级Prompterror_analysis, route_generation
EXPLANATION概念解释Promptexplain_rate_limit
CUSTOM用户自定义Promptcustom_security_check

六、AI Copilot实战案例

6.1 案例1:AI调试404错误(推翻用户结论)

场景:用户声称请求返回404,要求AI帮忙排查。

用户输入

"Why is my request returning 404? Please help me analyze."

AI执行流程:

sequenceDiagram
    participant U as 用户
    participant AI as AI Copilot
    participant T as 工具集
    participant R as 路由系统
    
    U->>AI: 请求返回404,帮我分析
    AI->>T: 调用 list_routes 工具
    T->>R: 查询所有路由
    R-->>T: 2条路由,均匹配
    
    AI->>T: 调用 get_route_detail 工具
    T->>R: 查询路由详情
    R-->>T: route-01: enabled=true, Path=/api/**
    T-->>AI: 路由配置正常
    
    AI->>T: 调用 similar_route_match 工具
    T->>R: 模拟请求匹配
    R-->>T: matched=true
    T-->>AI: 请求应该能匹配上!
    
    AI->>U: 分析结果:路由配置正确,请求应该能匹配,可能不是404问题

AI分析结果:

404 Error Analysis Report

Verified Result (Tool-Based):

  • Route Match: SUCCESS - The request path /api/test matches route route-01
  • Route Enabled: true
  • Predicates: Path=/api/**

Conclusion: The request should NOT return 404 based on route configuration. There might be another issue (backend service unavailable, network problem, etc.)

项目截图:

50.png 51.png 52.png 53.png 54.png

图50-54:AI调试404错误全过程。用户声称404(50),AI查询路由配置(51),分析路由谓词(52),发现请求应该能匹配(53),推翻用户的404结论(54)。

6.2 案例2:AI压测分析(基于Prometheus+数据库)

场景:压测完成后,用户要求AI分析最近2分钟的压测结果。

用户输入

"Analyze the stress test results from the last 2 minutes."

AI执行流程:

sequenceDiagram
    participant U as 用户
    participant AI as AI Copilot
    participant P as Prometheus
    participant DB as 数据库
    participant A as 分析引擎
    
    U->>AI: 分析最近2分钟压测结果
    AI->>P: query_prometheus_metrics
    P-->>AI: QPS, 响应时间, CPU, 内存等指标
    
    AI->>DB: query_stress_test_results
    DB-->>AI: 压测配置、成功率、错误分布
    
    AI->>A: 数据聚合分析
    A->>A: 识别性能瓶颈
    A->>A: 生成优化建议
    A-->>AI: 分析报告
    
    AI->>U: 返回详细分析报告

AI分析报告(节选):

Stress Test Analysis Report

Performance Summary:

  • P99 Response Time: 596.0ms (Warning: >2000ms is critical)
  • Error Rate: 0.8% (Warning: <0.1% is normal)

Root Cause Analysis: The response time is extremely high (>2.5 seconds average). This is NOT a gateway performance issue - it's a downstream service latency problem.

Filter Chain Performance:

FilterAvg Self-TimeP99 Self-TimeAssessment
NettyWriteResponse553.8ms2586msMajor bottleneck
TraceCapture2.3ms33.8msAcceptable
AccessLog1.8ms54.3msAcceptable
NettyRouting1.5ms49.6msAcceptable

Key Finding: NettyWriteResponse has very high self-time (553.8ms average), which indicates downstream service response time is slow.

GC Pressure During Stress Test:

  • Young GC Count: Before=0, During=78 (Elevated)
  • Full GC Count: Before=0, During=10 (Critical)
  • GC Overhead: Before=0%, During=1.4% (Warning)

Recommendations:

  1. High Priority: Optimize downstream service (target: <500ms response time)
  2. JVM Tuning: Increase heap size (-Xms1g -Xmx1g), use G1GC
  3. Connection Pool: Increase max connections to 1000

项目截图:

55.png 56.png 57.png 58.png 59.png 60.png 61.png 62.png 63.png

图55-63:AI压测分析全过程。性能分析报告(55)、GC压力分析(56)、根因分析(57)、监控数据趋势(58)、下游服务延迟根因(59)、优化建议(60)、JVM调优建议(61)、性能对比表(62)、结论总结(63)。

6.3 案例3:AI路由禁用分析

场景:用户禁用了所有路由后,再次询问为什么404。

用户输入

"Why am I getting 404 when accessing /api/test?"

AI执行流程:

sequenceDiagram
    participant U as 用户
    participant AI as AI Copilot
    participant T as 工具集
    participant R as 路由系统
    
    U->>AI: 为什么访问404?
    AI->>T: 调用 list_routes 工具
    T->>R: 查询所有路由
    R-->>T: 2条路由,enabled=false
    T-->>AI: 所有路由均被禁用
    
    AI->>T: 调用 get_route_detail 工具
    T->>R: 查询路由详情
    R-->>T: route-01: enabled=false, Path=/api/**
    T-->>AI: 路由配置正确,但被禁用
    
    AI->>U: 分析结果:所有路由均被禁用(enabled=false),导致请求匹配不到任何路由,返回404

AI分析结果:

404 Error Analysis Report

Verified Result (Tool-Based):

  • Route Match: FAILED - No route matched, route is disabled
  • Route Enabled: DISABLED - route-01 is disabled (enabled=false)

Diagnostic Summary:

ItemStatusDetails
Route MatchFAILEDNo route matched, route is disabled
Route EnabledDISABLEDroute-01 is disabled (enabled=false)
Gateway HealthHEALTHYOverall score: 100/100
Backend ServicesCONFIGUREDSee details below

Conclusion: All routes are disabled. No route can match the request, so the gateway returns 404. Enable at least one route to resolve this.

项目截图:

64.png 65.png 66.png

图64-66:AI路由禁用分析。路由管理界面显示所有路由被禁用(64),AI 404错误分析报告(65),AI详细路由配置分析(66)。


七、其他可观测性功能

7.1 流量拓扑

40.png

图40:流量拓扑可视化,实时展示请求流量路径:gateway-01 → route-01 → service-01/demo-service,直观呈现流量分布和服务健康状态。

7.2 告警配置

32.png

图32:告警配置界面,支持设置邮件告警。可配置告警阈值(CPU、内存、响应时间等)、接收人邮箱、告警频率等。

7.3 系统诊断

38.png 39.png

图38-39:系统诊断功能。健康检查(38):Nacos连接、Redis可用性、数据库健康、JVM状态。诊断报告(39):系统健康评分、各组件检查状态、优化建议。


八、核心代码文件索引

功能文件路径说明
AI Copilot控制器gateway-admin/src/main/java/com/leoli/gateway/admin/controller/AiCopilotController.javaAI Copilot REST API
工具执行器gateway-admin/src/main/java/com/leoli/gateway/admin/service/ai/ToolExecutor.java统一工具执行框架
路由生成器gateway-admin/src/main/java/com/leoli/gateway/admin/service/ai/RouteGeneratorTool.javaAI路由生成工具
错误分析器gateway-admin/src/main/java/com/leoli/gateway/admin/service/ai/ErrorAnalyzerTool.javaAI错误分析工具
Prometheus查询gateway-admin/src/main/java/com/leoli/gateway/admin/service/monitoring/PrometheusQueryService.javaPrometheus指标查询
过滤器链追踪my-gateway/src/main/java/com/leoli/gateway/filter/FilterChainTrackingGlobalFilter.java过滤器性能追踪
TraceId生成器my-gateway/src/main/java/com/leoli/gateway/filter/TraceIdGlobalFilter.javaTraceId生成与传递
Trace捕获器my-gateway/src/main/java/com/leoli/gateway/filter/TraceCaptureGlobalFilter.java请求追踪捕获

九、总结与预告

本篇总结

本文介绍了企业级API网关的全链路可观测性与AI Copilot

  1. 实时监控:JVM、CPU、HTTP全面监控,Prometheus集成
  2. 分布式追踪:TraceId传递,Jaeger集成,慢请求/错误请求捕获
  3. 过滤器链分析:selfTime vs totalTime核心概念,P50/P95/P99分位数
  4. AI Copilot:35+工具,支持Qwen/DeepSeek/GPT/Claude多模型
  5. AI实战案例
    • 案例1:AI调试404,推翻用户结论
    • 案例2:AI压测分析,基于Prometheus+数据库真实数据
    • 案例3:AI路由禁用分析,准确定位根因
  6. 其他功能:流量拓扑、告警配置、系统诊断

下篇预告

第5篇:Kubernetes部署与测试保障

  • Kubernetes多实例管理
  • Namespace隔离实现
  • 心跳监控机制(Running/Warning/Error)
  • 资源配置管理(small/medium/large/xlarge)
  • 压力测试工具(9个测试模板)
  • GC智能诊断与JVM调优
  • 配置调和机制(数据库 vs Nacos一致性)
  • 561个测试用例覆盖策略

敬请期待!


参考资料


关于作者

李朝,网关开发,7年+分布式系统经验,专注于API网关、微服务架构、云原生技术领域。

50天独立开发企业级API网关平台,涵盖44项核心功能、561个测试用例,从架构设计到生产环境部署全流程实践。


专业服务

如果你需要构建类似的API网关或微服务平台,我可以提供以下服务:

  • API网关定制开发:根据业务需求定制开发网关功能
  • 架构设计与咨询:微服务架构设计、技术选型、性能优化
  • 性能调优:JVM调优、连接池优化、限流降级方案
  • AI集成:AI Copilot开发、智能运维、自动化诊断

联系方式

需要API网关或微服务架构方面的帮助? 欢迎通过邮件或Upwork联系我,提供技术咨询和定制开发服务。