15. 从零用Rust编写正反向代理, 如果将nginx.conf转成yaml,toml,json会怎么样

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: wmproxyversion: "1.1"editor: 2022# 项目依赖dependencies:wenmeng:version: 0.1.21default-features: falsefeatures:- std- tokiowebparse: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: onserver:- bind_addr: 127.0.0.1:80server_name: wm-proxy.comlocation:- rule: /productsreverse_proxy: http://127.0.0.1:8090/proxyheaders:- - +- Access-Control-Allow-Credentials- "true"- - +- Access-Control-Allow-Origin- "*"- rule: /file_server:root: wmproxybrowse: trueindex:- 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格式的配置文件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/590974.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CNAS中兴新支点——软件测试报告模板分享

第三方检测机构推荐 欢迎私信或评论咨询,也可看本人收藏夹获取详细咨询信息。下面开始进入正文 1、测试背景: 本次测试的软件是一款名为“XXX”的应用程序,主要用于解决某种需求。本次测试目的是发现软件中的问题和缺陷,并进行优…

python SVM 保存和加载模型参数

在 Python 中,你可以使用 scikit-learn 库中的 joblib 或 pickle 模块来保存和加载 SVM 模型的参数。以下是一个简单的示例代码,演示了如何使用 joblib 模块保存和加载 SVM 模型的参数: 保存模型参数: from sklearn import svm …

7-16 jmu-Java-02基本语法-03-身份证排序(Java for PTA)

输入n,然后连续输入n个身份证号。然后根据输入的是sort1还是sort2,执行不同的功能。输入的不是sort1或sort2,则输出exit并退出。 输入sort1,将每个身份证的年月日抽取出来,按年-月-日格式组装,然后对组装后…

Git - 命令别名

记录在Ubuntu平台使用Git时使用的命令别名 # vim ~/.bashrc # 增加如下内容 alias grgit remote show origin alias gbgit branch alias gbvgit branch -vv alias gsgit status alias gagit add alias gcgit commit alias gcogit checkout alias gpgit pull alias gpsgit push …

【VMware】Windows安装MySQL及网络配置---图文并茂详细介绍

一 安装MySQL ① 连接虚拟机传输MySQL压缩包 先查看虚拟机中的地址 命令: ipconfig 主机连接 在主机连接虚拟机后,将mysql压缩包和Navicat安装包复制到虚拟机下即可 ②解压MySQL压缩包 ③ my文件拷贝mysql安装根目录下 如下图的第一步,…

使用 C# 实现一个 Event Bus

使用 C# 实现一个 Event Bus Event Bus(事件总线)是一种用于在应用程序内部或跨应用程序组件之间进行事件通信的机制。它允许不同的组件通过发布和订阅事件来进行解耦和通信。 在给定的代码片段中,我们可以看到一个使用C#实现的Event Bus。…

2024年山东省中职“网络安全”试题——B-3:Web安全之综合渗透测试

B-3:Web安全之综合渗透测试 服务器场景名称:Server2010(关闭链接) 服务器场景操作系统:"需要环境有问题加q" 使用渗透机场景Kali中的工具扫描服务器,通过扫描服务器得到web端口,登陆…

计算机专业个人简历范文(8篇)

HR浏览一份简历也就25秒左右,如果你连「好简历」都没有,怎么能找到好工作呢? 如果你不懂得如何在简历上展示自己,或者觉得怎么改简历都不出彩,那请你一定仔细读完。 互联网运营个人简历范文> 男 22 本科 AI简历…

【Pytorch】Pytorch或者CUDA版本不符合问题解决与分析

NVIDIA CUDA Toolkit Release Notes Package installation issues INSTALL PYTORCH 先声毒人:最好资料就是上面三份资料,可以通过官网明确的获取一手信息,你所遇到的99%的问题都可以找到,明确的解决方案,建议最好看…

linux sh 脚本文件换行错误

windows 写好的脚本到服务运行不起来,显示换行问题 因为 windwos 的换行和 linux 的换行风格不同 解决办法:在使用的文本编辑器中,修改格式为 unix 格式 以 notepad 为例,在编辑 -> 文档格式转换中设置格式为 Unix

fmincon函数的决策变量可以是二维矩阵,但不建议是高维矩阵

1)二维矩阵代码 clear all clc% 定义目标函数 fun (x) sum(sum(x.^2));% 初始矩阵 x0 2 rand(2, 2);% 定义空的线性不等式约束 A []; b [];% 定义空的线性等式约束 Aeq []; beq [];% 定义变量的上下界 lb ones(2,2); ub [];% 使用 fmincon 求解 options …

LLM大语言模型(四):在ChatGLM3-6B中使用langchain

目录 背景准备工作工具添加LangChain 已实现工具Calculator、Weather Tool配置 自定义工具自定义kuakuawo Agent 多工具使用参考 背景 LangChain是一个用于开发由语言模型驱动的应用程序的框架。它使应用程序能够: 具有上下文意识:将语言模型与上下文源(提示指令&…

Rancher 单节点 docker 部署备份与恢复

Rancher 单节点 docker 部署备份与恢复 1. 备份集群 获取 rancher server 容器名,本例为 angry_aryabhata docker ps | grep rancher/rancher6a27b8634c80 rancher/rancher:v2.5.14 xxx angry_aryabhata停止容器 docker stop angry_aryabhata创建备…

基于Spring Boot的美妆分享系统:打造个性化推荐、互动社区与智能决策

基于Spring Boot的美妆分享系统:打造个性化推荐、互动社区与智能决策 1. 项目介绍2. 管理员功能2.1 美妆管理2.2 页面管理2.3 链接管理2.4 评论管理2.5 用户管理2.6 公告管理 3. 用户功能3.1 登录注册3.2 分享商品3.3 问答3.4 我的分享3.5 我的收藏夹 4. 创新点4.1 …

国标GB28181对接的时候如何配置服务端口和本地端口

目 录 一、国标GB28181对接需要配置的端口等参数 二、GB28181服务器端口的配置:SIP服务器端口 三、GB28181设备测端口的配置:本地SIP端口 (一)本地SIP端口配置的意义 (二&#xf…

57.网游逆向分析与插件开发-游戏增加自动化助手接口-接管游戏的自动药水设定功能

内容来源于:易道云信息技术研究院VIP课 码云地址(master分支):https://gitee.com/dye_your_fingers/sro_-ex.git 码云版本号:51307d6bf69f2f3c645c70d09f841f5e32da79b9 代码下载地址,在 SRO_EX 目录下&…

全志R128使用SPI驱动ST7789V1.47寸LCD

R128 平台提供了 SPI DBI 的 SPI TFT 接口,具有如下特点: Supports DBI Type C 3 Line/4 Line Interface ModeSupports 2 Data Lane Interface ModeSupports data source from CPU or DMASupports RGB111/444/565/666/888 video formatMaximum resoluti…

开源在线客服系统源码全端通吃:聊天记录云端实时保存 附带完整的搭建教程

随着互联网的普及和消费者对客户服务体验的要求提高,传统的电话客服已经不能满足用户的需求。企业需要一个更加便捷、高效、实时的在线客服系统来提供更好的客户服务。然而,市场上的许多在线客服系统要么功能不全,要么价格昂贵。在这种情况下…

速盾网络:2024欢迎用户来选择速盾

尊敬的用户: 新年伊始,速盾网络迎来了崭新的一年。在这个充满希望和机遇的时刻,我们由衷地欢迎您选择速盾,与我们一同踏上网络安全的旅程。 速盾网络一直致力于为用户提供卓越的网络安全解决方案,以应对不断演变的网…

Spring Boot 自动配置功能介绍

Spring Boot 自动配置功能介绍 Spring Boot 是一个流行的 Java 开发框架,它提供了许多便利的功能和工具,帮助开发者快速构建应用程序。其中一个最引人注目的特性是其强大的自动配置功能。 什么是自动配置? 在传统的 Java 开发中&#xff0…