高效的动态URL限流实现

        访问限流对于一个网关来说是个比较重要的功能,它可以根据不同服务的处理能力来控制相关的访问量,从而保障服务更可靠地运行。但是URL控制的路径比较多还加上可动态添加删除,大量的访问匹配会很容易引起性能上的问题,接下来讲解一下Beetlex的网关是如何实现,并得到一个更好的处理性能。

        对于一个API服务来说它的接口非常多,当根据不同接口定义访问控制的时候每次请求都会匹配一下URL然后进行访问控制,当访问量比较大的时候这个字符匹配损耗是非常大的;解决这种问题可以对URL策略对象进行一个缓存,但缓存有一个延时性的问题,毕竟策略可以随意添加或删除,这时候当前URL的处理策略是否有效就存在一些延时问题了。接下介绍一下Beetlex的网关设计是怎样解决性能问题又能处理缓存的延时性问题。

        Beetlex在设计的时候引入了策略代理和版本问题,当网关接收到请求会拿到当前URL策略代理的缓存,然后再对比一下当前代理的版本和配置策略的版本是否一致,当一致的情况下直接用策略代理计数并判断处理,否则重匹配策略生成代理写入到缓存中。看上去有些复杂,实际代码非常简单

private void OnRefreshTable()
{lock (this){var items = (from a in mLimitTable.Valuesorderby a.Url.Length descendingselect a).ToArray();if (items == null){items = new UrlLimitRecord[0];}mUrlTables = items;System.Threading.Interlocked.Increment(ref mVersion);}
}public void AddUrl(string url, int maxrps)
{mLimitTable[url] = new UrlLimitRecord { Url = url, MaxRPS = maxrps };OnRefreshTable();
}public void RemoveUrl(string url)
{mLimitTable.TryRemove(url, out UrlLimitRecord result);OnRefreshTable();
}

在策略容器中添加一个版本号,当有修改的情况重新刷新匹配表和修改版本号。接下来在获取策略的时候做一下判断即可:

internal UrlLimitAgent Match(string url)
{if (mCachedLimitTable.TryGetValue(url, out UrlLimitAgent result)){if (result.Version == Version)return result;}var items = mUrlTables;result = new UrlLimitAgent();foreach (var item in items){if (url.IndexOf(item.Url, StringComparison.CurrentCultureIgnoreCase) >= 0){result.RpsLimit = new RpsLimit(item.MaxRPS);result.Config = item;}}result.Version = System.Threading.Interlocked.Add(ref mVersion, 0);mCachedLimitTable[url] = result;return result;
}

从缓存表中获取代理,当获取成功后判断一下版本号,如果一致就返回否则重新匹配并更新到缓存中。

        当看完以上代码是不是感觉非常简单,Beetlex网关的限流策略基本用这种方式进行设计和使用,以下是Beetlex网关的限流功能

if (!CheckIPTable(request, response))return;
if (!CheckDomains(request))
{if (string.IsNullOrEmpty(Options.InvalidDomainUrl)){response.InnerError("509", "Invalid domain name!");}else{Move302Result result = new Move302Result(Options.InvalidDomainUrl);response.Result(result);}return;
}
HttpToken token = (HttpToken)request.Session.Tag;
if (token.HttpRpsLimit.Check(this.Options.SessionMaxRps))
{response.InnerError("509", "session max rps limit!");return;
}
if (!mIPLimit.ValidateRPS(request))
{response.InnerError("509", $"{request.RemoteIPAddress} max rps limit!");return;
}
if (!CheckUrlLimit(request, response))return;
if (!CheckDomainsLimit(request, response))return;
if (RpsLimitHandlers.Count > 0)foreach (var handler in RpsLimitHandlers.Values){if (handler.Check(request, response)){response.InnerError("509", $"{handler.Name} max rps limit!");return;}}if (AllRpsLimit.Check(this.Options.MaxRps))
{response.InnerError("509", "server max rps limit!");return;
}
BeetleX

开源跨平台通讯框架(支持TLS)
提供高性能服务和大数据处理解决方案

8513020b7dd9e5d028b44ece17e8bcab.png

https://beetlex-io.com

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

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

相关文章

cocos2d-x学习 之一

最近准备学习cocos2d-x的开发,首先要搭建一下开发环境。今天就先搭建一下开发环境。本人系统为Mint-15 64位的linux,以下的开发环境只用于linux。首先到cocos2d-x的官网上下载安装包,由于cocos2d-x是开源的,所以我们可以查看源码&…

python里while的用法_Python学习笔记之While循环用法分析

本文实例讲述了Python学习笔记之While循环用法。分享给大家供大家参考,具体如下:前面一篇《Python学习笔记之For循环用法》详细介绍了Python for循环,这里再来讲述一下while循环的使用方法:Python 中的While循环For 循环是一种有限…

linux环境下最简单的C语言例子

1、装好linux系统和配置GCC环境 给自己的电脑上安装linux系统,比如我用大的是ubuntu,然后在ubuntu上配置GCC环境,如果不知道配置,请百度“linux上怎么配置GCC环境” 2、打开终端创建文件写代码 用组合命令打开终端 Ctrl+Alt+T 用vim创建文件编写代码 vim hello.c再点击下…

在 App 扩展和主 App 间共享数据

tags: iOS 8,Swift,App Groups 随着 iOS 8 的发布,苹果为广大开发者很多新的 API,其中最突出显著的就非 App Extension 莫属了。这为开发者们又带来了很多机会。 而我们在开发 App Extension 的时候,基本大多数人都会遇到这样一个问题。就是由…

Java8 (1)

参考资料: 《Java8 in Action》 Raoul-Gabriel Urma 一、jdk8 客观的说,Java8是一次有重大演进的版本,甚至很多人认为java8所做的改变,在许多方面都比Java历史上任何一次改变都深远。 Scala,python这样优秀编程语言中对…

[探索 .NET 6]02 比较 WebApplicationBuilder 和 Host

这是『探索 .NET 6』系列的第二篇文章:01 揭开 ConfigurationManager 的面纱02 比较 WebApplicationBuilder 和 Host在 .NET 中,有一种新的“默认”方法用来构建应用程序,即使用 WebApplication.CreateBuilder()。在这篇文章中,我…

python计算公式分母有0_你知道Python中的浮点除法和积分除法吗,python,float,整除,都...

从python2.2开始,便有两种除法运算符:"/"、"//"。两者最大区别在:python2.2前的版本和python2.2以后3.0以前的版本的默认情况下,"/"所做的除法是以一种两个数或者多个数出现一个浮点数结果就以浮点…

计算机科学概论(2)数据的操控和程序的执行

1.CPU是什么?它有什么作用?CPU(Central Processing Unit,中央处理器)负责操控数据在不同位置间的移动及对数据进行处理。它是计算机的核心部件。它主要由三个部分组成:算数/逻辑单元、控制单元、寄存器单元。算数逻辑单元负责在数…

都怪爱因斯坦没说清楚!竟有人相信一个粉笔头就能让全人类多喝100年的热水?...

全世界只有3.14 % 的人关注了爆炸吧知识一个粉笔头一共能释放多少能量爱因斯坦大家肯定都熟悉,相信也有很多朋友听说过质能方程。根据质能方程的公式,我们发现:似乎能量和质量是可以相互转化的。尤其是一些没有系统学习过相对论,又…

linux环境下用TcpDump抓包分析总结

1、手机IP 怎么知道手机ip,输入下面命令 adb shellifconfig 比如得到手机ip 2.0.0.1 2、目标IP 比如目标地址ip为10.0.0.1 3、抓包命令 我们不带端口命令如下 tcpdump -i any host 2.0.0.1 -nv 代码端口的命令如下(端口为50129) tcpdump -i any host 2.0.0.1 and port…

UVa 12100 - Printer Queue

刚A完图书系统那道题&#xff0c;然后看提交次数那个字典的比这道题多&#xff0c;看了看那道更新字典没有思路&#xff0c;就看了这道题&#xff0c;感觉这道题比更新字典简单多了。 #include<iostream> #include<queue> #include<map> using namespace std…

从微信云托管容器镜像的选择-alpine 说起

微信云托管 使用目前主流的容器平台Docker以及容器编排技术Kubernetes&#xff08;简称K8S&#xff09;&#xff0c;来管理你的项目。使用微信云托管需要掌握对Docker的使用&#xff0c;但你无需掌握K8S的使用方法。微信云托管将K8S的运维配置完全接手&#xff0c;你不需要关心…

H5移动开发AUI框架入门---博客园老牛大讲堂

大家都知道H5可以开发移动端的页面&#xff0c;网上提供的移动端的开发都有很多。因为我学习了AUI框架&#xff0c;所以我这里介绍一下移动端AUI框架。--博客园老牛大讲堂 一、AUI框架是什么&#xff1f;---博客园老牛大讲堂 AUI框架就是利用原生的js和css封装成的一些界面。当…

python画樱桃小丸子_每天坚持画画|简笔画练习“樱桃小丸子”

《樱桃小丸子》也是80后的经典回忆&#xff0c;特别是女生们。你们可能不知道如果按实际年龄来算小丸子今年已经52岁了(1965年5月8日出生)可想而知这部动画片的影响力有多大。【今日主题】《樱桃小丸子》樱桃子BY&#xff1a;网络&#xff0c;侵删【完成图】BY&#xff1a;纳豆…

linux操作命令等积累

1&#xff0c;启动服务&#xff1a;两种方式&#xff1a; /etc/init.d/networking start /etc/init.d/mysql start #:service mysql start service networking start(stop,restart) $:sudo service mysql start(stop,restart) 2, linux 程序安装位置&#xff1a;多数位于/v…

linux之gdb调试常用100个技巧

linux之gdb调试常用100个技巧 https://gitlore.com/page/gitlore-git/gdb_tips/index.html 如果不懂linux gdb调试的 看下这篇文章 详细解说

制造价值基本方程

财富来自于自然资源、生产制造和服务。 未经加工的自然资源是价值低或没有用的&#xff0c;服务也必须和生产制造联系起来才能增加财富。 生产制造是增加财富的核心手段。 ERP enterprise resources planning 企业资源计划 -- 是管理的理念和工具。 制造要回答的问题&#xff1…

.NET6使用DOCFX根据注释自动生成开发文档

本文内容来自我写的开源电子书《WoW C#》&#xff0c;现在正在编写中&#xff0c;可以去WOW-Csharp/学习路径总结.md at master sogeisetsu/WOW-Csharp (github.com)来查看编写进度。预计2021年年底会完成编写&#xff0c;2022年2月之前会完成所有的校对和转制电子书工作&…