NJet支持使用json格式的配置文件了
简介
目前 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 进行适配,能够实时更新全量配置