camel-code-demo/docs/troubleshooting.md

7.0 KiB
Raw Blame History

Camel-Vertx API 服务排障文档

问题背景

在使用 Apache Camel 4.11.0 和 Vert.x 构建的 RESTful API 项目中,我们遇到了访问 API 接口时返回 400 错误以及连接被拒绝的问题。通过对代码和配置的分析,找到了以下关键问题及解决方案。

核心问题

  1. 端口绑定冲突Camel 的 platform-http 组件无法正确绑定到主 HTTP 端口8080
  2. 路由器绑定错误Vert.x Router 没有直接绑定到主 HTTP 服务器实例
  3. 请求处理混乱:手动创建的 HTTP 服务器与 Camel 路由系统存在冲突

解决方案

  1. 明确 HTTP 服务器创建与绑定

    // 创建一个显式的主 HTTP 服务器实例
    io.vertx.core.http.HttpServer mainHttpServer = vertx.createHttpServer();
    
    // 将 Router 直接绑定到 HTTP 服务器并启动监听
    mainHttpServer.requestHandler(vertxRouter).listen(serverPort, serverHost, res -> {
        if (res.succeeded()) {
            logger.info("主HTTP服务器成功启动监听在 {}:{}", serverHost, serverPort);
        } else {
            logger.error("主HTTP服务器启动失败: {}", res.cause().getMessage());
        }
    });
    
  2. 添加直接的 API 测试端点

    // 添加直接 API 测试路由,绕过 Camel 处理
    vertxRouter.route("/api/direct-test").handler(ctx -> {
        logger.info("收到API直接测试请求: {}", ctx.request().uri());
        ctx.response()
            .putHeader("Content-Type", "application/json")
            .end("{\"status\":\"ok\",\"message\":\"API direct test working\"}");
    });
    
  3. 避免多个服务器实例竞争同一端口

    • 移除了竞争主端口8080的额外 HTTP 服务器实例
    • 保留辅助 HTTP 服务器在其他端口8081用于诊断
  4. 启用 Nacos 服务注册

    // 注册服务到Nacos
    String serviceName = AppConfig.getProperty("nacos.service.name", "camel-vertx-service");
    String registryIp = "0.0.0.0".equals(serverHost) || "localhost".equals(serverHost) ? 
            hostAddress : serverHost;
    
    Map<String, String> metadata = new HashMap<>();
    metadata.put("application.name", "camel-vertx-demo");
    metadata.put("version", "1.0.0");
    metadata.put("hostname", hostName);
    
    boolean registered = NacosConfig.registerInstance(serviceName, registryIp, serverPort, metadata);
    if (registered) {
        logger.info("服务已成功注册到Nacos: {}:{}", registryIp, serverPort);
    } else {
        logger.warn("服务注册到Nacos失败将继续运行但不提供服务注册");
    }
    

最佳实践

  1. 明确的端口分配

    • 主 API 服务: 8080 端口
    • 辅助诊断服务: 8081 端口
    • 避免在同一端口创建多个服务器实例
  2. 请求路由层次

    • Vert.x Router 处理初始 HTTP 请求
    • 将 API 路径请求传递给 Camel 处理
    • 保留直接处理路径用于诊断和健康检查
  3. 组件注册顺序

    • 先创建和配置 Vert.x 组件
    • 然后注册到 Camel 上下文
    • 最后启动 Camel 上下文
  4. 日志调试技巧

    • 记录服务器绑定状态和端口信息
    • 记录请求处理流程和路径
    • 使用不同详细级别区分常规和诊断信息
  5. Nacos服务注册

    • 确保在所有服务器和路由初始化完成后进行注册
    • 使用正确的IP地址避免使用0.0.0.0作为注册地址)
    • 添加适当的元数据帮助服务发现
    • 在应用程序关闭时正确注销服务

修改总结

  1. 创建显式的 Vert.x HTTP 服务器实例并直接绑定 Router
  2. 添加直接 API 测试路由,绕过 Camel 路由系统用于诊断
  3. 清理冗余的 HTTP 服务器实例,避免端口冲突
  4. 增强日志记录,特别是在请求处理和服务器绑定环节
  5. 启用 Nacos 服务注册,确保微服务可被发现

架构图

                                  ┌──────────────┐
                                  │ Nacos Server │
                                  └───────┬──────┘
                                          │
                                          │ 服务注册/发现
                                          ▼
Client Request
    │
    ▼
┌───────────────────────┐     ┌──────────────────────┐
│  Vert.x HTTP Server   │     │ Auxiliary HTTP Server│
│     (port 8080)       │     │     (port 8081)      │
└───────────┬───────────┘     └──────────────────────┘
            │                          │
            ▼                          ▼
┌───────────────────────┐     ┌──────────────────────┐
│     Vert.x Router     │     │   Direct Handlers    │
└───────────┬───────────┘     │    (Diagnostics)     │
            │                 └──────────────────────┘
            ▼
┌───────────────────────┐
│ Camel PlatformHttpRouter│
└───────────┬───────────┘
            │
            ▼
┌───────────────────────┐
│    Camel Context      │
│   (REST endpoints)     │
└───────────┬───────────┘
            │
            ▼
┌───────────────────────┐
│  Business Processing   │
│   (direct: routes)     │
└───────────────────────┘

调试检查清单

当遇到类似问题时,按以下顺序检查:

  1. 检查日志中的端口绑定消息,确认服务器启动状态
  2. 使用 netstat -ano | findstr "8080" 确认端口监听状态
  3. 测试基本连接性 curl -v http://localhost:8080/health
  4. 测试直接 API 路由 curl -v http://localhost:8080/api/direct-test
  5. 测试 Camel API 路由 curl -v http://localhost:8080/api/test
  6. 检查 Nacos 控制台查看服务是否成功注册 http://nacos-server:8848/nacos

记住:在使用 Camel+Vert.x 时HTTP 请求处理有两层 - Vert.x 作为前端接收请求,然后通过 PlatformHttpRouter 传递给 Camel 路由系统处理。确保这两层正确连接是关键。

Nacos服务注册常见问题

  1. IP注册问题确保不要将0.0.0.0注册到Nacos而应使用实际可访问的IP地址
  2. 权限问题如果Nacos启用了认证需要提供正确的用户名和密码
  3. 网络连接确保应用服务器可以访问Nacos服务器检查防火墙和网络路由
  4. 分组和命名空间:确认使用了正确的服务组和命名空间配置
  5. 心跳超时:检查心跳配置以确保服务不会被错误下线