ASP.NET Core设置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网关限流的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • ASP.NET Core Api网关Ocelot的使用初探

    概述 Ocelot面向使用.NET运行微型服务/面向服务的体系结构的人员,这些体系结构需要在系统中具有统一的入口点.特别是我想与IdentityServer参考和承载令牌轻松集成.Ocelot是按特定顺序排列的一堆中间件.Ocelot将HttpRequest对象操作到由其配置指定的状态,直到到达请求构建器中间件,在该中间件中它创建一个HttpRequestMessage对象,该对象用于向下游服务发出请求.发出请求的中间件是Ocelot管道中的最后一件事.它不会调用下一个中间件.有一块中间件可将H

  • .Net Core微服务网关Ocelot集成Consul

    有consul基础的都知道,consul可以发现新增的服务,剔除掉无效的服务,赋予应用自动伸缩的能力.而ocelot如果集成了consul,那ocelot也能拥有这些能力,还可以自主选择负载均衡策略,灵活性更强. (建议看完前一篇文章再来实践这一篇,不然可能有难度) 上干货. 首先打开上一篇新建好的项目,继续添加nuget包: 然后注册相关服务: public void ConfigureServices(IServiceCollection services) { services.AddOc

  • .Net Core微服务网关Ocelot基础介绍及集成

    网关是什么 简单来说,网关就是暴露给外部的请求入口.就和门卫一样,外面的人想要进来,必须要经过门卫.当然,网关并不一定是必须的,后端服务通过http也可以很好的向客户端提供服务.但是对于业务复杂.规模庞大的项目来说,使用网关有很多无法舍弃的好处,比如可以进行统一的请求聚合来节省流量.降低耦合度,可以赋予项目熔断限流的能力提高可用性等等. ocelot是什么 ocelot是.net core实现的开源的api网关项目,开源地址:https://github.com/ThreeMammals/Oce

  • ASP.NET Core3.1 Ocelot路由的实现

    1.路由 前一个章节我们已经介绍过Ocelot,相信大家也了解到,Ocelot的主要功能是接收客户端等传入的HTTP请求,并将其转发到下游服务.Ocelot当前仅以另一个http请求的形式支持此功能(将来可能是任何传输机制). Ocelot将一个请求路由到另一个请求.为了让Ocelot正常工作,您需要在配置中设置一个Route.下面我们就Ocelot基础项目构建简单介绍下路由功能. 2.Ocelot基础项目构建(APIGatewayBasicDemo) 现在我们根据GitHub贡献者开源项目来学

  • ASP.NET Core3.1 Ocelot认证的实现

    1.认证 当客户端通过Ocelot访问下游服务的时候,为了保护下游资源服务器会进行认证鉴权,这时候需要在Ocelot添加认证服务.添加认证服务后,随后Ocelot会基于授权密钥授权每个请求可以访问的资源.用户必须像往常一样在其Startup.cs中注册身份验证服务,但是他们为每次注册提供一个方案(身份验证提供者密钥),例如: public void ConfigureServices(IServiceCollection services) { var authenticationProvide

  • ASP.NET Core3.1 Ocelot负载均衡的实现

    1.负载均衡 Ocelot可以在每个路由的可用下游服务中实现负载均衡,这使我们更有效地选择下游服务来处理请求.负载均衡类型: LeastConnection:根据服务正在处理请求量的情况来决定哪个服务来处理新请求,即将新请求发送到具有最少现有请求的服务去处理.算法状态没有分布在Ocelot集群中. RoundRobin:遍历可用服务并发送请求.算法状态没有分布在Ocelot集群中. NoLoadBalancer:从配置或服务发现中获取第一个可用服务来处理新请求. CookieStickySess

  • .Net Core微服务网关Ocelot超时、熔断、限流

    基本概念 超时.熔断.限流听起来好像很远,但实际上用在方方面面.很多人可能还搞不懂熔断是做什么,其实可以把熔断理解为一种防护措施.做个假设,在微服务体系下,某个下游服务响应很慢,然后随着时间推移,会有越来越多的请求堆积,从而会导致各种严重后果,单说连接池大量被占用就很要命.更不用说服务之间还要相互调用,你等我10秒,我等你5秒,不仅毫无体验感,高可用也就成了空谈.不如换个思路:与其等10秒返回一个请求失败,不如马上就返回请求失败.这样一来,请求堆不起来,资源也有时间释放或者恢复.这个动作就叫熔断

  • ASP.NET Core中的Ocelot网关介绍

    目录 1.简介 2.Ocelot配置 2.1基础集成(Basic Implementation) 2.2集成IdentityServer(With IdentityServer) 2.3多个网关实例集群(Multiple Instances) 2.4集成Consul服务发现(With Consul) 2.5集成Service Fabric(With Service Fabric) 3.总结 1.简介 Ocelot原本设计仅为与.NET Core一起使用的,它是一个.NET API网关,作为面向使

  • ASP.NET Core设置Ocelot网关限流

    1.限流(Rate Limiting) 很多时候为了防止DoS攻击,我们会通过限流方式对上游请求进行限制,以保护下游服务不会负荷过载,为客户端提供高质量的资源服务.在Ocelot限流项目示例中,通过APIGateway项目路由RateLimitOptions选项可以配置限流.对解决方案的示例APIServices项目Get方法进行限流,文件配置具体代码如下: { "Routes": [ { "DownstreamPathTemplate": "/api/v

  • ASP.NET Core使用固定窗口限流

    目录 算法原理 算法实现 进程内即内存固定窗口算法 基于Redis的固定窗口算法 算法应用 1.安装Nuget包 2.使用中间件 算法原理 固定窗口算法又称计数器算法,是一种简单的限流算法.在单位时间内设定一个阈值和一个计数值,每收到一个请求则计数值加一,如果计数值超过阈值则触发限流,如果达不到则请求正常处理,进入下一个单位时间后,计数值清零,重新累计. 如上图所示,时间单位是1秒,阈值是3. 第1秒3个请求,不会触发限流: 第2秒1个请求,不会触发限流: 第3秒4个请求,这一秒的前3个请求正常

  • ASP.NET Core为Ocelot网关配置Swagger

    1.前言 前端与后端的联系更多是通过API接口对接,API文档变成了前后端开发人员联系的纽带,开始变得越来越重要,而Swagger就是一款让你更好的书写规范API文档的框架.在Ocelot Swagger项目示例中,通过APIGateway项目路由配置网关.上下游服务Swagger.对解决方案中的示例APIServiceA.APIServiceB项目Get方法进行配置,文件配置具体代码如下: { "Routes": [ { //下游服务地址 "DownstreamPathTe

  • spring cloud gateway整合sentinel实现网关限流

    这篇文章主要介绍了spring cloud gateway整合sentinel实现网关限流,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 说明: sentinel可以作为各微服务的限流,也可以作为gateway网关的限流组件. spring cloud gateway有限流功能,但此处用sentinel来作为替待. 说明:sentinel流控可以放在gateway网关端,也可以放在各微服务端. 1,以父工程为基础,创建子工程 2,添加pom依赖

  • Asp.Net Core使用Ocelot结合Consul实现服务注册和发现

    目录 1.服务注册与发现(Service Discovery) 2.Consul 3.Asp.Net Core向Consul注册服务实例 4.项目演示 4.1APIGateway项目 4.2Common项目 4.3APIServiceA项目 4.4APIServiceB项目 4.5项目运行 1.服务注册与发现(Service Discovery) 服务注册:我们通过在每个服务实例写入注册代码,实例在启动的时候会先去注册中心(例如Consul.ZooKeeper.etcd.Eureka)注册一下,

  • ASP.NET Core设置URLs的五种方法

    目录 前言 URL格式 前提条件 方法1 使用环境变量 方法2 使用命令行参数 方法3 使用配置文件 方法4 使用UseUrls 方法5 使用Kestrel 优先级 总结 前言 在使用ASP.NET Core 3.1开发时,需要配置服务器监听的端口和协议,官方帮助文档进行简单说明,文档中提到了4种指定URL的方法 设置ASPNETCORE_URLS 环境变量: 使用dotnet --urls 命令行参数: 使用urls作为键进行配置: 使用UseUrls扩展方法: 为便于讲清楚URLs设置方法,

  • Java微服务Filter过滤器集成Sentinel实现网关限流过程详解

    目录 Gateway-过滤器Filter 局部路由过滤器 使用局部过滤器 全局过滤器 使用全局过滤器 集成Sentinel实现网关限流 网关限流 API分组限流 Gateway-过滤器Filter 过滤器就是在请求的传递过程中,对请求和响应做一些手脚. 在Gateway中, Filter的生命周期只有两个:“pre”和“post”". .PRE:这种过滤器在请求被路由之前调用.我们可利用这种过滤器实现身份验证.在集群中选择请求的微服务.记录调试信息等. .POST:这种过滤器在路由到微服务以后执

  • Asp.net Core 如何设置黑白名单(路由限制)

    在原有的AspnetMvc中我们会使用到路由访问限制,在AppStart/RouteConfig.cs中写上如下: routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 但是在aspnet core mvc已经不存在RouteConfig.cs的这个给文件和这种写法,我们该如何在Aspnet core mvc中实现相同效果呢? 这里我们需要使用到的中间件时UrlFirewall 1)说明: UrlFirewall 是一个开源.轻便的对htt

  • 详解springboot+aop+Lua分布式限流的最佳实践

    一.什么是限流?为什么要限流? 不知道大家有没有做过帝都的地铁,就是进地铁站都要排队的那种,为什么要这样摆长龙转圈圈?答案就是为了限流!因为一趟地铁的运力是有限的,一下挤进去太多人会造成站台的拥挤.列车的超载,存在一定的安全隐患.同理,我们的程序也是一样,它处理请求的能力也是有限的,一旦请求多到超出它的处理极限就会崩溃.为了不出现最坏的崩溃情况,只能耽误一下大家进站的时间. 限流是保证系统高可用的重要手段!!! 由于互联网公司的流量巨大,系统上线会做一个流量峰值的评估,尤其是像各种秒杀促销活动,

  • Spring cloud 限流的多种方式

    在频繁的网络请求时,服务有时候也会受到很大的压力,尤其是那种网络攻击,非法的.这样的情形有时候需要作一些限制.例如:限制对方的请求,这种限制可以有几个依据:请求IP.用户唯一标识.请求的接口地址等等. 当前限流的方式也很多:Spring cloud 中在网关本身自带限流的一些功能,基于 redis 来做的.同时,阿里也开源了一款:限流神器 Sentinel.今天我们主要围绕这两块来实战微服务的限流机制. 首先讲 Spring cloud 原生的限流功能,因为限流可以是对每个服务进行限流,也可以对

随机推荐