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网关限流的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持编程网。