一、限流

想要在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. POJ 1830 开关问题 异或高斯消元

    题目链接 将题目转化为矩乘问题 构建一个 \(n \times n\) 的开关信息矩阵,其中第 \(i\) 列第 \(j\) 行的元素为 \(0 / 1\) 代表在改变开关 \(i\) 的情况下开关 ...

  2. 【2020NOI.AC省选模拟#2】A. 旋转

    题目链接 原题解: 把每个点的坐标视为复数,那么每次询问就是区间求平均数(先求和然后除以个数).一个点绕着原点旋转就是乘以$(\cos 60^\circ +i\sin 60^\circ)$. 一个点绕 ...

  3. dota中的哲理

    战术和战略: 6k分和3k分玩家的最重要的区别不是英雄玩的不好,而是整体战略不明确. dota玩家游戏时长超过1000h的比比皆是,这些玩家里面分数差距相当大.高的7k往上,低的2k深坑爬不出来. 这 ...

  4. YML Exception 以及 java.nio.charset.MalformedInputException: Input length = 1

    在springboot项目中,第一次遇到的问题是 YML Exception java.nio.charset.MalformedInputException: Input length = 1 ,此 ...

  5. react native 上传图片(后面有空写一个,完整的案例)

    图片上传的思路很正确 https://www.jianshu.com/p/c9f030fa6754 1. 获取图片路径 利用react-native-image-crop-pick 从手机中获得图片的 ...

  6. ??????FormDataAccess

    using Genersoft.Fms.Center.Pub.Com;using Genersoft.Platform.AdpBizIntegration.Entity;using Genersoft ...

  7. Windows,easygui 安装

    在官网下载了easygui,但是根据网上的方法解压后将 easygui 文件夹(创建文件:easygui,只放easygui.py)放到Python36\Lib\site-packages下不行,有模 ...

  8. webpack1.x 打包文件过大优化

    1. 图片单独打包 module: { loaders: [ { test: /\.(jpe?g|png|gif|svg)$/, loader: 'url?limit=8192&name=./ ...

  9. nuxt.js的生命周期

    nuxt的生命周期分为客户端生命周期,服务端生命周期 1.服务端的生命周期 执行顺序为:nuxtServerlnit(store,context){},  类似于vue.js中的main.js.可以在 ...

  10. seleniumUI自动化学习记录

    2019.2.9 尝试了一个启动浏览器并打开指定网址的程序: 这里首先要注意的就是浏览器的版本和selenium jar包的版本必须符合才行,不然会报错 2019.9.16 必须要下载相应的chrom ...