1.限流(Rate Limiting) 很多时候为了防止DoS攻击,我们会通过限流方式对上游请求进行限制,以保护下游服务不会负荷过载,为客户端提供高质量的资源服务。在Ocelot限流项目示例中,通
1.限流(Rate Limiting)
很多时候为了防止DoS攻击,我们会通过限流方式对上游请求进行限制,以保护下游服务不会负荷过载,为客户端提供高质量的资源服务。在Ocelot限流项目示例中,通过APIGateway项目路由RateLimitOptions选项可以配置限流。对解决方案的示例APIServices项目Get方法进行限流,文件配置具体代码如下:
{ "Routes": [ { "DownstreamPathTemplate": "/api/values", "DownstreamScheme": "http", "DownstreamHostAndPorts": [ { "Host": "localhost", "Port": 9001 } ], "UpstreamPathTemplate": "/customers", "UpstreamHttpMethod": [ "Get" ], "RateLimitOptions": { //客户端白名单。名单中的客户端不会被限流。 "ClientWhitelist": [], //是否启用限流。 "EnableRateLimiting": true, //限流时间(1s,5m,1h,1d)。在限流时间内限制请求数,需要等PeriodTimespan时间过去了,才能再次发起请求。 "Period": "1s", //限流时间间隔,限流后多少秒后才可以再次发起请求。 "PeriodTimespan": 3, //限制请求数。 "Limit": 1 } } ], //全局配置,所有下游服务都执行如下限流配置 "GlobalConfiguration": { "RequestIdKey": "OcRequestId", "AdministrationPath": "/administration", "RateLimitOptions": { //是否禁用X-Rate-Limit和Retry-After标头。 "DisableRateLimitHeaders": false, //限流返回的消息。 "QuotaExceededMessage": "Customize Tips!" } } }
下面来介绍下RateLimitOptions选项几个参数:
- ClientWhitelist:客户端白名单。名单中的客户端不会被限流。
- EnableRateLimiting:是否启用限流。
- Period:限流时间(1s,5m,1h,1d)。在限流时间内限制请求数,需要等PeriodTimespan时间过去了,才能再次发起请求。
- PeriodTimespan:限流时间间隔,限流后多少秒后才可以再次发起请求。
- Limit:限制请求数。
- DisableRateLimitHeaders:是否禁用X-Rate-Limit和Retry-After标头。
- QuotaExceededMessage:限流返回的消息。
- HttpStatusCode:限流时候,指定返回的HTTP状态代码。
- ClientIdHeader:允许您指定应用于标识客户端的标头。默认情况下为“ClientId”。
2.项目演示
2.1APIGateway项目
添加Ocelot服务注入和Logging信息输出:
public class Startup { public Startup(IWebHostEnvironment env) { var builder = new Microsoft.Extensions.Configuration.ConfigurationBuilder(); builder.SetBasePath(env.ContentRootPath) .AddJsonFile("appsettings.json") //add configuration.json .AddJsonFile("configuration.json", optional: false, reloadOnChange: true) .AddEnvironmentVariables(); Configuration = builder.Build(); } public IConfigurationRoot Configuration { get; } public void ConfigureServices(IServiceCollection services) { //输出Logging信息; services.AddLogging(logging => { logging.AddConsole(); logging.AddDebug(); }); //添加Ocelot服务; services.AddOcelot(Configuration); } public void Configure(IApplicationBuilder app) { //使用Ocelot; app.UseOcelot().Wait(); } }
2.2APIServices项目
项目添加一个Get方法,对应APIGateway项目的路由上下游配置,具体代码如下:
[Route("api/[controller]")] public class ValuesController : Controller { // GET api/values [HttpGet] public IEnumerable<string> Get() { return new string[] { "value1", "value2" }; } }
2.3项目运行
输入dotnet run --project 项目路径\项目文件.csproj把两个项目启动起来,通过在浏览器不断刷新上游服务地址,会看到如下信息:
根据上述信息可以知道在1秒时间内,如果请求数超过路由配置限制数,那么Ocelot网关就会直接返回429状态码和全局给客户端,不会再转发到对应下游服务方法去,防止了客户端恶意攻击,保证了下游服务不会负荷过载!
到此这篇关于ASP.NET Core设置Ocelot网关限流的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持自由互联。