在项目更新迭代中,新旧系统平台的数据无法互通共存,为了在不影响生产业务请求的情况下,需要寻找一种可以将业务请求镜像转发的功能组件,在通过前期考察以及功能测试后,nginx服务的ngx_http_mirror_module模块可以满足基本功能。
ngx_http_mirror_module模块通过在接收到用户请求后,将请求内容复制并发往配置的目标地址,达到“镜像”的效果。
该模块的核心工作流程是异步(并行)地把请求内容传递给目标地址的服务(不影响原始请求的响应),但需要在镜像出去的请求完成后才会输出nginx日志输出。
本片为闲云博客(lolicp.com)原创文章,请保留原文地址!
业务场景
新旧系统版本统称V1.0
和V2.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;
}
}