在项目更新迭代中,新旧系统平台的数据无法互通共存,为了在不影响生产业务请求的情况下,需要寻找一种可以将业务请求镜像转发的功能组件,在通过前期考察以及功能测试后,nginx服务的ngx_http_mirror_module模块可以满足基本功能。

ngx_http_mirror_module模块通过在接收到用户请求后,将请求内容复制并发往配置的目标地址,达到“镜像”的效果。
该模块的核心工作流程是异步(并行)地把请求内容传递给目标地址的服务(不影响原始请求的响应),但需要在镜像出去的请求完成后才会输出nginx日志输出。

本片为闲云博客(lolicp.com)原创文章,请保留原文地址!

业务场景

新旧系统版本统称V1.0V2.0

业务系统在项目中存在重要作用,在升级至最终切换期间不能出现生产事故。

根据会议要求以及考虑现实情况,在V2.0版本部署完成后需要试运行一段时间(确保平台功能符合预期),试运行期间V1.0系统需要正常参与决策并返回V1.0系统的接口结果。

为了V2.0版本系统能够在试运行以及最终切换期间能够积攒业务数据,需要在nginx中根据业务场景配置相关规则,实现业务请求镜像转发以及特定场景下的业务自定义后端切换。

配置规则

负载均衡配置

前期项目中V1.0平台采用F5作为负载均衡,与Nginx不在一个业务区,而F5只存在一个VIP地址和端口。
而实际生产中万分之一的概率触发reset,导致接口返回502。

为了保障业务正常请求,防止访问F5出现502报错,需要在upstream中添加多行配置,重复的也可。

upstream lolicp_1_server {
    server 10.10.10.10:19090;
    server 10.10.10.10:19090;
}

upstream lolicp_2_server {
    least_conn;
    server 10.10.20.101:29090;
    server 10.10.20.102:29090;
}

业务规则

以下为实际业务配置,根据uri中的queryId选项值去匹配后端地址以及重定向的配置。

server {
    listen       18090;
    server_name  lolicp.com;
    error_log /lolicp/nginx/logs/ha_erros.log;
    access_log /lolicp/nginx/logs/ha_access.log upstreamlog;

    location /api/lolicp {
        set $ha_target 'lolicp_1_server';
        if ($arg_queryId = '554'){
            set $ha_target 'lolicp_2_server';
            rewrite ^(.*)$ /api/lolicp?typeId=lolicp&queryId=102&id=$arg_id? break;
        }
        proxy_set_header Host $host;
        proxy_pass $ha_target;
        mirror /mirror;
    }

    location /mirror {
        set $ha_c_target 'http://lolicp_2_server';
        if ($arg_queryId = '197130'){
            rewrite ^(.*)$ /api/lolicp?typeId=lolicp&queryId=2482&id=$arg_id? break;
        }
        if ($arg_queryId = '727'){
            rewrite ^(.*)$ /api/lolicp?typeId=lolicp&queryId=6524&id=$arg_id? break;
        }

        if ($arg_queryId = '102'){
            set $ha_target 'http://lolicp_1_server';
            rewrite ^(.*)$ /api/lolicp?typeId=lolicp&queryId=554&id=$arg_id? break;
        }

        error_log /lolicp/nginx/logs/ha_erros_2.log;
        access_log /lolicp/nginx/logs/ha_access_2.log;
        proxy_pass $ha_c_target;
    }
}
END

本文标题:[原创]项目中使用nginx实现业务请求镜像转发功能

本文作者:宇宙最帅的男人

本文链接:https://lolicp.com/nginx/202410725.html

版权声明:转载或者引用本文内容请注明来源及原作者,本文著作权归 (lolicp.com) 所有。

除非另有说明,本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议

最后修改:2024 年 11 月 14 日
如果觉得我的文章对你有用,请随意赞赏