iPaaS文档库 iPaaS文档库
00 概述
01 产品安装指南
02 快速入门指南
03 Studio使用指南
04 iPaaS使用指南
05 高级配置指南
06 接口服务说明
07 升级&数据迁移指南
08 产品集成指南
09 FAQ
10 iPaaS上线指南
运维指南
  • 接口重发失败或重发无记录问题
  • 1、接口重发报错:“没找到主机路由”,导致重发失败
  • 问题现象
  • 问题分析
  • 解决方案
  • 2、接口失败重发成功,但是没有日志记录
  • 问题现象
  • 问题分析
  • 解决方案
  • 验证方法

# 接口重发失败或重发无记录问题

# 1、接口重发报错:“没找到主机路由”,导致重发失败

# 问题现象

在IPAAS 910版本集成平台中,出现以下异常现象:

  • 接口调用偶发超时:某个业务接口在正常运行时能够调通,但偶尔出现超时、或者业务异常导致失败的情况;
  • 失败记录进入“失败重发”列表:超时的接口调用记录被系统记录到失败重发列表;
  • 重发时路由错误:在进行失败重发操作时,portal组件报错“没找到主机路由”,导致重发失败。

# 问题分析

# 根本原因

问题的根源在于重发时使用的URL与原始请求URL不一致:

  1. 原始请求路径:业务系统在调用接口时,使用的是完整的服务地址,包含端口信息(如http://example.com:9091/api/service)

  2. Nginx转发处理:请求经过Nginx代理转发时,Nginx在记录请求信息时,$tip_real_url变量中没有携带端口信息(变为http://example.com/api/service)

  3. 重发机制:

    • 失败重发机制是基于$tip_real_url变量记录的地址进行重发
    • 由于$tip_real_url给到ipaas时丢失了端口信息(9091),重发时使用没有端口的URL
    • portal根据不完整的URL找不到到对应的接口,因此报错“没找到主机路由”

# 配置问题

# Nginx配置问题点
# 原配置中$tip_real_url变量没有包含端口信息
location /api/ {
    proxy_pass http://backend_service;
    # 缺失端口信息的配置
    proxy_set_header Host $host;
}

# 解决方案

# 修复方法

在Nginx配置中,修改$host的配置,确保端口信息被正确传递:

# 修改前
proxy_set_header Host $host;

# 修改后 - 添加端口信息
proxy_set_header Host $host:9091;
# 或者动态获取端口
proxy_set_header Host $host:$server_port;

# 验证配置文件语法
nginx -t

# 平滑重启Nginx
nginx -s reload

# 验证方法

  • 测试接口调用:确认业务接口仍能正常调用

  • 模拟超时场景:触发失败重发机制,验证重发时URL是否包含端口

  • 检查日志:查看portal日志,确认不再出现“没找到主机路由”错误


# 2、接口失败重发成功,但是没有日志记录

# 问题现象

失败重发机制出现以下异常:

  • 重发功能正常:失败交易能够触发重发机制,接口调用成功
  • 记录缺失:重发后无法查看重发记录和重发次数信息
  • 配置已开启:已开启记录报文体和监控调用链功能,但重发信息仍未记录

# 问题分析

# 根本原因

问题的根源在于重发请求的标识参数被Nginx过滤:

  1. 重发标识机制:失败重发时,系统会在请求头中自动增加一个特殊参数esb_fail_cid,用于标记该请求是失败交易重发

  2. Nginx过滤处理:Nginx默认配置可能会过滤掉非标准的请求头参数,导致esb_fail_cid参数在请求传递过程中丢失

  3. 记录机制失效:

    • 重发记录和次数统计依赖于esb_fail_cid参数进行识别和关联
    • 由于该参数被Nginx过滤,后端系统无法识别该请求是重发请求
    • 因此无法生成重发记录和统计重发次数

# 关键代码/配置问题

# Nginx配置问题点
# 默认配置可能过滤了非标准请求头
location /api/ {
    proxy_pass http://backend_service;
    # 缺少对esb_fail_cid等自定义请求头的放行配置
}

# 解决方案

# 修复方法

在Nginx配置中,显式配置允许传递自定义请求头参数,确保esb_fail_cid不被过滤:

# 修改前 - 可能过滤自定义头
proxy_pass http://backend_service;

# 修改后 - 显式允许传递自定义头
http {
    # 在http块中配置允许下划线请求头
    underscores_in_headers on;
    
    server {
        listen 80;
        server_name example.com;
        
        location /api/ {
            proxy_pass http://backend_service;
            # 无需显式设置,所有请求头都会被传递
            proxy_pass_request_headers on;
        }
    }
}

# 验证配置并重启Nginx

# 验证配置文件语法
nginx -t

# 平滑重启Nginx
nginx -s reload

# 验证方法

  • 触发重发场景:模拟失败交易,触发重发机制

  • 检查请求头:使用抓包工具或日志查看重发请求是否携带esb_fail_cid参数

  • 查看调用日志:检查重发记录和重发次数是否正确生成

← 接口调用请求头参数传递问题 ES中无数据或数据不完整 →