一、限流

想要在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的限流、熔断和负载均衡的更多相关文章

  1. .Net微服务实践(四)[网关]:Ocelot限流熔断、缓存以及负载均衡

    目录 限流 熔断 缓存 Header转化 HTTP方法转换 负载均衡 注入/重写中间件 后台管理 最后 在上篇.Net微服务实践(三)[网关]:Ocelot配置路由和请求聚合中我们介绍了Ocelot的 ...

  2. .net core使用ocelot---第四篇 限流熔断

    简介 .net core使用ocelot---第一篇 简单使用 .net core使用ocelot---第二篇 身份验证 .net core使用ocelot---第三篇 日志记录 前几篇文章我们陆续介 ...

  3. Hystrix介绍以及服务的降级限流熔断

    (dubbo熔断,Hystrix问的少) 无论是缓存层还是存储层都会有出错的概率,可以将它们视同为资源.作为并发量较大的系统,假如有一个资源不可用,可能会造成线程全部 hang (挂起)在这个资源上, ...

  4. springBoot整合Sentinel实现降级限流熔断

    由于hystrix的停止更新,以及阿里Sentinel在历年双十一的贡献.项目中使用了Sentinel,今天我们来讲讲Sentinel的入门教程,本文使用1.6.3版本进行讲解 本文通过Sentine ...

  5. DBPack 限流熔断功能发布说明

    上周我们发布了 v0.4.0 版本,增加了限流熔断功能,现对这两个功能做如下说明. 限流 DBPack 限流熔断功能通过 filter 实现.要设置限流规则,首先要定义 RateLimitFilter ...

  6. .Net Core的API网关Ocelot的使用(二)[负载,限流,熔断,Header转换]

    网关的负载均衡 当下游拥有多个节点的时候,我们可以用DownstreamHostAndPorts来配置 { "UpstreamPathTemplate": "/Api_A ...

  7. .Net Core使用Ocelot网关(一) -负载,限流,熔断,Header转换

    1.什么是API网关 API网关是微服务架构中的唯一入口,它提供一个单独且统一的API入口用于访问内部一个或多个API.它可以具有身份验证,监控,负载均衡,缓存,请求分片与管理,静态响应处理等.API ...

  8. Spring Cloud alibaba网关 sentinel zuul 四 限流熔断

    spring cloud alibaba 集成了 他内部开源的 Sentinel 熔断限流框架 Sentinel 介绍 官方网址 随着微服务的流行,服务和服务之间的稳定性变得越来越重要.Sentine ...

  9. 使用Alibaba的Nacos做为SpringCloud的注册和配置中心,并结合Sentinel+Nocos动态进行限流熔断

    最近在学习阿里的Nacos组件以及Sentinel组件,折腾出了一个小demo. Git地址:https://github.com/yangzhilong/nacos-client 有兴趣的小伙伴可以 ...

  10. 深入学习spring cloud gateway 限流熔断

    前言 Spring Cloud Gateway 目前,Spring Cloud Gateway是仅次于Spring Cloud Netflix的第二个最受欢迎的Spring Cloud项目(就GitH ...

随机推荐

  1. C# 屏蔽词过滤

    参考:https://www.cnblogs.com/kubidemanong/p/10834993.html public class TreeNode { public char Char; pu ...

  2. 实时平台-Flink篇

    Flink任务统一通过实时平台统一管理的好处不用多说,这里简单介绍下实时平台-Flink模块的功能以及实现. 主要分为两大块 一.任务管理 任务管理主要包括任务的提交.暂停.下线.重启.历史版本回滚. ...

  3. noi 1.1 2 输出第二个整数

    描述 输入三个整数,把第二个输入的整数输出. 输入 只有一行,共三个整数,整数之间由一个空格分隔.整数是32位有符号整数. 输出 只有一行,一个整数,即输入的第二个整数. 样例输入 123 456 7 ...

  4. es6中箭头函数和this指向

    箭头函数相当于匿名函数,简化了函数定义. 箭头函数有两种写法,当函数体是单条语句的时候可以省略{}和return. 另一种是包含多条语句,不可以省略{}和return. 特点 箭头函数最大的特点就是没 ...

  5. 中国人民公安大学 Chinese people’ public security university 网络对抗技术 实验报告4

    中国人民公安大学 Chinese people' public security university 网络对抗技术 实验报告   实验四 恶意代码技术     学生姓名 陈禹 年级 2018 区队 ...

  6. mysql 的小问题

    首先按下win+R 执行 services.msc 进入服务,查找到MySQL,点击停止服务,然后在控制台cmd进入本地的MySQL文件夹,我的文件名是mysql-8.0.26-winx64,进入后执 ...

  7. Linux命令之nc命令

    1.简介 nc是netcat的简写,是一个功能强大的网络工具,有着网络界的瑞士军刀美誉.nc命令在linux系统中实际命令是ncat,nc是软连接到ncat.nc命令的主要作用如下: 实现任意TCP/ ...

  8. 修改allure图标和标题

    allure的logo更换步骤 1.找到allure安装目录,进入目录如:D:\Program Files\allure-2.17.3\plugins\custom-logo-plugin\stati ...

  9. Verilog 变量中位的数值类型

    Verilog 变量中位的数值类型 Verilog变量中每个位(bit)的数值类型有四种,分别为1,0,Z,X.其中1,0比较明确就是高.低电平.而x, z在逻辑设计中也经常用到来建模.X,Z既可以大 ...

  10. asp.net页面button按钮防止重复提交的方法

    网上找了一些实现方案都不行,就自己写了个用,还行. 先放javascript代码: <script type="text/javascript"> var clicks ...