一、限流

想要在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. 微信小程序云函数中管理短信验证码的完整SDK工具

    微信小程序云开发管理短信验证码并不是一件容易的事情,它不像其他web服务器开发中可以将验证码存放到session或者cookie中,你只能将其存到云开发的数据库中,实现起来非常困难.一个简单的需要短信 ...

  2. 解决tomcat8080端口占用问题

    解决tomcat8080端口占用问题 1. 使用管理员权限打开cmd 2. 输入 netstat -ano | findstr 8080 找出占用8080端口的进程pid netstat -ano | ...

  3. UNIT TWO

    声明 基于8086的寄存器共14个16位的,分别是 ax  bx  cx  dx  (通用寄存器) si  di  bp  sp    (基址与变址寄存器) cs  ss  ds  es   (段寄存 ...

  4. CPU密集型和IO密集型与线程池的配置

    CPU密集型任务应配置尽可能小的线程,如配置CPU数目+1个线程的线程池.由于IO密集型任务线程并不是一直在执行任务,则应配置尽可能多的线程,如2*CPU数目.

  5. 使用cpu-z简单看处理器,显卡等

    心血来潮想了解一下自己的电脑.在网上搜索cpu-z,大小只有几百kb.下面以我自己电脑为例,上图: 某些地方我也不是很了解,不太了解的我就直接跳过了.在网上查阅相关资料后,有下面的认识: (1)处理器 ...

  6. oracle表中增加字段sql

    declare v_Count1 int := 0; v_Count2 int := 0;begin select count(1) into v_Count1 from user_all_table ...

  7. 6-8次PTA题目集总结

    一,前言 1,第六次作业(针对电信计费) 本次作业主要是对类的操作,题目已经给出类图,类图里面已经给了各种方法以及属性.此次作业涉及了座机的计费方式,市内省内省外怎么计费.难度偏难,主要是各类之间怎么 ...

  8. 反序列化 sqlserver 中的 sysdiagrams,找到其中包含的表的信息

    转载于:Script SQL Server 2005 diagrams to a file - CodeProject /** <summary> Based on ufn_Varbina ...

  9. geoserver leaflet 使用wms

    注意事项 1.  地址是 http://192.168.31.120:8080/geoserver/cite/wms   不需要后面 2. 名称 city:Polyline3 3.默认层级别调试为0  ...

  10. Long类型转换为IP String

    package com.barry.iputil.util; public class IPFormat { public static String toIPStr(Long LongIP) { i ...