wmproxy

wmproxy已用Rust实现http/https代理, socks5代理, 反向代理, 静态文件服务器,四层TCP/UDP转发,内网穿透,后续将实现websocket代理等,会将实现过程分享出来,感兴趣的可以一起造个轮子

项目地址

国内: https://gitee.com/tickbh/wmproxy

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

温柔的小姐姐

  我的名字叫 流控,至于我的工作你们看到我的名字也想必很清楚,我被创造出来为了的这世界更美好,期望这世界永远不会堵车,所以他们称我为温柔的小姐姐。

与数据不得不说的故事

  数据是个急性子的家伙,每次看他总是充充忙忙的带着一大推的大部分,想在我这里横冲直撞的。这就不得不说上一次他那急忙的模样了。

  还记得上次他带着一大帮的兄弟,成千上万个的,知道的人知道他们在护送重要资料,不知道的还以为他们去打仗呢!

  我守护的是一个广场,还有广场后面的一条路。

  那一次他带着兄弟来的太快,就跟我说:“流控姐姐,快点通往广场的门打开,我这边有兄弟们来了”。

  我就把门打开,让他带着他的兄弟们过来快速的进入广场。

  不一会儿广场慢慢的有点挤了起来,他就跟我说:“你快点把广场前面的路开大点,后面的兄弟来的太快,这条路又不能快速的通过,会把你的广场挤满的”。

  我就说:“不行哦,我接到上级的指令,通知说现在这条路只能开这么大,每秒通过100人最多了(限速1M/S),前面那条大路现在的人太多了,你这边要是太多的人会全部堵在一起的。”

  他就急忙的问:“那怎么办,我现在数据很重要,也很急,你看旁边那些无关的也一直在占用着路,你能不能向你的上级反馈一下?”

  我就说:“我现在就帮你反馈一下,但是要等下上级的调度哦。暂时你还是只能通过这么多!”

  我转身向上级说:“这边有大量的重要数据拥堵在广场这,他们请求调高优先级,提高缓冲区及通行速度。”

  上级答:“我现在去协调一下,把其它的数据叫他们先缓缓,你叫他先耐心等待下”

  眼看着上级的指定还没有下来,但是广场上已经快挤满了人了,我赶紧去那个广场的入口处理,我就把那个广场前的那个闸机打开,不让新的人进来。要不然等下广场出事故了。

  数据兄弟看着我,我也表示我暂时也无能为力,我说:“让你后面的兄弟缓缓,我这广场暂时容纳不下那么多人了(数据缓冲区已满,不再接收新的数据,也不会读出socket上的数据,反向的压着流量的传输)。”

  此时正在我们焦急等待的时候,上级传来了指令,说其它位置已经暂缓处理了,你当下可以把广场外围开起来,并把广场前面的路两边都放开(优先级调高,优先传输重要数据)。

  我就立马启动了扩容的按钮,只见广场外围的大圈全部打开,可以容纳10倍的人,并把广场前的出口路打开,可以通行10000人/s限速100M/S)。

  数据说:“快快快,已经可以通行了,快把闸机打开,我要赶紧带着兄弟们把资料送到。”

  只看到广场出去的人比进入的人多了很多,广场一下子空了起来。

  很快数据就全部带着他的兄弟走了,去完成任务了,说:“等我完成这任务,我向你来讨教讨教你这边的管理法,怎么能保证高效的完成调度的任务”。

当起了老师

数据完成了他的任务,回来的时候在跟我请教了起来。

  数据说:“我就是想问问,你的那个广场是怎么个情况,怎么一满了就可以自动防止人进入,然后一空了就可以通知人进入的。”

  我跟他解答说:“我这是一个异步处理的一把刀,我可以在空闲的时候完全的不占用任何的资源,在忙碌的时候又可以把全部的CPU用上。完成高效的运转。”

  数据问:“那你用了什么秘密法宝,他这么厉害?”

  我说:“我就是用了一种古代就开始在用的——旗语,也就是PollSemaphore,我这里存一把旗,并存了一把钥匙,当我有钥匙的时候,也就是广场人没满的时间,你来了我就放你进场,这样子我也不用管广场里有没有满。当你进入后,如果 广场满了,他会将我手上的钥匙拿走。没有钥匙的话,新进来的人我就不会让你们进入了。”

  数据问:“那如果广场有位置的话,那你怎么样才能重新得到钥匙?”

  我说:“这就是我高效的时候了,刚刚我钥匙交出去的时候,我已经调用了self.sem.poll_acquire(cx),当广场有人出去的话,他就会通知Waker,然后我就可以主动去找他拿到钥匙了,这样子我就可以重新拥有钥匙了。”

  数据说:“原来你缓冲区是这样子的吖,那你出口的那条路上,怎么限定人流量的?”

  我说:“这个就要有请RateLimitLayer了,他有定义了per每个周期的时间就比如每秒,或者每分钟,或者每小时,nums就是每个周期内可以通行的字节数。下面是详细的定义。”

pub struct RateLimitLayer {
/// 周期内可以通行的数据
nums: u64,
/// 每个周期的时间
per: Duration,
/// 当前周期下,还剩下可通行的数据
left_nums: u64,
/// 下一个时间重新计算的日期
util: Instant,
sleep: Pin<Box<Sleep>>,
}

  数据问:“那如果当前周期耗完的话,是不是还没有到下个周期前就不能继续通行了?”

  我答:“确实是的,你当前周期耗光了可用的额度,那不能通行了哦,我就会向Pin::new(&mut self.sleep).poll(cx).is_pending(),如果他现在不能用,就等会到那个时间,他就会通知我啦。他通知我,我就会重置掉到前的数据,这样子你就可以继续通行了。”

self.left_nums = self.nums;
self.util = Instant::now() + self.per;
self.sleep.as_mut().set(tokio::time::sleep_until(Instant::now() + self.per));

  数据说:“小姐姐你好厉害,还好有你在这里严格的控制着,我才能那么准时的到达”。

  我答:“那是,请叫我温柔的一刀,该严格的时候我就会严格,不严格那只会更麻烦。你说是吧。”

流控在互联网中是很重要的概念,因为基本上大部分的公网出口都不是无限的,就同一个网站,API的接口重要性肯定会比静态文件重要性来的高,所以为了使系统更稳定,感谢流控小姐姐使出这温柔的一刀。

点击 [关注][在看][点赞] 是对作者最大的支持

23. 从零用Rust编写正反向代理,流控小姐姐的温柔一刀!的更多相关文章

  1. bloom-server 基于 rust 编写的 rest api cache 中间件

    bloom-server 基于 rust 编写的 rest api cache 中间件,他位于lb 与api worker 之间,使用redis 作为缓存内容存储, 我们需要做的就是配置proxy,同 ...

  2. 正反向代理、负载均衡、Nginx配置实现

    一.正反向代理 1.前提 我们曾经使用翻墙软件,访问google:使用了代理软件时,需要在浏览器选项中配置代理的地址,我们仅仅有代理这个概念,并不清楚代理还有正向和反向之分. 2.正向代理(代替客户端 ...

  3. 编写可编辑的List控件

    今天由于项目的需要,要编写个能编辑的List控件,即双击List控件的表项能修改其中的内容.由于MFC自带的List控件是不能编辑的,所以在网上找了下怎样编写可编辑的CListCtrl控件,基本上都是 ...

  4. 重新想象 Windows 8 Store Apps (23) - 文件系统: 文本的读写, 二进制的读写, 流的读写, 最近访问列表和未来访问列表

    原文:重新想象 Windows 8 Store Apps (23) - 文件系统: 文本的读写, 二进制的读写, 流的读写, 最近访问列表和未来访问列表 [源码下载] 重新想象 Windows 8 S ...

  5. BurpSuite 代理设置的小技巧

    原文:https://www.anquanke.com/post/id/85925 作者:三思之旅 预估稿费:300RMB 投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿 在We ...

  6. 【技术分享】BurpSuite 代理设置的小技巧

    作者:三思之旅 预估稿费:300RMB 投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿 在Web渗透测试过程中,BurpSuite是不可或缺的神器之一.BurpSuite的核心是 ...

  7. Nginx正反向代理、负载均衡等功能实现配置

    版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[+]   系统环境: VirtualBox Manager Centos6.4 nginx1.10.0 IP对应的机器名: IP ...

  8. 使用Squid部署代理缓存服务(标准正向、透明正反向代理)

    正向代理让用户可以通过Squid服务程序获取网站页面等数据,具体工作形式又分为标准代理模式与透明代理模式.标准正向代理模式: 将网站的数据缓存在服务器本地,提高数据资源被再次访问时的效率,但用户必需在 ...

  9. 23、V4L2应用编写及各个ioctl涉及结构体说明分析

    常用的结构体在内核目录include/linux/videodev2.h中定义 struct v4l2_requestbuffers  //申请帧缓冲,对应命令VIDIOC_REQBUFSstruct ...

  10. 【源码】谷歌代理~WPF简单小软件-2015-10-15首发 (2016-03-01已更新源)

    蛋疼,昨天把代理去了后才发现,原来咱们连谷歌应用都访问不了,,,用别人的总觉得不怎么安全,然后今天早上就编了个小软件干掉他这限制==>  GoogleProxy.exe [主要目的:为了能在线安 ...

随机推荐

  1. switch写法详解

    我们在开发项目中经常遇到对数据的判断进行相应的逻辑(if..else  ,三元运算等),Switch 语句用来选择多个需要执行的代码块 ,一定程度上简化了if....else 1. 语法 switch ...

  2. MySQL——GROUP BY详解与优化

    在 MySQL 中,GROUP BY用于将具有指定列中相同值的行分组在一起.这是在处理大量数据时非常有用的功能,允许对数据进行分类和聚合. 基本使用 语法 以下是GROUP BY子句的基本语法: &q ...

  3. 仪酷LabVIEW AI视觉工具包及开放神经网络交互工具包常见问题解答

    前言 哈喽,各位朋友,好久不见~ 之前给大家分享了基于LabVIEW开发的AI视觉工具包及开放神经网络交互工具包,不少朋友私信说在安装和使用过程中会遇到一些问题,今天我们就集中回复一下大家问到最多的问 ...

  4. pyqt5学习日记

    前提需要pip安装PyQt5与PyQt5-tools 安装后会有qtdesigner.exe和pyuic5.exe,用everything直接可以搜索到 qtdesigner.exe是来设计ui的 p ...

  5. 关于 LLM 和图数据库、知识图谱的那些事

    本文整理自 NebulaGraph 布道师 wey 在「夜谈 LLM」主题分享上的演讲,主要包括以下内容: 背景 LLM RAG Graph 知识抽取 Text2Cypher Graph RAG 未来 ...

  6. 每日一库:gosec

    gosec 是一个用于在 Go 代码中查找安全问题的开源工具,它可以帮助发现可能的漏洞和潜在的安全风险.以下是关于 gosec 的详细介绍: 1. 工具概述: gosec 是一个静态分析工具,用于扫描 ...

  7. Auto-GPT免费尝鲜之初体验-使用攻略和总结

    写在前面的废话 ChatGPT 的交互模式,是和一个 "人" 对话聊天. 如果你想了解更多ChatGPT和AI绘画的相关知识,请参考:ChatGPT注册和变现思路,AI绘画教程汇总 ...

  8. GitHub Actions CI/CD 工作流实战

    1. 什么是 GitHub Actions 与 workflow ? GitHub Actions 是 GitHub 提供的一种持续集成(CI)和持续部署(CD)的工具,用于自动化软件开发过程中的各种 ...

  9. 小白python和pycharm安装大佬勿扰

    编程语言发展和Python安装 计算机语言的发展 机器语言 1946年2月14日,世界上第一台计算机ENIAC诞生,使用的是最原始的穿孔卡片.这种卡片上使用的语言是只有专家才能理解的语言,与人类语言差 ...

  10. 文心一言 VS 讯飞星火 VS chatgpt (86)-- 算法导论8.2 3题

    三.用go语言,假设我们在 COUNTING-SORT的第 10行循环的开始部分,将代码改写为: 10 for j = 1 to A.length 试证明该算法仍然是正确的.它还稳定吗? 文心一言: ...