首页 > 其他分享 >Ocelot的限流、熔断和负载均衡

Ocelot的限流、熔断和负载均衡

时间:2023-03-19 12:56:10浏览次数:35  
标签:负载 Ocelot 熔断 均衡 services 限流 请求

 一、限流

 想要在Ocelot中设置限流,需要在设置如下绿色所示:

{
  "GlobalConfiguration": {
    "RateLimitOptions": {
      "DisableRateLimitHeaders": false,
      "QuotaExceededMessage": "Customize Tips!",
      "HttpStatusCode": 999,
      "ClientIdHeader": "Test"
    }
  },
  "Routes": [
    {
      "DownstreamPathTemplate": "/{everything}",
      "DownstreamScheme": "https",
      "DownstreamHostAndPorts": [
        {
          "Host": "localhost",
          "Port": 5001
        }
      ],
      "UpstreamPathTemplate": "/api/{everything}",
      "UpstreamHttpMethod": [ "Get", "Post" ],
      "RateLimitOptions": {
        "ClientWhitelist": [],
        "EnableRateLimiting": true,
        "Period": "1s",
        "PeriodTimespan": 1,
        "Limit": 1
      }
    }
  ]
}

Route中设置的参数解释如下:

ClientWhitelist:白名单,白名单内的客户端请求不会被限流。

Period:限流时间,如1s、5m、1h、1d等。如果在此时间段内发出的请求超过限制,则需要等待PeriodTimespan结束后再发出另一个请求。

PeriodTimespan:触发限流后多久后可以再次发起请求。

Limit:限流时间内限制的请求次数。

GlobalConfiguration中设置的参数解释如下:

DisableRateLimitHeaders:是否禁用X-Rate-Limit和Retry-After标头。

QuotaExceededMessage:限流返回的错误提示。

HttpStatusCode:设置限流发生后返回的HTTP状态码。

ClientIdHeader:指定应用于标识客户端的标头,默认是ClientId

然后看下效果:

二、熔断

Ocelot中熔断采用了Plloy来实现,我们需要先安装:

Install-Package Ocelot.Provider.Polly

 需要注入方法

builder.Services.AddOcelot().AddPolly();

然后在每个路由配置中添加以下配置,表示出现超过3次异常将会熔断1秒,请求超过5秒算超时。

"QoSOptions": {
    "ExceptionsAllowedBeforeBreaking":3,
    "DurationOfBreak":1000,
    "TimeoutValue":5000
}

ExceptionsAllowedBeforeBreaking必须大于0才能执行此规则,表示允许异常的次数。DurationOfBreak表示熔断时长,单位为毫秒。TimeoutValue表示超时时间,超过多久算超时,单位毫秒。

我们测试一下从下面的动图可以看到,我们三次超时后,熔断了的请求直接返回了503。

 

 三、负载均衡

Ocelot可以在每个路由的可用下游服务之间进行负载均衡,负载平衡有以下几种类型:

LeastConnection :追踪那些服务正在请求中,并且将最新的请求发送给当前请求最少的服务。

RoundRobin :轮询可用的服务并且发送请求,需要配合Consul才能对下线服务进行检测,否则还是直接报错的。

NoLoadBalancer :从配置或者服务中发现第一个可用的服务发送请求。

CookieStickySessions:使用cookie关联所有相关的请求到制定的服务,下面会细说。

使用负载均衡就是在一条路由中设置多个下游服务,然后选择一个负载均衡类型,如下:

{
    "DownstreamPathTemplate": "/api/posts/{postId}",
    "DownstreamScheme": "https",
    "DownstreamHostAndPorts": [
            {
                "Host": "10.0.1.10",
                "Port": 5000,
            },
            {
                "Host": "10.0.1.11",
                "Port": 5000,
            }
        ],
    "UpstreamPathTemplate": "/posts/{postId}",
    "LoadBalancerOptions": {
        "Type": "LeastConnection"
    },
    "UpstreamHttpMethod": [ "Put", "Delete" ]
}

 1、服务发现中使用负载均衡

如下设置完服务名后,会自动查找下游的主机和端口,并在任何可用的服务之间进行负载均衡请求。如果从Consul中添加和删除服务,那么Ocelot会停止调用删除的服务,并且调用添加的服务。

{
    "DownstreamPathTemplate": "/api/posts/{postId}",
    "DownstreamScheme": "https",
    "UpstreamPathTemplate": "/posts/{postId}",
    "UpstreamHttpMethod": [ "Put" ],
    "ServiceName": "product",
    "LoadBalancerOptions": {
        "Type": "LeastConnection"
    },
}

 2、CookieStickySessions

CookieStickySessions类型的负载均衡就是为了实现在有很多下游服务的时候共享会话状态,只需要如下设置就行。

LoadBalancerOptions 就是需要设置为CookieStickySessionsKey是用于实现此功能的cookie的关键字,Expiry 是希望执行会话的时间,以毫秒计算,每次请求都将刷新时间。

{
    "DownstreamPathTemplate": "/api/posts/{postId}",
    "DownstreamScheme": "https",
    "DownstreamHostAndPorts": [
            {
                "Host": "10.0.1.10",
                "Port": 5000,
            },
            {
                "Host": "10.0.1.11",
                "Port": 5000,
            }
        ],
    "UpstreamPathTemplate": "/posts/{postId}",
    "LoadBalancerOptions": {
        "Type": "CookieStickySessions",
        "Key": "ASP.NET_SessionId",
        "Expiry": 1800000
    },
    "UpstreamHttpMethod": [ "Put", "Delete" ]
}

如果有多个主机服务或者使用了Consul,那么CookieStickySessions会使用轮询的方式来选择下个服务器,目前是硬编码的,但是可以改变。

3、自定义负载均衡策略

当我们启用自定义的负载均衡时,Ocelot会根据负载均衡器的名称去查找,如果找到了就会使用。如果负载均衡的类型没有与注册的负载均衡类的名称匹配,那么将会返回500错误。没有设置负载均衡策略将是不会进行负载均衡的。

我们创建一个自定义负载均衡策略类MyCustomLoadBalancer,继承ILoadBalancer接口实现对应的接口

public class MyCustomLoadBalancer: ILoadBalancer
    {
        private readonly Func<Task<List<Service>>> _services;
        private readonly object _lock = new object();

        private int _last;

        public MyCustomLoadBalancer(Func<Task<List<Service>>> services)
        {
            _services = services;
        }

        public async Task<Response<ServiceHostAndPort>> Lease(HttpContext httpContext)
        {
            var services = await _services();
            lock (_lock)
            {
                if (_last >= services.Count)
                {
                    _last = 0;
                }

                var next = services[_last];
                _last++;
                return new OkResponse<ServiceHostAndPort>(next.HostAndPort);
            }
        }
        public void Release(ServiceHostAndPort hostAndPort)
        {
        }
    }

然后在注入该策略

s.AddOcelot().AddCustomLoadBalancer<MyCustomLoadBalancer>();

最后在配置文件中配置路由的策略类型名为我们定以的策略类的名称即可

//...    
"LoadBalancerOptions": {
    "Type": "MyCustomLoadBalancer"
 }
//...

 

标签:负载,Ocelot,熔断,均衡,services,限流,请求
From: https://www.cnblogs.com/xwc1996/p/17231128.html

相关文章

  • Ocelot使用与设置路由Routing
    一、安装Ocelot在程序包管理器控制台输入以下命令安装OcelotInstall-PackageOcelot二、新建两个项目我们新建两个.NetCoreWebAPI项目如下: 直接就是最初始化的......
  • Ocelot使用与设置路由Routing
    一、安装Ocelot在程序包管理器控制台输入以下命令安装OcelotInstall-PackageOcelot二、新建两个项目我们新建两个.NetCoreWebAPI项目如下: 直接就是最初始化的......
  • Asp-Net-Core开发笔记:使用RateLimit中间件实现接口限流
    前言最近一直在忙(2月份沉迷steam,3月开始工作各种忙),好久没更新博客了,不过也积累了一些,忙里偷闲记录一下。这个需求是这样的,我之前做了个工单系统,现在要对登录、注册、发起......
  • RateLimiter限流锁
    基础使用//初始化一个限流器RateLimiterrateLimiter=RateLimiter.create(2);//执行限流方法voiddoSomething(){rateLimiter.acquire();//dosomething}使......
  • ASP.NET Core Web API 接口限流
    前言ASP.NETCoreWebAPI接口限流、限制接口并发数量,我也不知道自己写的有没有问题,抛砖引玉、欢迎来喷!需求写了一个接口,参数可以传多个人员,也可以传单个人员,时间范围......
  • 服务降级&熔断&限流
    服务降级&熔断&限流一、高并发&高可用其实我们讲过所有的SpringCloud知识,都为了解决两个问题:一个是高并发,一个是高可用。解决高并发&高可用问题的方法有很多,比如:从应......
  • gateway整合Sentinel实现资源限流
    转:整合Sentinel实现资源限流整合Sentinel实现资源限流 SpringCloudGateway默认为我们提供了一种限流方法:RequestRateLimiterGatewayFilterFactory。但这种方法实......
  • NetCore Ocelot
       Ocelot是一个用.NETCore实现并且开源的API网关,功能包括:路由,请求聚合,服务验证,鉴权,限流熔断,并内置了负载均衡器与ServiceFabric,ButteflyTracing集成。这些功能都......
  • NetCore Ocelot 之 请求聚合 Aggregator
    Ocelot允许声明聚合路由,把多个Routes请求batch一个对象来对客户端的请求进行响应。1、ocelotconfiguration{"DownstreamPathTemplate":"/api/service1",......
  • 接口限流常见算法方案原理 及其 实现(Guava RateLimiter,Redis+AOP+Lua)
    (目录)什么是限流?为什么要限流?限流,这个词其实并不陌生,在我们生活中也随处可见。做核酸时,工作人员会在核酸检测点的空地上摆放着弯弯曲曲的围栏,人们排着队左拐右拐的往前......