写点什么

NJet 支持使用 json 格式的配置文件了

作者:通明湖
  • 2025-09-10
    北京
  • 本文字数:2505 字

    阅读完需:约 8 分钟

简介

目前 NJet 的配置文件与 Nginx 的配置文件格式相同。这种配置文件的格式对我们阅读比较友好。但是对一些自动化配置的需求来说,处理起来就很困难。为了以后能够对 NJet 的配置通过自动化工具来进行维护,NJet 增加了对 json 格式配置文件的支持。目前这种支持是很基本的,只是支持主配置文件为 json 格式,里面 include 的文件的格式还是与之前相同。

json 格式

目前 NJet 支持的 json 文件的配置格式如下,参考了开源项目https://github.com/nginxinc/crossplane中的格式,并做了一些修改。

最外层

parsed 的内容是一个数组,数组的每一项都是一个对象,这个对象对应着一条 NJet 命令,或者对应着一个 NJet 的 block。

{    "parsed":[     {},    ...    {} //每一个obj对应一条cmd或一个block    ],    "file": "/usr/local/njet/njet.conf" // 这是对应原有格式的配置文件,类似于description}
复制代码

一条指令

一条指令中包含两个键值,cmd 为一个字条串,对应的指令的名称,args 是一个数组,对应指令中的具体参数。


  {        "cmd": "error_log",        "args": [            "logs/error.log",            "debug"        ]    },    如果args为空,表明不需要参数
复制代码


一个 block 一个 block 中,有三个键值,其中 cmd 和 args 的含义与上面的指令是相同的,增加的 block 键值对应的是一个数组,数组的每一项又对应着一条指令或一个 block。


{  "cmd": "events",  "args": [],  "block": [ //里面又是 obj 数组,可以是cmd 或 block    {      "cmd": "worker_connections",      "args": [        "102400"      ]    }  ]},
复制代码

block 格式中有一些例外,就是 xxx_by_lua_block,这些 block 的格式与上面的通用格式不同,其 block 对应的数组中只有一个 obj, obj 的格式为{“code": “lua_code”}。

{  "cmd": "access_by_lua_block",  "args": [],  "block": [      {           "code": "\n              local ac=require(\"api_gateway.access.control\")\n              local access=ac.new(\"/api_gateway\")\n              access:check()\n           "      }  ]},
复制代码

实例

下面是一个 server 的配置

 server  {            listen 8443 ssl;       ssl_protocols       TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;       ssl_ciphers         AES128-SHA;              ssl_certificate     certs/rsa.cer;       ssl_certificate_key certs/rsa.pem;               location / {            return 200 "8443 ok";            }                                             location /api_gateway {                    access_by_lua_block {              local ac=require("api_gateway.access.control")                   local access=ac.new("/api_gateway")              access:check()              }                                 content_by_lua_block {                   local api_gateway=require("api_gateway")               api_gateway.main()            }       }  }
复制代码


对应的 json 配置

{    "cmd": "server",    "args": [
], "block": [ { "cmd": "listen", "args": [ "8443", "ssl" ] }, { "cmd": "ssl_protocols", "args": [ "TLSv1", "TLSv1.1", "TLSv1.2", "TLSv1.3" ] }, { "cmd": "ssl_ciphers", "args": [ "AES128-SHA" ] }, { "cmd": "ssl_certificate", "args": [ "certs/rsa.cer" ] }, { "cmd": "ssl_certificate_key", "args": [ "certs/rsa.pem" ] }, { "cmd": "location", "args": [ "/" ], "block": [ { "cmd": "return", "args": [ "200", "8443 ok" ] } ] }, { "cmd": "location", "args": [ "/api_gateway" ], "block": [ { "cmd": "access_by_lua_block", "args": [
], "block": [ { "code": "\n local ac=require(\"api_gateway.access.control\")\n local access=ac.new(\"/api_gateway\")\n access:check()\n " } ] }, { "cmd": "content_by_lua_block", "args": [
], "block": [ { "code": "\n local api_gateway=require(\"api_gateway\")\n api_gateway.main()\n " } ] } ] } ]}
复制代码

使用

NJet 从 3.3 版本开始支持 json 格式的配置文件,json 配置文件的使用与之前 NJet 的启动方式相同,在解析时,NJet 会先检查配置文件是否为 json 格式,并依据文件格式来执行相应的解析操作

./sbin/njet   -p . -c conf/njet_conf.json
复制代码

后续开发内容

  • 可以支持 json 与 njet 现有配置文件之间的互相 include,或者增加一个指令 include_json。

  • 支持对指定位置配置的查找,更新等。

  • 对现在的动态配置 API 进行适配,能够实时更新全量配置

发布于: 刚刚阅读数: 5
用户头像

通明湖

关注

让应用永远在线! 2022-10-13 加入

持续科技创新,信创应用交付领域的排头兵

评论

发布
暂无评论
NJet支持使用json格式的配置文件了_通明湖_InfoQ写作社区