15. 從零開始編寫一個類nginx工具, 如果將nginx.conf轉成yaml,toml,json會怎麼樣

来源:https://www.cnblogs.com/luojiawaf/archive/2023/10/20/17776168.html
-Advertisement-
Play Games

對比yaml,toml,json三種格式的優缺點及三種格式的支持特性,以及講述了nginx.conf轉化成yaml,toml格式的樣式 ...


wmproxy

wmproxy將用Rust實現http/https代理, socks5代理, 反向代理, 靜態文件伺服器,後續將實現websocket代理, 內外網穿透等, 會將實現過程分享出來, 感興趣的可以一起造個輪子法

項目 ++wmproxy++

gite: https://gitee.com/tickbh/wmproxy

github: https://github.com/tickbh/wmproxy

瞭解三種格式

Json

  • JSON是一種輕量級的數據交換格式,被廣泛使用在Web應用程式之間傳輸數據。
  • JSON使用大括弧{}來表示數據結構,使用冒號:來連接鍵和值。
  • JSON支持字元串、數字、布爾值、null、數組和對象等多種數據類型。
  • JSON文件通常用於數據交換、存儲等場景,也可以用作配置文件。
    JSON簡單易讀存儲通用,但JSON原生不支持註釋用來做配置文件比較硬傷。

它流行度極高,基本上每個程式員都和他打過交道。
多層級時,對齊和縮進不好控制,容易出錯

Yaml

  • YAML被設計為一種可讀性極強的數據序列化標準,可以用來表達層次化數據。
  • YAML使用空格縮進來表示數據層次結構。
  • YAML支持浮點數、布爾值、字元串、數組、映射等多種數據類型。
  • YAML文件通常用於配置文件、數據交換等場景。

與JSON及TOML相比,結構比較緊湊
但相對用空格縮近,編寫及拷貝時出錯的機率比JSON及TOML高許多

Toml

TOML 旨在成為一個語義明顯且易於閱讀的最小化配置文件格式。
TOML 應該能很容易地被解析成各種語言中的數據結構。

  • TOML是一種簡潔明瞭的鍵值對格式,被設計成可以很容易地映射為哈希表。
  • TOML使用等號(=)來連接鍵和值,使用縮進來表示數據層次結構。
  • TOML支持整數、浮點數、字元串、布爾值、數組、字典等多種數據類型。
  • TOML文件通常用於配置文件、數據交換等場景。

易於閱讀和編寫語法靈活
與JSON配置相比,TOML在簡潔性方面遠遠勝出;
與YAML配置相比,TOML在簡潔性以及語法靈活性方面遠遠勝出。

三種格式測試數據的對比

我們用Rust的項目配置文件來做對比,為了展示所有的類型,格式有所變更。它以Toml來做配置文件,我們首先先展示toml的格式

內容包含創建者,創建時間,項目名稱,項目依賴等信息,如果我們將其轉化成可配置的JSON格式時

toml

create="tickbh"
create_time=2023-09-08T10:30:00Z
[project]
# 項目名稱
name="wmproxy"
version="1.1"
editor=2022
# 項目依賴
[project.dependencies]
wenmeng={version = "0.1.21", default-features = false, features = ["std", "tokio"]}
webparse={version = "0.1", default-features = false}

行數12行,註釋兩行,全部頂格開頭,原生支持時間格式

json

{
  "create": "tickbh",
  "create_time": "2023-09-08T10:30:00.000Z",
  "project": {
    "name": "wmproxy",
    "version": "1.1",
    "editor": 2022,
    "dependencies": {
      "wenmeng": {
        "version": "0.1.21",
        "default-features": false,
        "features": [
          "std",
          "tokio"
        ]
      },
      "webparse": {
        "version": "0.1",
        "default-features": false
      }
    }
  }
}

行數23行,層次的遞進比較多,不容易對齊,無法註釋,不支持時間格式

yaml

create: tickbh
create_time: 2023-09-08T10:30:00.000Z
project:
  # 項目名稱
  name: wmproxy
  version: "1.1"
  editor: 2022
  # 項目依賴
  dependencies:
    wenmeng:
      version: 0.1.21
      default-features: false
      features:
        - std
        - tokio
    webparse:
      version: "0.1"
      default-features: false

行數18行,註釋兩行,原生支持時間格式,到features這級行,深度相對較高,但是一眼看上去比json清晰

相對來說JSON比較不適合做比較複雜的配置文件,但VSCODE使用的拓展的JSON以支持註釋功能。

接下來嘗試將nginx.conf格式做轉換

以下嘗試的將

http {
    gzip on;
    server {
        listen 80;  #監聽80的服務埠
        server_name wm-proxy.com;  #監聽的功能變數名稱
       
        location /products {
            proxy_pass http://127.0.0.1:8090/proxy;
            add_header 'Access-Control-Allow-Credentials' 'true';
            add_header 'Access-Control-Allow-Origin' '*';
        }
        
        location / {
            root wmproxy;
            index index.html index.htm;
        }
    }
}

我們也模仿類似的結構,但是對於toml,yaml,json來說,都沒有一個key兩個值的,要麼我們只能用對應的數組,此時我來先來初步重構類似的結構。以下我們以toml結構為例,我們分析table的級數有三級,最外層為http,中間層為server為數組,最內層為location也為數組,headers我們用之前提到過的mappings,用proxy開頭來表示重寫Reqeust,其它的來表示重寫Response,文件系統我們用上節提到的file_server
我們先定義http的table,他只有一個屬性gzip為on

[http]
gzip="on"

其次server為一個數組,那麼我們可以如下定義,有綁定地址和server_name

[[http.server]]
bind_addr="127.0.0.1:80"
server_name="wm-proxy.com"

再然後location也為一個數組,定義如下

[[http.server.location]]
rule = "/products"
reverse_proxy = "http://127.0.0.1:8090/proxy"
headers = [
  ["+", "Access-Control-Allow-Credentials", "true"],
  ["+", "Access-Control-Allow-Origin", "*"]
]
[[http.server.location]]
rule = "/"
file_server = { root="wmproxy", browse = true, index=["index.html", "index.htm"] }

那麼,最終的結構為如下:

[http]
gzip="on"
[[http.server]]
bind_addr="127.0.0.1:80"
server_name="wm-proxy.com"
[[http.server.location]]
rule = "/products"
reverse_proxy = "http://127.0.0.1:8090/proxy"
headers = [
  ["+", "Access-Control-Allow-Credentials", "true"],
  ["+", "Access-Control-Allow-Origin", "*"]
]
[[http.server.location]]
rule = "/"
file_server = { root="wmproxy", browse = true, index=["index.html", "index.htm"] }

而yaml的格式結構如下:

http:
  gzip: on
  server:
    - bind_addr: 127.0.0.1:80
      server_name: wm-proxy.com
      location:
        - rule: /products
          reverse_proxy: http://127.0.0.1:8090/proxy
          headers:
            - - +
              - Access-Control-Allow-Credentials
              - "true"
            - - +
              - Access-Control-Allow-Origin
              - "*"
        - rule: /
          file_server:
            root: wmproxy
            browse: true
            index:
              - index.html
              - index.htm

而json的格式結構如下:

{
  "http": {
    "gzip": "on",
    "server": [
      {
        "bind_addr": "127.0.0.1:80",
        "server_name": "wm-proxy.com",
        "location": [
          {
            "rule": "/products",
            "reverse_proxy": "http://127.0.0.1:8090/proxy",
            "headers": [
              [
                "+",
                "Access-Control-Allow-Credentials",
                "true"
              ],
              [
                "+",
                "Access-Control-Allow-Origin",
                "*"
              ]
            ]
          },
          {
            "rule": "/",
            "file_server": {
              "root": "wmproxy",
              "browse": true,
              "index": [
                "index.html",
                "index.htm"
              ]
            }
          }
        ]
      }
    ]
  }
}
  • 自建的好處是比較清晰,可以自定義自己合適的結構,但是編寫者需要重新開始學習,而用能用的配置文件需要遵循它的格式定義
  • 像toml文件,如果層級很深,他的key值配置會很長,因為他一旦定義一個table,就是從最頂級來解析,但是編寫者只要熟悉過這配置文件很快就能寫出滿意的配置文件
  • 而yaml的層級結構相對會需要去看對齊與否,編寫的時候需要額外註意,因為弄錯了縮進,層級就會發生錯誤
  • 而json最後結尾的會有相當多的花括弧,相對比較容易弄錯。JSON總體來說不太適合做比較複雜的配置文件

結語

在不考慮自建格式的情況下,如nginx的nginx.conf,如caddy的Caddyfile,將會同時相容tomlyaml格式的配置文件。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在上篇文章 每個後端都應該瞭解的 OpenResty 入門以及網關安全實戰 中,我向大家介紹了 OpenResty 的入門使用是 WAF 防禦實戰,這篇文章將給大家繼續介紹 OpenResty 入門之性能測試 篇。 性能測試是軟體開發中不可或缺的一環,它可以幫助我們評估系統的性能、穩定性、可擴展性等 ...
  • 來源:nginx(ID:nginx-study) Cloudflare公司去年宣佈棄用nginx,轉用自研的新一代方向代理服務Pingora,並號稱比nginx更快、更高效、更安全,下麵通過Cloudfare官方網站的一篇文章來瞭解下Pingora比Nginx強在哪裡。 簡介 今天,我們很高興有機會 ...
  • reCAPTCHA是Google公司推出的一項驗證服務,使用十分方便快捷,在國外許多網站上均有使用。它與許多其他的人機驗證方式不同,它極少需要用戶進行各種識圖驗證。 它的使用方式如下如所示,只需勾選覆選框即可通過人機驗證。 雖然簡單但效果很好,因為Google會收集一些瀏覽器信息,網路信息,滑鼠軌跡 ...
  • 簡介 Go語言中的切片(slice)是一種靈活的數據結構,它構建在數組之上並提供了方便的方式來操作數組的一部分。切片的底層實現涉及到數組和一些元數據。以下是Golang切片的底層實現的詳細介紹: 底層數組(Underlying Array): 切片是建立在一個底層數組之上的。這個數組通常比切片的容量 ...
  • 1 概覽 DataX 是一個異構數據源離線同步工具,致力於實現包括關係型資料庫(MySQL、Oracle等)、HDFS、Hive、ODPS、HBase、FTP等各種異構數據源之間穩定高效的數據同步功能。 1.1 設計理念 為瞭解決異構數據源同步問題,DataX將複雜的網狀的同步鏈路變成了星型數據鏈路 ...
  • 我們應對併發場景時一般會採用下麵方式去預估線程池的線程數量,但是在一些情況下,這個t是不好估算的,即便是估算出來了,在實際的線程環境上也需要進行驗證和微調。比如在本文所闡述分頁查詢的數據項組合場景中。 ...
  • 氣泡圖是一種多變數的統計圖表,可以看作是散點圖的變形。與散點圖不同的是,每一個氣泡都表示三個維度的數據,除了像散點圖一樣有X,Y軸,氣泡的大小可以表示另一個維度的數據。例如,x軸表示產品銷量,y軸表示產品利潤,氣泡大小代表產品市場份額百分比。 它可以幫助我們發現變數之間的模式、趨勢和異常值。通過氣泡 ...
  • 埠掃描是一種網路安全測試技術,該技術可用於確定對端主機中開放的服務,從而在滲透中實現信息搜集,其主要原理是通過發送一系列的網路請求來探測特定主機上開放的`TCP/IP`埠。具體來說,埠掃描程式將從指定的起始埠開始,向目標主機發送一條`TCP`或`UDP`消息(這取決於埠的協議類型)。如果目... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...