码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 15. 从零开始编写一个类nginx工具, 如果将nginx.conf转成yaml,toml,json会怎么样


    合集 - wmproxy(16)
    1.用Rust手把手编写一个Proxy(代理), 动工09-192.用Rust手把手编写一个Proxy(代理), UDP绑定篇09-213.5. 用Rust手把手编写一个Proxy(代理), 通讯协议建立, 为内网穿透做准备09-284.6. 用Rust手把手编写一个wmproxy(代理,内网穿透等), 通讯协议源码解读篇09-305.7. 用Rust手把手编写一个wmproxy(代理,内网穿透等), HTTP及TCP内网穿透原理及运行篇10-046.8. 用Rust手把手编写一个wmproxy(代理,内网穿透等), HTTP改造篇之HPACK原理10-087. 用Rust手把手编写一个Proxy(代理), 准备篇, 动手造轮子09-168.9. 用Rust手把手编写一个wmproxy(代理,内网穿透等), HTTP2改造篇之HPACK示例, 了解http2头信息如何处理10-099.10. 用Rust手把手编写一个wmproxy(代理,内网穿透等), HTTP内网穿透支持修改头信息10-1010.11. 用Rust手把手编写一个wmproxy(代理,内网穿透等), 实现健康检查10-1211.12. 用Rust手把手编写一个wmproxy(代理,内网穿透等), TLS的双向认证信息及token验证10-1412.13. 从零开始编写一个类nginx工具, HTTP中的压缩gzip,deflate,brotli算法10-1713.14. 从零开始编写一个类nginx工具, HTTP文件服务器的实现过程及参数10-19
    14.15. 从零开始编写一个类nginx工具, 如果将nginx.conf转成yaml,toml,json会怎么样10-20
    15.16. 从零开始编写一个类nginx工具, 反向代理upstream源码实现10-2316.17. 从零开始编写一个类nginx工具, Rust中一些功能的实现10-24
    收起

    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,将会同时兼容toml及yaml格式的配置文件。

  • 相关阅读:
    手摸手系列之前端Vue实现PDF预览及打印的终极解决方案
    【附源码】计算机毕业设计SSM网上销售系统
    校友在美团 Android 岗的四面分享~
    顶级赛事:第十届CCF大数据与计算智能大赛开赛
    Simple-BEV: 多传感器BEV感知真正重要的是什么?(斯坦福大学最新)
    混合SDN中的安全性问题研究
    css 灰质彩色的边框
    Hive (七) --------- 分区表和分桶表
    使用增强版 singleflight 合并事件推送,效果炸裂!
    MySQL多表关联on和where速度对比实测谁更快
  • 原文地址:https://www.cnblogs.com/luojiawaf/p/17776168.html
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号