动态map_创建自定义变量

By 洪昕 2023-09-15

动态Map 配置

1.1 功能说明

NJet配置文件中的map指令,可以在请求处理期间创建变量,并根据指定的键值对映射关系进行值的映射。map 指令可以用于许多场景,例如根据请求的路径生成重写规则、根据请求头判断是否启用缓存、根据查询参数配置不同的后端服务等。NJet 提供动态修改map指令中键值的映射关系,不需要重新加载或重启NJet实例。本文中将演示根据查询参数配置不同后端服务的场景。

1.2 配置说明

Map 指令的详细描述可参照nginx 文档: http://nginx.org/en/docs/http/ngx_http_map_module.html#map

map 指令的语法如下:

map $variable $new_variable {
    key value;
    key value;
    ...
    default value;
}


基础配置如下:

njet.conf

worker_processes auto;
cluster_name njet;
node_name node1;
error_log logs/error.log error;

helper ctrl modules/njt_helper_ctrl_module.so conf/njet_ctrl.conf;
helper broker modules/njt_helper_broker_module.so;

load_module modules/njt_http_location_module.so;
load_module modules/njt_http_vtsc_module.so;
load_module modules/njt_http_dyn_map_module.so;

events {
    worker_connections  1024;
}

http {
    map $arg_service $backend_svr {
       default "127.0.0.1:18081";
    }

    include mime.types;
    server {
        listen       8080;
        location / {
           proxy_pass http://$backend_svr;
        }
    }

    server {
        listen 18081;
        return 200 "default service 18081\n";
    }
}

ctrl.conf

load_module modules/njt_http_sendmsg_module.so;
load_module modules/njt_ctrl_config_api_module.so; 
load_module modules/njt_helper_health_check_module.so;
load_module modules/njt_http_upstream_api_module.so; 
load_module modules/njt_http_location_api_module.so;
load_module modules/njt_doc_module.so;
load_module modules/njt_http_vtsd_module.so;

error_log logs/error_ctrl.log error;

events {
    worker_connections  1024;
}

http {
    include mime.types;
    access_log off;
    server {
        listen       8081;
        keepalive_timeout 0;

        location / {
            return 200 "njet control panel\n";
        }
        location /hc {
            health_check_api;
        }
        
        location /api {
             api write=on;
        }
        
        location /kv {
            dyn_sendmsg_kv;
        }
        
        location /config {
            config_api;
        }
        
        location /doc {
            doc_api;
        }
        location /dyn_loc {
           dyn_location_api;
        }
  
        location /metrics {
            vhost_traffic_status_display;
            vhost_traffic_status_display_format html;
        }
    }
}

1.3 验证及执行效果

配置中,将根据url 参数service的值进行映射,初始配置中,只设置了默认映射值 “127.0.0.1:18081”, 不管参数service 如何设置,所有的请求都将访问这个默认服务。

img

通过控制平面的动态配置API /config/2/config/http_dyn_map, 可以查看当前的map 配置

img

使用控制平面的动态配置API,添加Map 的映射值

img

img

使用控制平面的动态配置API,再次添加Map 的映射值

img

img

从上面的示例可以看到,通过动态Map的配置能力,可以对映射关系进行调整。