【.NET Core项目实战-统一认证平台】第七章 网关篇-自定义客户端限流

上篇文章我介绍了如何在网关上增加自定义客户端授权功能,从设计到编码实现,一步一步详细讲解,相信大家也掌握了自定义中间件的开发技巧了,本篇我们将介绍如何实现自定义客户端的限流功能,来进一步完善网关的基础功能。

.netcore项目实战交流群(637326624),有兴趣的朋友可以在群里交流讨论。

一、功能描述

限流就是为了保证网关在高并发或瞬时并发时,在服务能承受范围内,牺牲部分请求为代价,保证系统的整体可用性而做的安全策略,避免单个服务影响整体网关的服务能力。
比如网关有商品查询接口 ,能接受的极限请求是每秒100次查询,如果此时不限流,可能因为瞬时请求太大,造成服务卡死或崩溃的情况,这种情况可以使用Ocelot客户端全局限流即可满足需求,现在又有一个需求,我需要把接口开放给A公司,他们也要查询这个商品接口,这时A公司请求频率也是我们设置的每秒100次请求,显然我们不希望A公司有这么高的请求频率,我只会给A公司最大每秒一次的请求,那怎么实现呢?这时我们就无法通过Ocelot配置限流来进行自定义控制了,这块就需要我们增加自定义限流管道来实现功能。

下面我们就该功能如何实现展开讲解,希望大家先理解下功能需求,然后在延伸到具体实现。

二、数据库设计

限流这块设计表结构和关系如下。
640?wx_fmt=png

主要有限流规则表、路由限流规则表、限流组表、限流组策略表、客户端授权限流组表、客户端白名单表组成,设计思想就是客户端请求时先检查是否在白名单,如果白名单不存在,就检查是否在限流组里,如果在限流组里校验限流的规则是什么,然后比对这个规则和当前请求次数看是否能够继续访问,如果超过限流策略直接返回429状态,否则路由到下端请求。

梳理下后发现流程不是很复杂,最起码实现的思路非常清晰,然后我们就运用上篇自定义授权中间件的方式来开发我们第二个中间件,自定义限流中间件。

三、功能实现

1、功能开启配置

网关应该支持自定义客户端限流中间件是否启用,因为一些小型项目是不需要对每个客户端进行单独限流的,中型和大型项目才有可能遇到自定义配置情况,所以我们需要在配置文件增加配置选项。在AhphOcelotConfiguration.cs配置类中增加属性,默认不开启。

640?wx_fmt=png

那我们如何把自定义的限流增加到网关流程里呢?这块我们就需要订制自己的限流中间件。

2、实现客户端限流中间件

首先我们定义一个自定义限流中间件AhphClientRateLimitMiddleware,需要继承OcelotMiddleware,然后我们要实现Invoke方法,详细代码如下。

640?wx_fmt=png

640?wx_fmt=png

首先我们来分析下我们的代码,为了知道是哪个客户端请求了我们网关,需要提取clientId,分别从无需授权接口和需要授权接口两个方式提取,如果提取不到值直接给定默认值,放到全局限流里,防止绕过限流策略。然后根据客户端通过4步检验下是否允许访问(后面会介绍这4步怎么实现),如果满足限流策略直接返回限流错误提醒。

有了这个中间件,那么如何添加到Ocelot的管道里呢?上一篇介绍的非常详细,这篇我就不介绍了,自定义限流中间件扩展AhphClientRateLimitMiddlewareExtensions,代码如下。

640?wx_fmt=png

有了这个中间件扩展后,我们就在管道的合适地方加入我们自定义的中间件。我们添加我们自定义的管道扩展OcelotPipelineExtensions,然后把自定义限流中间件加入到认证之后。

//添加自定义限流中间件 2018-11-18 金焰的世界builder.UseAhphClientRateLimitMiddleware();

现在我们完成了网关的扩展和应用,是时候把定义的IClientRateLimitProcessor接口实现了 ,是不是感觉做一个中间件很简单呢?而且每一步都是层层关联,只要一步一步按照自己的想法往下写就能实现。

3、结合数据库实现校验及缓存

首先我们新建AhphClientRateLimitProcessor类来实现接口,中间增加必要的缓存和业务逻辑,详细代码如下。

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

我们来分析下这块代码,里面涉及了限流的提取和实现规则,首先我们注入了数据库实体接口和缓存信息,实现步骤是参照之前的流程。

主要流程如下:

1、路由是否启用限流,如果未启用直接完成校验,如果进行第2步判断.
2、客户端对应的路由是否设置了限流规则,如果未设置,直接完成校验,否则进入第3步判断.
3、客户端是否开启了路由白名单功能,如果开启了直接完成校验,否则进入第4步。
4、使用Redis来进行限流的判断。使用的就是计数器方法,结合redis设置key的过期时间来实现的。

为了减少后端请求,在数据库提取的方法前都加入了缓存,现在我们需要把用到的接口添加到入口进行注入。

builder.Services.AddSingleton<IOcelotCache<RateLimitRuleModel>, InRedisCache<RateLimitRuleModel>>();builder.Services.AddSingleton<IOcelotCache<AhphClientRateLimitCounter?>, InRedisCache<AhphClientRateLimitCounter?>>();

现在我们还剩下IClientRateLimitRepository接口未实现,现在只要实现这个接口,然后注入下,我们就完成了限流中间件的开发了,我们根据限流的流程,梳理了实现,现在有3个方法需要进行实现。

新建SqlServerClientRateLimitRepository类,来开始实现我们与数据库的操作,有了上面的分析思路,现在就是把一个一个详细确定的方法实现而已,太简单了,只要花了几分钟后,就可以瞬间写出如下代码。

640?wx_fmt=png

640?wx_fmt=png

主要就是注意下表之间的关系,把实现注入到AddAhphOcelot里,现在就可以测试开始自定义客户端限流中间件。

builder.Services.AddSingleton<IClientRateLimitRepository, SqlServerClientRateLimitRepository>();

4、测试限流中间件

为了把把所有情况都测试一遍,先从开启限流,什么都不写入看是否能够正常运行。

option.ClientRateLimit = true;

还记得我们上篇的两个客户端和能访问的页面吗?就用它们来测试,结果显示正常,说明不开启限流没有影响。

开启/cjy/values2个限流规则,一个每1分钟访问1次,一个每1分钟访问60次。

--1、插入限流规则INSERT INTO AhphLimitRule VALUES('每1分钟访问1次','1m',1,1);INSERT INTO AhphLimitRule VALUES('每1分钟访问60次','1m',60,1);--2、应用到/cjy/values路由INSERT INTO AhphReRouteLimitRule VALUES(1,1);INSERT INTO AhphReRouteLimitRule VALUES(2,1);

因为还未给客户端应用规则,所以应该也是可以正常访问,可以使用PostMan测试下,测试时需要注意下缓存,因为所有的访问都启用的默认缓存策略,经测试得到预期效果。

现在开始把限流分别应用到客户端1和客户端2,看下限流效果。

640?wx_fmt=png

然后使用PostMan测试客户端1和客户端2,结果如下,超过设置的频率后不返回结果,达到预期目的,但是返回的是404错误,强迫症患者表示这不优雅啊,应该是429 Too Many Requests,那我们如何修改呢?
640?wx_fmt=png

640?wx_fmt=png

这里就需要了解下错误信息是如何输出的,需要查看Ocelot源码,您会发现IErrorsToHttpStatusCodeMapper接口和ErrorsToHttpStatusCodeMapper实现,代码如下,

640?wx_fmt=png

可以发现因为未定义RateLimitOptionsError错误的状态码,增加一个判断即可,那我们重写下把,然后集成在我们自己的中间件里,这块在后期有很多扩展能够用到,增加如下代码。

if (errors.Any(e => e.Code == OcelotErrorCode.RateLimitOptionsError))
{    return 429;
}

然后重新注入下。

builder.Services.AddSingleton<IErrorsToHttpStatusCodeMapper, AhphErrorsToHttpStatusCodeMapper>();

在重新测试下访问限流地址。
640?wx_fmt=png

奈斯,达到了我们预期的效果,.netcore 开发魅力体现出来了吗?

我们增加客户端1的路由白名单,然后再继续测试看是否解除限流限制?

--6、设置客户端1/cjy/values路由白名单INSERT INTO AhphClientReRouteWhiteList VALUES(1,2);

注意测试时清除缓存

经测试不受限流控制,达到了我们最终目的,到此限流功能全部实现。

5、增加mysql支持

直接重写IClientRateLimitRepository实现,然后注入实现。

builder.Services.AddSingleton<IClientRateLimitRepository, MySqlClientRateLimitRepository>();

四、总结及预告

本篇我们讲解的是网关如何实现自定义客户端限流功能,从设计到实现一步一步详细讲解,虽然只用一篇就写完了,但是涉及的知识点还是非常多的,希望大家认真理解实现的思想,看我是如何从规划到实现的,为了更好的帮助大家理解。大家可以根据博客内容自己手动实现下,有利于消化,如果在操作中遇到什么问题,可以加.NET Core项目实战交流群(QQ群号:637326624)咨询作者。

从下一篇开始介绍IdentityServer4的相关应用,并配合我们的网关实现认证,在跟我教程学习的朋友,可以自己先预习下。

相关文章:

  • AspNetCore中使用Ocelot之 IdentityServer4

  • Ocelot-基于.NET Core的开源网关实现

  • .NET Core微服务之基于Ocelot+IdentityServer实现统一验证与授权

  • Swagger如何访问Ocelot中带权限验证的API

  • Ocelot.JwtAuthorize:一个基于网关的Jwt验证包

  • .NET Core微服务之基于Ocelot实现API网关服务

  • .NET Core微服务之基于Ocelot实现API网关服务(续)

  • .NET微服务体系结构中为什么使用Ocelot实现API网关

  • Ocelot简易教程(一)之Ocelot是什么

  • Ocelot简易教程(二)之快速开始1

  • Ocelot简易教程(二)之快速开始2

  • Ocelot简易教程(三)之主要特性及路由详解

  • Ocelot简易教程(四)之请求聚合以及服务发现

  • Ocelot简易教程(五)之集成IdentityServer认证以及授权

  • Ocelot简易教程(六)之重写配置文件存储方式并优化响应数据

  • Ocelot简易教程(七)之配置文件数据库存储插件源码解析

  • ASP.NET Core中Ocelot的使用:API网关的应用

  • ASP.NET Core中Ocelot的使用:基于Spring Cloud Netflix Eureka的动态路由

  • ASP.NET Core中Ocelot的使用:基于服务发现的负载均衡

  • 【.NET Core项目实战-统一认证平台】第一章 功能及架构分析

  • 定制Ocelot来满足需求

  • 【.NET Core项目实战-统一认证平台】第三章 网关篇-数据库存储配置(1)

  • 【.NET Core项目实战-统一认证平台】第四章 网关篇-数据库存储配置(2)

  • 【.NET Core项目实战-统一认证平台】第五章 网关篇-自定义缓存Redis

  • 【.NET Core项目实战-统一认证平台】第六章 网关篇-自定义客户端授权

原文地址:https://www.cnblogs.com/jackcao/p/9987424.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg

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

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

相关文章

1.14 日志(递推ybtoj)

明天要模拟&#xff0c;n年未碰电脑&#xff0c;先不学新的了。。。。 1.错排问题 dp最棒了 code: #include #include #include #include #include using namespace std; const int MINT_MAX; long long f[25][25]{ };//f[i][j]表示有i个数&#xff0c;其中j个数可以随便填 …

平面分割 题解(1.16 递推模拟)

平面分割 代码一行&#xff0c;解析一箱~~ 解析 计f[i]&#xff1a;从1到i累加之和 先假设最好情况&#xff0c;p2&#xff1b; 此时第一条会增加1个 第二条与第一条相交&#xff0c;再加2个 第三条与前2条相交&#xff0c;再加3个 … 故n条时共增加f[n]个&#xff0c;共f[n]…

.NET Core实战项目之CMS 第二章 入门篇-快速入门ASP.NET Core看这篇就够了

本来这篇只是想简单介绍下ASP.NET Core MVC项目的&#xff08;毕竟要照顾到很多新手朋友&#xff09;&#xff0c;但是转念一想不如来点猛的&#xff08;考虑到急性子的朋友&#xff09;&#xff0c;让你通过本文的学习就能快速的入门ASP.NET Core。既然是快速入门所以过多过深…

题解: 区间合并(opj 2-4-7620)

一开始轻视这道题了&#xff0c;想用各种各样奇怪的区间标记把这道题水掉&#xff0c;结果WA声一片。。&#xff08;我大意了&#xff0c;没有AC&#xff01;&#xff09; 后来大脑开始思考&#xff0c;贪心解决掉了&#xff0c;AC快乐~~&#xff08;忽略这道题来自分治…qwq&a…

牛客题霸 [二叉搜索树的第k个结点]C++题解/答案

牛客题霸 [二叉搜索树的第k个结点]C题解/答案 题目&#xff1a; 给定一棵二叉搜索树&#xff0c;请找出其中的第k小的结点。 题解&#xff1a; 二叉搜索树&#xff1a; 若它的左子树不空&#xff0c;则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空&#xf…

内部设计师揭秘!王者峡谷中竟有隐藏的c++代码??!!腾讯已经炸了!!!

解析 模拟的时候用关于n的一元二次方程实根公式解的不亦乐乎。。。后来经高人提醒才发现万物皆为斐波拉契。。 就很《离谱》 于是代码就不难了 也算有收获吧&#xff0c;遇到这种看起来莫名其妙的题时&#xff0c;不着急死磕&#xff0c;可以先写个上图一样的程序找找规律 “实…

.NET Core实战项目之CMS 第三章 入门篇-源码解析配置文件及依赖注入

写在前面上篇文章我给大家讲解了ASP.NET Core的概念及为什么使用它&#xff0c;接着带着你一步一步的配置了.NET Core的开发环境并创建了一个ASP.NET Core的mvc项目&#xff0c;同时又通过一个实战教你如何在页面显示一个Content的列表。不知道你有没有跟着敲下代码&#xff0c…

对.NET Core未来发展趋势的浅层判断

经常听到园里.NET开发人员在抱怨生态不如JAVA&#xff0c;想要转JAVA&#xff0c;所谓打不过你&#xff0c;我就加入你&#xff01;杜兰特的思维方式固然是获取总冠军的一种方式&#xff0c;但是我们要关起门来问自己有没有杜兰特的实力。用开发生态来类比NBA不是特别恰当&…

2021牛客暑期多校训练营1 H-Hash Function(数学+FFT)

H-Hash Function Shining_xzl大佬题解 本题答案符合题意的充分必要条件是&#xff1a;不能是任意两个数的差以及他们的因数&#xff0c;因此只需用用FFT求出这些数的差&#xff0c;记为差的集合。 从小到大考虑一个答案&#xff0c;以及答案的倍数是不是上述差的集合&#x…

priority_queue+贪心:运输(题解)

解析 不难发现每次都应合并最大的一对&#xff0c;从而使局部最优带动整体最优 sort就会很自然的想到 但是问题是合并完之后的新值可能已经不是当前最大了&#xff08;WA。。qwq&#xff09; 于是想到每次循环sort一遍&#xff0c;结果n^2logn又超时了。。。 在一位高人的指引…

【话题揭秘】某大型国有银行的敏捷落地实践

“某大型国有银行的敏捷落地实践”话题介绍银行行业是强烈依赖IT的非IT行业&#xff0c;传统金融要想打破现有局面&#xff0c;除了要解决外因&#xff0c;还要突破内部因素&#xff0c;其中一点就是技术重塑和战略手段&#xff0c;也就是常说的数字化转型&#xff0c;这也是经…

震惊!温州一程序员编完八皇后吐血而亡,他的代码是什么样子?!!

解析 经典大法师&#xff08;dfs哈哈哈&#xff09; 比较关键的是每条对角线上点的坐标之和或差是相同的&#xff0c;故可以用一维数组存储其状态 这题一开始用了双层循环&#xff0c;卡掉了4个点qwq 后来发现其实因为每行只有一个皇后&#xff0c;每次单层循环枚举j就可以实…

直播视频发布:Windows上的Linux容器和Azure混合云中的Kubernetes(k8s)

如果你还没有开始关注容器&#xff0c;那么你已经out了&#xff1b;如果你还在单机上运行容器&#xff0c;那么你out了。经过2013到2018年5年的演化&#xff0c;分化和进化&#xff1b;容器&#xff0c;Docker和Kubernetes已经是任何一家企业的IT解决方案都不能忽视的重要趋势。…

通过Microsoft Learn进行学习以提升技能

通过 Microsoft Learn&#xff0c;可以免费而且轻松有趣地学习 Microsoft 技术。Microsoft Learn的与众不同借助 Microsoft Learn&#xff0c;任何人都能按自己的学习计划和速度掌握重要的知识和概念。 使用者将能够访问培训资料、代码示例&#xff0c;以及免费试用产品。无论是…

asp.net core webApi 参数保护

Introasp.net core data protection 扩展&#xff0c;基于 IDataProtector 扩展的数据保护组件&#xff0c;自动化的实现某些参数的保护ParamsProtectionParamsProtection 是为了保护 asp.net core webapi 项目的某些参数而设计的&#xff0c;也可以用来做一定程度上的反爬虫。…

2021牛客暑期多校训练营2 J-Product of GCDs(数论+计数)

J-Product of GCDs Code1 对于每个质数以及每个质数的次幂单独考虑他们的贡献&#xff0c;由于多次使用快速幂导致TLE #include<bits/stdc.h> using namespace std; using lllong long; template <class Tint> T rd() {T res0;T fg1;char chgetchar();while(!is…

新汉诺塔(洛谷P1242)含第11个数据的解决办法

解析 应该从大到小一个个移&#xff0c;这样后面大盘就可以直接忽略&#xff0c;保证没有冗余操作&#xff0c;必定最优&#xff08;如果先移动小的&#xff0c;后面移动大的时还要动小的&#xff09; 对于第id个从当前位置到目标的移动有两种移动方案&#xff1a; 法1&#x…

让 .Net 更方便的导入导出Excel

Intro因为前一段时间需要处理一些 excel 数据&#xff0c;主要是导入/导出操作&#xff0c;将 Excel 数据转化为对象再用程序进行处理和分析&#xff0c;没有找到比较满意的库&#xff0c;于是就自己造了一个轮子&#xff0c;屏蔽掉了 xlsx 与 xls 的差别&#xff0c;屏蔽了 Np…

P7115-[NOIP2020]移球游戏【构造】

正题 题目链接:https://www.luogu.com.cn/problem/P7115 题目大意 n1n1n1个柱子&#xff0c;前面nnn个上面各有mmm个球&#xff0c;球有nnn种颜色&#xff0c;每种mmm个。 你每次可以把一个柱子最上面的球放到另一个上面&#xff0c;要求在820000820000820000次内使得同种颜色…

无限序列 (ybtoj C.3)

解析 乍一看很蒙的题 首先&#xff0c;a-b1的个数可以等价于**&#xff08;1-b&#xff09;1的个数减去&#xff08;1-a-1&#xff09;1的个数** 分析之后发现&#xff0c;经过多次变换后&#xff1a; 长度 1的个数 1 1 2 1 3 2 5 3 8 5 … … 又是熟悉的斐波拉契。。。 但是我…