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


                                                                                                                                                <span id="OSC_h3_1"></span> 

简介

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

json格式

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

最外层

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

{
    <span style="color:#f92672">"parsed"</span>:[ 
    {}<span style="background-color:#1e0010; color:#960050">,</span>
    <span style="background-color:#1e0010; color:#960050">...</span>
    {} <span style="color:#75715e">//每一个obj对应一条cmd或一个block
</span>    ],
    <span style="color:#f92672">"file"</span>: <span style="color:#e6db74">"/usr/local/njet/njet.conf"</span> <span style="color:#75715e">// 这是对应原有格式的配置文件,类似于description
</span>}

一条指令

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

      {
            <span style="color:#f92672">"cmd"</span>: <span style="color:#e6db74">"error_log"</span>,
            <span style="color:#f92672">"args"</span>: [
                <span style="color:#e6db74">"logs/error.log"</span>,
                <span style="color:#e6db74">"debug"</span>
            ]
        }<span style="background-color:#1e0010; color:#960050">,</span>
        <span style="background-color:#1e0010; color:#960050">如果args为空,表明不需要参数</span>

一个block

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

    {
      <span style="color:#f92672">"cmd"</span>: <span style="color:#e6db74">"events"</span>,
      <span style="color:#f92672">"args"</span>: [],
      <span style="color:#f92672">"block"</span>: [ <span style="color:#75715e">//里面又是 obj 数组,可以是cmd 或 block
</span>        {
          <span style="color:#f92672">"cmd"</span>: <span style="color:#e6db74">"worker_connections"</span>,
          <span style="color:#f92672">"args"</span>: [
            <span style="color:#e6db74">"102400"</span>
          ]
        }
      ]
    }<span style="background-color:#1e0010; color:#960050">,</span>

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

{
  <span style="color:#f92672">"cmd"</span>: <span style="color:#e6db74">"access_by_lua_block"</span>,
  <span style="color:#f92672">"args"</span>: [],
  <span style="color:#f92672">"block"</span>: [
      {
           <span style="color:#f92672">"code"</span>: <span style="color:#e6db74">"\n              local ac=require(\"api_gateway.access.control\")\n              local access=ac.new(\"/api_gateway\")\n              access:check()\n           "</span>
      }
  ]
}<span style="background-color:#1e0010; color:#960050">,</span>

实例

下面是一个server的配置

 server  <span style="color:#f92672">{</span>     
       listen <span style="color:#ae81ff">8443</span> 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 / <span style="color:#f92672">{</span> 
           <span style="color:#66d9ef">return</span> <span style="color:#ae81ff">200</span> <span style="color:#e6db74">"8443 ok"</span>;     
       <span style="color:#f92672">}</span> 

       location /api_gateway <span style="color:#f92672">{</span>         
           access_by_lua_block <span style="color:#f92672">{</span>
              local ac<span style="color:#f92672">=</span>require<span style="color:#f92672">(</span>
<span style="color:#e6db74">"api_gateway.access.control"</span>
<span style="color:#f92672">)</span>     
              local access<span style="color:#f92672">=</span>ac.new<span style="color:#f92672">(</span>
<span style="color:#e6db74">"/api_gateway"</span>
<span style="color:#f92672">)</span>
              access:check<span style="color:#f92672">()</span>   
           <span style="color:#f92672">}</span>

           content_by_lua_block <span style="color:#f92672">{</span>     
              local api_gateway<span style="color:#f92672">=</span>require<span style="color:#f92672">(</span>
<span style="color:#e6db74">"api_gateway"</span>
<span style="color:#f92672">)</span> 
              api_gateway.main<span style="color:#f92672">()</span> 
           <span style="color:#f92672">}</span> 
      <span style="color:#f92672">}</span>
  <span style="color:#f92672">}</span>

对应的json配置

{
    <span style="color:#f92672">"cmd"</span>: <span style="color:#e6db74">"server"</span>,
    <span style="color:#f92672">"args"</span>: [

    ],
    <span style="color:#f92672">"block"</span>: [
        {
            <span style="color:#f92672">"cmd"</span>: <span style="color:#e6db74">"listen"</span>,
            <span style="color:#f92672">"args"</span>: [
                <span style="color:#e6db74">"8443"</span>,
                <span style="color:#e6db74">"ssl"</span>
            ]
        },
        {
            <span style="color:#f92672">"cmd"</span>: <span style="color:#e6db74">"ssl_protocols"</span>,
            <span style="color:#f92672">"args"</span>: [
                <span style="color:#e6db74">"TLSv1"</span>,
                <span style="color:#e6db74">"TLSv1.1"</span>,
                <span style="color:#e6db74">"TLSv1.2"</span>,
                <span style="color:#e6db74">"TLSv1.3"</span>
            ]
        },
        {
            <span style="color:#f92672">"cmd"</span>: <span style="color:#e6db74">"ssl_ciphers"</span>,
            <span style="color:#f92672">"args"</span>: [
                <span style="color:#e6db74">"AES128-SHA"</span>
            ]
        },
        {
            <span style="color:#f92672">"cmd"</span>: <span style="color:#e6db74">"ssl_certificate"</span>,
            <span style="color:#f92672">"args"</span>: [
                <span style="color:#e6db74">"certs/rsa.cer"</span>
            ]
        },
        {
            <span style="color:#f92672">"cmd"</span>: <span style="color:#e6db74">"ssl_certificate_key"</span>,
            <span style="color:#f92672">"args"</span>: [
                <span style="color:#e6db74">"certs/rsa.pem"</span>
            ]
        },
        {
            <span style="color:#f92672">"cmd"</span>: <span style="color:#e6db74">"location"</span>,
            <span style="color:#f92672">"args"</span>: [
                <span style="color:#e6db74">"/"</span>
            ],
            <span style="color:#f92672">"block"</span>: [
                {
                    <span style="color:#f92672">"cmd"</span>: <span style="color:#e6db74">"return"</span>,
                    <span style="color:#f92672">"args"</span>: [
                        <span style="color:#e6db74">"200"</span>,
                        <span style="color:#e6db74">"8443 ok"</span>
                    ]
                }
            ]
        },
        {
            <span style="color:#f92672">"cmd"</span>: <span style="color:#e6db74">"location"</span>,
            <span style="color:#f92672">"args"</span>: [
                <span style="color:#e6db74">"/api_gateway"</span>
            ],
            <span style="color:#f92672">"block"</span>: [
                {
                    <span style="color:#f92672">"cmd"</span>: <span style="color:#e6db74">"access_by_lua_block"</span>,
                    <span style="color:#f92672">"args"</span>: [

                    ],
                    <span style="color:#f92672">"block"</span>: [
                        {
                            <span style="color:#f92672">"code"</span>: <span style="color:#e6db74">"\n              local ac=require(\"api_gateway.access.control\")\n              local access=ac.new(\"/api_gateway\")\n              access:check()\n           "</span>
                        }
                    ]
                },
                {
                    <span style="color:#f92672">"cmd"</span>: <span style="color:#e6db74">"content_by_lua_block"</span>,
                    <span style="color:#f92672">"args"</span>: [

                    ],
                    <span style="color:#f92672">"block"</span>: [
                        {
                            <span style="color:#f92672">"code"</span>: <span style="color:#e6db74">"\n              local api_gateway=require(\"api_gateway\")\n              api_gateway.main()\n           "</span>
                        }
                    ]
                }
            ]
        }
    ]
}

使用

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

<span style="background-color:#1e0010; color:#960050">./sbin/njet</span>   <span style="background-color:#1e0010; color:#960050">-p</span> <span style="background-color:#1e0010; color:#960050">.</span> <span style="background-color:#1e0010; color:#960050">-c</span> <span style="background-color:#1e0010; color:#960050">conf/njet_conf.json</span> 

后续开发内容

  • 可以支持json与njet现有配置文件之间的互相include,或者增加一个指令include_json。
  • 支持对指定位置配置的查找,更新等。
  • 对现在的动态配置API进行适配,能够实时更新全量配置
                                                                                </div>



Source link

未经允许不得转载:紫竹林-程序员中文网 » NJet支持使用json格式的配置文件了

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
关于我们 免责申明 意见反馈 隐私政策
程序员中文网:公益在线网站,帮助学习者快速成长!
关注微信 技术交流
推荐文章
每天精选资源文章推送
推荐文章
随时随地碎片化学习
推荐文章
发现有趣的