{"id":5,"date":"2021-04-22T16:05:59","date_gmt":"2021-04-22T08:05:59","guid":{"rendered":"https:\/\/blog.king011.com\/?p=5"},"modified":"2021-04-23T12:17:30","modified_gmt":"2021-04-23T04:17:30","slug":"%e9%85%8d%e7%bd%ae%e6%aa%94%e6%a1%88-%e5%84%aa%e7%bc%ba%e9%bb%9e%e6%af%94%e8%bc%83-jsonnet-yaml-json-ini-xml","status":"publish","type":"post","link":"https:\/\/blog.king011.com\/?p=5","title":{"rendered":"\u914d\u7f6e\u6a94\u6848 \u512a\u7f3a\u9ede\u6bd4\u8f03 Jsonnet YAML JSON INI XML"},"content":{"rendered":"\n<p>\u7de8\u5beb\u670d\u52d9\u7aef\u7a0b\u5f0f\u901a\u5e38\u90fd\u9700\u8981\u4e00\u7d44\u914d\u7f6e\u6a94\u6848\u4f86\u8a2d\u5b9a\u7a0b\u5f0f\u5404\u7a2e\u7d30\u7bc0\uff0c\u672c\u55b5\u7d93\u6b77\u4e86 INI XML JSON YAML \u4ee5\u53ca\u76ee\u524d\u4f7f\u7528Jsonnet\uff0c\u672c\u6587\u5206\u6790\u4e86\u672c\u55b5\u5728\u4f7f\u7528\u9019\u4e9b\u683c\u5f0f\u9047\u5230\u7684\u554f\u984c\u4ee5\u53ca\u5b83\u7684\u512a\u9ede\u3002<\/p>\n\n\n\n<p>\u76ee\u524d\u672c\u55b5\u5c07\u9019\u4e9b\u683c\u5f0f\u5206\u7232\u4e09\u7d44\uff0c\u540c\u4e00\u7d44\u5167\u7684\u683c\u5f0f\u5728\u672c\u55b5\u770b\u4f86\u5be6\u7528\u6027\u5dee\u4e0d\u591a<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>S -&gt; Jsonnet -&gt; \u53ef\u4ee5\u540c\u6642\u61c9\u4ed8\u8907\u96dc\u548c\u7c21\u55ae\u7684\u60c5\u6cc1<\/li><li>A -&gt; YAML INI -&gt; \u80fd\u5920\u5f88\u597d\u7684\u8655\u7406\u7c21\u55ae\u60c5\u6cc1<\/li><li>B -&gt; JSON XML -&gt;  \u4e0d\u61c9\u8a72\u4f7f\u7528<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">JSON XML<\/h2>\n\n\n\n<p>\u79c9\u7740\u5f9e\u6b21\u5230\u597d\u7684\u9806\u5e8f\u9996\u5148\u4f86\u770b\u4e0b B\u7d44 \u7684 JSON \u548c XML<\/p>\n\n\n\n<p>\u4f5c\u7232\u914d\u7f6e\u6a94\u6848 JSON \u548c XML \u6709\u540c\u6a23\u7684\u554f\u984c\uff0c\u7de8\u5beb\u9ebb\u7169\u53ef\u8b80\u6027\u5deeXML\u554f\u984c\u5c24\u5176\u56b4\u91cd\uff0c\u5c0d\u65bcXML\u4f60\u8981\u4e0d\u65b7\u7684\u5beb\u958b\u59cbtag\u548c\u7d50\u675ftag\uff0c\u7279\u5225\u662f\u5728\u914d\u7f6e\u4e00\u500b\u6578\u7d44\u5143\u7d20\u6642\u6b63\u5e38\u8c93\u54aa\u90fd\u61c9\u8a72\u6703\u5d29\u6f70\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;server&gt;\n        &lt;listen&gt;:8080&lt;\/listen&gt;\n        &lt;host&gt;\n                &lt;value&gt;xxx.com&lt;\/value&gt;\n                &lt;value&gt;www.xxx.com&lt;\/value&gt;\n                &lt;value&gt;code.xxx.com&lt;\/value&gt;\n        &lt;\/host&gt;\n&lt;\/server&gt;<\/code><\/pre>\n\n\n\n<p>\u6240\u6709\u7684\u5c6c\u6027\u4f60\u9700\u8981\u66f8\u5beb\u5169\u6b21\uff0c\u800c\u4e14\u9700\u8981\u4fdd\u8b49\u7d50\u675ftag\u548c\u958b\u59cbtag\u5c0d\u61c9\uff0c\u540c\u6642\u5728\u66f8\u5beb\u6578\u7d44\u6642\u5c24\u5176\u611a\u8822\u3002\u6545XML\u662f\u672c\u55b5\u6df1\u60e1\u75db\u7d55\u6975\u529b\u53cd\u5c0d\u7684\u4e00\u7a2e\u683c\u5f0f\u3002<\/p>\n\n\n\n<p>JSON \u76f8\u5c0d XML \u6709\u4e00\u9ede\u9032\u6b65 \u985e\u4f3c\u7684\u914d\u7f6e\u53ef\u80fd\u9577\u9019\u6a23\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n    \"server\":\":8080\",\n    \"host\":&#91;\n        \"xxx.com\",\n        \"www.xxx.com\",\n        \"code.xxx.com\"\n    ]\n}<\/code><\/pre>\n\n\n\n<p>\u548c XML \u6bd4\u8d77\u4f86\u7c21\u55ae\u8a31\u591a\uff0c\u4f46\u554f\u984c\u4f9d\u7136\u5f88\u591a\uff0c\u9700\u8981\u5beb\u5927\u91cf\u7684\u5f15\u865f\u6240\u6709\u5c6c\u6027\u540d\u9700\u8981\u7528\u5f15\u865f\u64f4\u8d77\u4f86\uff0c\u540c\u6642Array\u548cObject\u7d50\u5c3e\u4e0d\u80fd\u6709\u9017\u865f\uff0c\u7576\u7136\u9084\u6709\u6700\u7232\u88ab\u4eba\u8a6c\u75c5\u7684 JSON \u4e0d\u652f\u6301\u8a3b\u91cb\u53ea\u6191\u9019\u4e00\u689d\u5c31\u61c9\u8a72\u653e\u68c4 JSON \u4f5c\u7232\u914d\u7f6e\u6a94\u6848\u3002<\/p>\n\n\n\n<p>\u901a\u5e38\u4f60\u4e0d\u61c9\u8a72\u9078\u64c7 JSON \u548c XML \u4f5c\u7232\u81ea\u5df1\u7684\u914d\u7f6e\u683c\u5f0f\uff0c\u56e0\u7232\u5373\u4f7f\u7c21\u55ae\u7684\u914d\u7f6e JSON XML \u4e5f\u9700\u8981\u66f8\u5beb\u8a31\u591a\u984d\u5916\u8ca0\u64d4\uff0c\u5c0d\u65bc\u8907\u96dc\u7684\u60c5\u6cc1\u66f4\u662f\u53ea\u6703\u8b93\u4e8b\u60c5\u8b8a\u5f97\u4e00\u5718\u7cdf\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">YAML INI<\/h2>\n\n\n\n<p>INI \u5c0d\u65bc\u7c21\u55ae\u7684\u60c5\u6cc1\u61c9\u4ed8\u8d77\u4f86\u904a\u5203\u6709\u9918\u4f46\u8868\u73fe\u529b\u4e0d\u8db3\u7121\u6cd5\u61c9\u4ed8\u8907\u96dc\u7684\u60c5\u6cc1\uff0c\u4ee5\u4e0a\u6587\u7684\u914d\u7f6e\u4f8b\u5b50 INI \u53ef\u80fd\u9577\u9019\u6a23\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;server]\nlisten=:8080\nhost=xxx.com www.xxx.com code.xxx.com<\/code><\/pre>\n\n\n\n<p>\u6e05\u723d\u5f88\u591a\uff0c\u6216\u8a31\u5c0d\u65bc\u7c21\u55ae\u914d\u7f6e\u9019\u8db3\u4ee5\u61c9\u4ed8\u4e86\uff0c\u4f46\u554f\u984c\u5728\u65bcINI\u662f\u5217\u8868\u5f62\u5f0f(section \u5217\u8868)\u5982\u679c\u8981\u8868\u73fe\u6a39\u5f62\u7d50\u69cb\u5c31\u5f88\u5f46\u626d\uff0c\u6bd4\u5982\u4f60\u9084\u6709\u4e00\u500b\u6578\u64da\u5eab\u914d\u7f6e\u7684section\u4e26\u4e14\u5728\u88cf\u9762\u8a73\u7d30\u914d\u7f6e\u7de9\u5b58\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;server]\nlisten=:8080\nhost=xxx.com www.xxx.com code.xxx.com\n\n&#91;db]\ndriver=mysql\nconnect=xxx\n# \u914d\u7f6e\u9023\u63a5\u6c60\npool.max=10\npool.idle=1\n# \u914d\u7f6e\u7de9\u5b58\ncache.backend=memory\ncache.max=100\ncache.algorithm=lru<\/code><\/pre>\n\n\n\n<p>\u4f60\u4e0d\u5f97\u4e0d\u4f7f\u7528\u5b57\u7b26\u4e32\u66ff\u4ee3\u6a39\u7d50\u69cb\uff0c\u4f46\u9019\u6a23\u6bcf\u6b21\u66f8\u5beb\u914d\u7f6e\u6642\u90fd\u8981\u91cd\u8907\u5beb\u524d\u7db4\uff0c\u540c\u6642INI\u4e5f\u4e0d\u652f\u6301\u6578\u7d44\u6240\u4ee5\u9700\u8981\u4f7f\u7528\u5b57\u7b26\u4e32\u7528\u5206\u9694\u7b26\u9694\u958b\u800c\u5728\u7a0b\u5f0f\u4e2d\u81ea\u5df1\u5207\u5206\u5b57\u7b26\u4e32\u3002\u9019\u4e9b\u554f\u984c\u5c0e\u81f4\u53ea\u5728\u60c5\u6cc1\u7279\u5225\u7c21\u55ae\u6642\u672c\u55b5\u624d\u63a8\u85a6\u4f7f\u7528INI\u3002<\/p>\n\n\n\n<p>YAML \u662f\u672c\u55b5\u89ba\u5f97\u5c1a\u53ef\u7684\u4e00\u7a2e\u914d\u7f6e\u683c\u5f0f\uff0c\u4f46\u7db2\u8def\u4e0a\u4f3c\u4e4e\u5c0d\u5b83\u904e\u65bc\u8a87\u5927\u4e86\uff0c\u5148\u4f86\u770b\u4e0b\u5c0d\u65bc\u4e0a\u9762INI\u7684\u914d\u7f6eYAML\u53ef\u4ee5\u9019\u6a23\u5beb\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>server:\n  listen: :8080\n  host: &#91;xxx.com, www.xxx.com, code.xxx.com]\ndb:\n  driver: mysql\n  connect: xxx\n  pool:\n    max: 10\n    idle: 1\n  cache:\n    backend: memory\n    max: 100\n    algorithm: lru\n<\/code><\/pre>\n\n\n\n<p>\u521d\u770b\u8d77\u4f86\u53ef\u8b80\u6027\u5f88\u597d\u7de8\u8f2f\u5bb9\u6613\u800c\u4e14\u8868\u9054\u80fd\u529b\u8c50\u5bcc\uff0c\u5c0d\u65bc\u7c21\u55ae\u7684\u914d\u7f6e\u78ba\u5be6\u5982\u6b64\uff0c\u6545\u800c\u5982\u679c\u6c92\u6709\u66f4\u597d\u7684\u65b9\u6848(\u6bd4\u5982 JSonnet )\u4e00\u4e9b\u7c21\u55ae\u7684\u914d\u7f6e\u4f7f\u7528 YAML \u672c\u55b5\u8a8d\u7232\u662f\u5408\u9069\u7684\u3002\u4f46\u662f YAML \u4e26\u4e0d\u50cf\u7db2\u8def\u50b3\u8aaa\u4e2d\u90a3\u9ebc\u7f8e\u597d\uff0c\u7576\u914d\u7f6e\u8b8a\u5f97\u8907\u96dc\u6642\u4e00\u5806\u554f\u984c\u6703\u8b93\u4f60\u5d29\u6f70\u3002<\/p>\n\n\n\n<p>\u9996\u5148 YAML \u4f7f\u7528\u7e2e\u9032 \u7576\u4f60\u6a39\u7d50\u69cb\u5f88\u6df1\u6642\u53ef\u8b80\u6027\u5c31\u662f\u7b11\u8a71\u770b\u4e0b\u9762\u9019\u500b k8s \u5b98\u65b9\u793a\u4f8b\u7d66\u51fa\u7684\u914d\u7f6e\u4f60\u80fd\u53ea\u6191\u85c9 YAML \u7684\u53ef\u8b80\u6027\u5f88\u5bb9\u6613\u8b58\u5225\u51fa\u4f86\u6a39\u5f62\u7d50\u69cb\u8ab0\u662f\u8ab0\u7684\u5c6c\u6027\u55ce\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>apiVersion: apps\/v1\nkind: StatefulSet\nmetadata:\n  name: mysql\nspec:\n  selector:\n    matchLabels:\n      app: mysql\n  serviceName: mysql\n  replicas: 3\n  template:\n    metadata:\n      labels:\n        app: mysql\n    spec:\n      initContainers:\n      - name: init-mysql\n        image: mysql:5.7\n        command:\n        - bash\n        - \"-c\"\n        - |\n          set -ex\n          # Generate mysql server-id from pod ordinal index.\n          &#91;&#91; `hostname` =~ -(&#91;0-9]+)$ ]] || exit 1\n          ordinal=${BASH_REMATCH&#91;1]}\n          echo &#91;mysqld] &gt; \/mnt\/conf.d\/server-id.cnf\n          # Add an offset to avoid reserved server-id=0 value.\n          echo server-id=$((100 + $ordinal)) &gt;&gt; \/mnt\/conf.d\/server-id.cnf\n          # Copy appropriate conf.d files from config-map to emptyDir.\n          if &#91;&#91; $ordinal -eq 0 ]]; then\n            cp \/mnt\/config-map\/master.cnf \/mnt\/conf.d\/\n          else\n            cp \/mnt\/config-map\/slave.cnf \/mnt\/conf.d\/\n          fi          \n        volumeMounts:\n        - name: conf\n          mountPath: \/mnt\/conf.d\n        - name: config-map\n          mountPath: \/mnt\/config-map\n      - name: clone-mysql\n        image: gcr.io\/google-samples\/xtrabackup:1.0\n        command:\n        - bash\n        - \"-c\"\n        - |\n          set -ex\n          # Skip the clone if data already exists.\n          &#91;&#91; -d \/var\/lib\/mysql\/mysql ]] &amp;&amp; exit 0\n          # Skip the clone on master (ordinal index 0).\n          &#91;&#91; `hostname` =~ -(&#91;0-9]+)$ ]] || exit 1\n          ordinal=${BASH_REMATCH&#91;1]}\n          &#91;&#91; $ordinal -eq 0 ]] &amp;&amp; exit 0\n          # Clone data from previous peer.\n          ncat --recv-only mysql-$(($ordinal-1)).mysql 3307 | xbstream -x -C \/var\/lib\/mysql\n          # Prepare the backup.\n          xtrabackup --prepare --target-dir=\/var\/lib\/mysql          \n        volumeMounts:\n        - name: data\n          mountPath: \/var\/lib\/mysql\n          subPath: mysql\n        - name: conf\n          mountPath: \/etc\/mysql\/conf.d\n      containers:\n      - name: mysql\n        image: mysql:5.7\n        env:\n        - name: MYSQL_ALLOW_EMPTY_PASSWORD\n          value: \"1\"\n        ports:\n        - name: mysql\n          containerPort: 3306\n        volumeMounts:\n        - name: data\n          mountPath: \/var\/lib\/mysql\n          subPath: mysql\n        - name: conf\n          mountPath: \/etc\/mysql\/conf.d\n        resources:\n          requests:\n            cpu: 500m\n            memory: 1Gi\n        livenessProbe:\n          exec:\n            command: &#91;\"mysqladmin\", \"ping\"]\n          initialDelaySeconds: 30\n          periodSeconds: 10\n          timeoutSeconds: 5\n        readinessProbe:\n          exec:\n            # Check we can execute queries over TCP (skip-networking is off).\n            command: &#91;\"mysql\", \"-h\", \"127.0.0.1\", \"-e\", \"SELECT 1\"]\n          initialDelaySeconds: 5\n          periodSeconds: 2\n          timeoutSeconds: 1\n      - name: xtrabackup\n        image: gcr.io\/google-samples\/xtrabackup:1.0\n        ports:\n        - name: xtrabackup\n          containerPort: 3307\n        command:\n        - bash\n        - \"-c\"\n        - |\n          set -ex\n          cd \/var\/lib\/mysql\n\n          # Determine binlog position of cloned data, if any.\n          if &#91;&#91; -f xtrabackup_slave_info &amp;&amp; \"x$(&lt;xtrabackup_slave_info)\" != \"x\" ]]; then\n            # XtraBackup already generated a partial \"CHANGE MASTER TO\" query\n            # because we're cloning from an existing slave. (Need to remove the tailing semicolon!)\n            cat xtrabackup_slave_info | sed -E 's\/;$\/\/g' &gt; change_master_to.sql.in\n            # Ignore xtrabackup_binlog_info in this case (it's useless).\n            rm -f xtrabackup_slave_info xtrabackup_binlog_info\n          elif &#91;&#91; -f xtrabackup_binlog_info ]]; then\n            # We're cloning directly from master. Parse binlog position.\n            &#91;&#91; `cat xtrabackup_binlog_info` =~ ^(.*?)&#91;&#91;:space:]]+(.*?)$ ]] || exit 1\n            rm -f xtrabackup_binlog_info xtrabackup_slave_info\n            echo \"CHANGE MASTER TO MASTER_LOG_FILE='${BASH_REMATCH&#91;1]}',\\\n                  MASTER_LOG_POS=${BASH_REMATCH&#91;2]}\" &gt; change_master_to.sql.in\n          fi\n\n          # Check if we need to complete a clone by starting replication.\n          if &#91;&#91; -f change_master_to.sql.in ]]; then\n            echo \"Waiting for mysqld to be ready (accepting connections)\"\n            until mysql -h 127.0.0.1 -e \"SELECT 1\"; do sleep 1; done\n\n            echo \"Initializing replication from clone position\"\n            mysql -h 127.0.0.1 \\\n                  -e \"$(&lt;change_master_to.sql.in), \\\n                          MASTER_HOST='mysql-0.mysql', \\\n                          MASTER_USER='root', \\\n                          MASTER_PASSWORD='', \\\n                          MASTER_CONNECT_RETRY=10; \\\n                        START SLAVE;\" || exit 1\n            # In case of container restart, attempt this at-most-once.\n            mv change_master_to.sql.in change_master_to.sql.orig\n          fi\n\n          # Start a server to send backups when requested by peers.\n          exec ncat --listen --keep-open --send-only --max-conns=1 3307 -c \\\n            \"xtrabackup --backup --slave-info --stream=xbstream --host=127.0.0.1 --user=root\"          \n        volumeMounts:\n        - name: data\n          mountPath: \/var\/lib\/mysql\n          subPath: mysql\n        - name: conf\n          mountPath: \/etc\/mysql\/conf.d\n        resources:\n          requests:\n            cpu: 100m\n            memory: 100Mi\n      volumes:\n      - name: conf\n        emptyDir: {}\n      - name: config-map\n        configMap:\n          name: mysql\n  volumeClaimTemplates:\n  - metadata:\n      name: data\n    spec:\n      accessModes: &#91;\"ReadWriteOnce\"]\n      resources:\n        requests:\n          storage: 10Gi\n<\/code><\/pre>\n\n\n\n<p>\u4f60\u80fd\u660e\u78ba\u770b\u51fa\u4f86 volumeClaimTemplates \u662f\u8ab0\u7684\u5c6c\u6027\u55ce\uff1f\u6216\u8005\u5728 volumeClaimTemplates \u4e0d\u5b58\u5728\u6642\u6e05\u695a\u77e5\u9053\u8981\u7e2e\u9032\u591a\u5c11\u7a7a\u683c\u4f86\u6dfb\u52a0 volumeClaimTemplates\uff1f<\/p>\n\n\n\n<p>\u6545\u800c\u672c\u55b5\u8a8d\u7232\u53ea\u5728\u7c21\u55ae\u60c5\u6cc1\u4e0b\u4f7f\u7528 INI \u548c YAML\u3002<\/p>\n\n\n\n<p>k8s \u4f7f\u7528\u4e86 YAML \u4f46\u60c5\u6cc1\u5f88\u8907\u96dc\uff0c\u6240\u4ee5 google \u548c\u7b2c\u4e09\u65b9\u624d\u63a8\u51fa\u4e86\u5404\u7a2e\u6a21\u677f\u63d2\u4ef6\u4f86\u66ff\u4ee3\u76f4\u63a5\u66f8\u5beb\u539f\u59cb YAML \u5982\u679c\u4f60\u6253\u7b97\u7232\u81ea\u5df1\u7684\u914d\u7f6e\u6a94\u6848\u518d\u958b\u767c\u4e00\u5957\u6a21\u677f\u63d2\u4ef6\u4f86\u751f\u6210 YAML \u8acb\u7121\u8996\u672c\u55b5\u7684\u5fe0\u544a\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Jsonnet<\/h2>\n\n\n\n<p>\u5728 Jsonnet \u524d\u672c\u55b5\u6709\u4f7f\u7528\u904e\u4e00\u6bb5\u6642\u9593\u53e6\u5916\u4e00\u7a2e\u601d\u8def\uff0c\u4f7f\u7528\u8173\u672c\u7576\u4f5c\u914d\u7f6e\uff0c\u8db3\u5920\u9748\u6d3b\u53ef\u8b80\u6027\u4e5f\u5f88\u9ad8\uff0c\u4f46\u6703\u7522\u751f\u53e6\u5916\u4e00\u4e9b\u554f\u984c\u6700\u7d42\u653e\u68c4\u4e3b\u8981\u554f\u984c\u5982\u4e0b\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>\u9700\u8981\u5d4c\u5165\u8173\u672c\u5f15\u64ce \u592a\u91cd\u91cf\u7d1a<\/li><li>\u4f7f\u7528a\u8173\u672c\u4f5c\u7232\u914d\u7f6e \u4f46\u9700\u8981\u5beb b\u8173\u672c\u5be6\u73fe\u7a0b\u5f0f \u5f88\u5f46\u626d<\/li><li>\u8173\u672c\u592a\u904e\u81ea\u7531\u5fc5\u9808\u9650\u5236\u53ef\u8a2a\u554f\u7bc4\u570d \u9019\u53c8\u6703\u589e\u52a0\u5f88\u591a\u6210\u672c<\/li><\/ul>\n\n\n\n<p>\u5f8c\u4f86\u767c\u73fe\u4e86 Jsonnet \u548c\u9019\u500b\u76f8\u6cd5\u4e0d\u8b00\u800c\u5408\uff0cJsonnet \u662f\u4e00\u500b\u55ae\u7368\u7684\u8173\u672c\u8a9e\u8a00\uff0c\u4f46\u5176\u529f\u80fd\u88ab\u9650\u5b9a\u5728\u53ea\u80fd\u751f\u6210\u914d\u7f6e\u6a94\u6848\uff0cgoogle \u63d0\u4f9b\u4e86\u5f88\u591a\u8a9e\u8a00\u7684\u652f\u6301\u5d4c\u5165\u5f88\u5bb9\u6613\uff0c\u5e38\u7528\u8173\u672c\u8a9e\u8a00\u4e5f\u6709 Jsonnet \u7684\u89e3\u6790\u5668\u3002\u66f4\u591a\u8a73\u7d30\u4ecb\u7d39\u8acb\u770b  <a rel=\"noreferrer noopener\" href=\"https:\/\/jsonnet.org\/learning\/tutorial.html\" target=\"_blank\">google \u6587\u6a94<\/a> \u3002<\/p>\n\n\n\n<p>Jsonnet \u517c\u5bb9 JSON \u8a9e\u6cd5\uff0c\u540c\u6642\u6700\u7d42\u751f\u6210JSON\u4f9b\u7a0b\u5f0f\u4f7f\u7528\uff0cJsonnet \u4eba\u985e\u53cb\u597d\u8f38\u51fa\u7684 JSON \u6a5f\u5668\u53cb\u597d\uff0c\u7c21\u76f4\u5b8c\u7f8e\u3002<\/p>\n\n\n\n<p>\u9996\u5148\u4f86\u770b\u4e0b \u4e0a\u8ff0 YAML \u7c21\u55ae\u60c5\u6cc1\u4e0b\u7684\u540c\u7b49 Jsonnet \u914d\u7f6e<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n    server: {\n        listen: ':8080',\n        host: &#91;'xxx.com', 'www.xxx.com' 'code.xxx.com'],\n    },\n    db: {\n        driver: 'mysql',\n        connect: 'xxx',\n        pool: {\n            max: 10,\n            idle: 1,\n        },\n        cache: {\n            backend: 'memory',\n            max: 100,\n            algorithm: 'lru',\n        },\n    },\n}\n<\/code><\/pre>\n\n\n\n<p>\u5728\u60c5\u6cc1\u7c21\u55ae\u6642\uff0c\u53ef\u8b80\u6027\u5f88\u9ad8\uff0c\u4f46\u8207 YAML \u76f8\u6bd4\u5c6c\u6027\u6703\u591a\u5e7e\u500b \u5f15\u865f\uff0c\u4f46\u662f\u5f15\u865f\u660e\u78ba\u4e86\u6578\u64da\u985e\u578b\u662f\u5b57\u7b26\u4e32\u672c\u55b5\u662f\u53cd\u800c\u66f4\u6b23\u8cde\u9019\u9ede\u3002<\/p>\n\n\n\n<p>\u7c21\u55ae\u554f\u984c\u600e\u6a23\u90fd\u597d\u56e0\u7232\u8655\u7406\u8d77\u4f86\u5bb9\u6613\uff0c\u95dc\u9375\u5728\u65bc\u8655\u7406\u8907\u96dc\u554f\u984c\u7684\u80fd\u529b\uff0cJsonnet \u5c31\u5f37\u5927\u591a\u4e86\uff0c\u5176\u63d0\u4f9b\u4e86\u591a\u7a2e\u7279\u6027\u9019\u88cf\u53ea\u7c21\u55ae\u6f14\u793a\u4e0b\u7e7c\u627f\uff0c\u5047\u5982\u6211\u5011\u8981\u914d\u7f6e\u591a\u500bweb\u670d\u52d9\u5668\uff0c\u5176\u914d\u7f6e\u57fa\u672c\u4e00\u6a23\u53ea\u500b\u5225\u5c6c\u6027\u4e0d\u540c\u53ef\u4ee5\u9019\u6a23\u5beb\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ \u5b9a\u7fa9\u4e00\u500b\u57fa\u790e\u985e \u8a2d\u7f6e\u9ed8\u8a8d\u5c6c\u6027\nlocal Base = {\n    \/\/ \u914d\u7f6e https \u8b49\u66f8\n    certificate: 'fullchain.pem',\n    key: 'privkey.pem',\n    \/\/ \u5176\u5b83\u5f88\u591a \u5c6c\u6027\n    gzip: true,\n    keepalive_timeout: 65,\n    client_max_body_size:'5M',\n};\n\n{\n    server:&#91;\n        \/\/ \u670d\u52d9\u5668 \u4e00 \u5168\u90e8\u9ed8\u8a8d  Base \u914d\u7f6e\n        Base{\n            Listen: ':8080',\n        },\n        \/\/ \u670d\u52d9\u5668 \u4e8c \u95dc\u9589 gzip\n        Base{\n            Listen: ':8081',\n            gzip: false\n        },\n        \/\/ \u670d\u52d9\u5668 \u4e09 \u4f7f\u7528 \u55ae\u7368\u7684\u8b49\u66f8 \u4e26\u958b\u5553 quic\n        Base{\n            Listen: ':8082',\n            certificate: 'fullchain1.pem',\n            key: 'privkey1.pem',\n            quic: true\n        },\n    ],\n}<\/code><\/pre>\n\n\n\n<p>\u6700\u7d42\u53ea\u5beb\u4e86\u4e00\u4efd\u9ed8\u8a8d\u7684 Base \u7136\u5f8c\u5f88\u5bb9\u6613\u7684\u6d3e\u751f\u4e86\u4e09\u500b\u7368\u7279\u7684\u670d\u52d9\u5668\uff0c\u751f\u6210\u7684 JSON \u5982\u4e0b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n   \"server\": &#91;\n      {\n         \"Listen\": \":8080\",\n         \"certificate\": \"fullchain.pem\",\n         \"client_max_body_size\": \"5M\",\n         \"gzip\": true,\n         \"keepalive_timeout\": 65,\n         \"key\": \"privkey.pem\"\n      },\n      {\n         \"Listen\": \":8081\",\n         \"certificate\": \"fullchain.pem\",\n         \"client_max_body_size\": \"5M\",\n         \"gzip\": false,\n         \"keepalive_timeout\": 65,\n         \"key\": \"privkey.pem\"\n      },\n      {\n         \"Listen\": \":8082\",\n         \"certificate\": \"fullchain1.pem\",\n         \"client_max_body_size\": \"5M\",\n         \"gzip\": true,\n         \"keepalive_timeout\": 65,\n         \"key\": \"privkey1.pem\",\n         \"quic\": true\n      }\n   ]\n}<\/code><\/pre>\n\n\n\n<p>\u6700\u5f8c\u4f86\u770b\u4e0b\u4e0a\u9762\u90a3\u500b\u96e3\u770b\u7684 k8s \u7684 YAML \u914d\u7f6e \u5982\u679c\u7528 Jsonnet \u6703\u9577\u4ec0\u9ebc\u6a23\u5b50\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n    apiVersion: 'apps\/v1',\n    kind: 'StatefulSet',\n    metadata: {\n        name: 'mysql',\n    },\n    spec: {\n        serviceName: \"mysql\",\n        replicas: 3,\n        template: import 'template.libsonnet',\n        selector: import 'selector.libsonnet',\n        volumeClaimTemplates: import 'volumeClaimTemplates.libsonnet',\n    },  \n}<\/code><\/pre>\n\n\n\n<p>\u4e3b\u914d\u7f6e\u6a94\u6848\u5c31\u9019\u9ebc\u7c21\u55ae\uff0ctemplate.libsonnet selector.libsonnet volumeClaimTemplates.libsonnet \u4e09\u500b\u6a94\u6848\u4f5c\u7232\u6a21\u584a\u88ab\u52a0\u8f09\u9032\u5165\u4e3b\u914d\u7f6e\uff0c\u73fe\u5728\u56e0\u7232\u914d\u7f6e\u88ab\u62c6\u5206\u4e86\u7121\u8ad6\u4e3b\u914d\u7f6e\u9084\u662f\u5b50\u914d\u7f6e\u90fd\u8b8a\u5f97\u7c21\u55ae\u5bb9\u6613\u4eba\u985e\u95b1\u8b80\u548c\u7de8\u8f2f\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u5404\u7a2e\u7528\u65bc\u914d\u7f6e\u6a94\u6848\u7684\u683c\u5f0f\u6bd4\u8f03<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[2],"tags":[10,3,7,6,4,8,5],"class_list":["post-5","post","type-post","status-publish","format-standard","hentry","category-code","tag-conf","tag-google","tag-ini","tag-json","tag-jsonnet","tag-xml","tag-yaml"],"blocksy_meta":{"styles_descriptor":{"styles":{"desktop":"","tablet":"","mobile":""},"google_fonts":[],"version":6}},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/blog.king011.com\/index.php?rest_route=\/wp\/v2\/posts\/5","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.king011.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.king011.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.king011.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.king011.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=5"}],"version-history":[{"count":19,"href":"https:\/\/blog.king011.com\/index.php?rest_route=\/wp\/v2\/posts\/5\/revisions"}],"predecessor-version":[{"id":64,"href":"https:\/\/blog.king011.com\/index.php?rest_route=\/wp\/v2\/posts\/5\/revisions\/64"}],"wp:attachment":[{"href":"https:\/\/blog.king011.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=5"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.king011.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=5"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.king011.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=5"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}