(5)ASP.NET Core3.1 Ocelot服务质量
1.服务质量(Quality of Service)
对于微服务来说,熔断就是我们常说的“保险丝”,意思是当服务出现某些状况时候,通过切断服务防止应用程序不断地执行可能会失败的操作造成系统崩溃,或者大量的超时等待导致系统卡死等情况。而Ocelot也支持熔断,当客户端通过上游向下游服务发出请求时候,我们可以基于每个路由上配置熔断功能。Ocelot使用了Polly的.NET库中的熔断功能,安装命令如下:
Install-Package Ocelot.Provider.Polly
在Ocelot服务质量项目示例中,通过网关层的路由QoSOptions选项可以配置熔断功能。网关项目中配置一个下游服务加入了熔断功能,一个则没有,对应下文APIServices项目两个Get方法,具体代码如下:
{
"Routes": [
{
"DownstreamPathTemplate": "/api/values",
"DownstreamScheme": "http",
"DownstreamHostAndPorts": [
{
"Host": "localhost",
"Port": 9001
}
],
"UpstreamPathTemplate": "/customers",
"UpstreamHttpMethod": [ "Get" ],
"QoSOptions": {
//该值必须大于0,该值是指当异常发生达到此值会熔断。
"ExceptionsAllowedBeforeBreaking": 2,
//该值指熔断后会保持多久。该值的单位是毫秒。
"DurationOfBreak": 3000,
//该值指定当请求超过此值会被自动设置为超时。同样该值的单位是毫秒。
"TimeoutValue": 2000
}
},
{
"DownstreamPathTemplate": "/api/values/{id}",
"DownstreamScheme": "http",
"DownstreamHostAndPorts": [
{
"Host": "localhost",
"Port": 9001
}
],
"UpstreamPathTemplate": "/customers/{id}",
"UpstreamHttpMethod": [ "Get" ]
}
]
}
下面来介绍下QoSOptions选项几个参数:
●ExceptionsAllowedBeforeBreaking:该值必须大于0,该值是指当异常发生达到此值会熔断。
●DurationOfBreak:该值指熔断后会保持多久。该值的单位是毫秒。
●TimeoutValue:该值指定当请求超过此值会被自动设置为超时。同样该值的单位是毫秒。
根据官网文档说明,如果路由配置里面不加入QoSOptions选项,则不使用熔断功能,但是Ocelot会将在所有下游请求默认为90秒超时。
2.项目演示
2.1APIGateway项目
Ocelot要使用熔断功能需要注册Polly服务,所以需在网关项目的ConfigureServices方法中加入如下代码:
public virtual void ConfigureServices(IServiceCollection services)
{
//注册Polly服务
services.AddOcelot().AddPolly();
}
2.2APIServices项目
项目添加两个Get方法作对比,对应网关层的路由上下游配置,一个加入计数变量条件判断,如果计数变量超过等于小于3则等待6秒;一个传参即可,具体代码如下:
[Route("api/[controller]")]
public class ValuesController : Controller
{
private static int _count = 0;
// GET api/values
[HttpGet]
public IEnumerable<string> Get()
{
_count++;
System.Console.WriteLine($"get...{_count}");
if (_count <= 3)
{
System.Console.WriteLine($"circuit breaker...{_count}");
Thread.Sleep(6000);
}
return new string[] { "value1", "value2" };
}
// GET api/values/5
[HttpGet("{id}")]
public string Get(int id)
{
return "value";
}
}
2.3项目运行
输入dotnet run --project 项目路径\项目文件.csproj把两个项目启动起来,在浏览器上连续刷新三次上游服务地址http://localhost:9000/customers,会看到如下信息:

结合APIGateway项目网关配置QoSOptions选项和APIServices项目Get方法代码可以看到:_count变量是0-3的时候,会等待6秒才会输出字符串数组返回给客户端。当_count小于等于2的时候,控制台会输出Get方法_count变量信息,但是因为QoSOptions.TimeoutValue设置了2秒超时,所以在等待2秒后就直接切断服务请求返回503状态码给客户端,不会再进行下一步操作。而当_count等于3的时候,控制台并没有返回_count变量信息,这是为什么呢?因为QoSOptions.ExceptionsAllowedBeforeBreaking选项设置了2次请求异常或者超时处理时直接熔断,所以当第三次请求时,连下游服务都没分发就直接返回503状态码给客户端。下面我们再来看看第四次请求:
这时候会看到第四次请求跟第一二次请求是一样的状态码、回调结果,差不多的耗时,这证明QoSOptions配置生效了!而当第五次请求时候,我们就会看到成功获取Get回调字符串数组:
然后我们在浏览器上刷新http://localhost:9000/customers/1几次,会看到如下信息:
没添加熔断配置的服务是没有限制,可以直接访问。
参考文献:
Ocelot官网
(5)ASP.NET Core3.1 Ocelot服务质量的更多相关文章
- (8)ASP.NET Core3.1 Ocelot Consul服务注册与发现
1.服务注册与发现(Service Discovery) ●服务注册:我们通过在每个服务实例写入注册代码,实例在启动的时候会先去注册中心(例如Consul.ZooKeeper.etcd.Eureka) ...
- (1)ASP.NET Core3.1 Ocelot介绍
1.简介 Ocelot原本设计仅为与.NET Core一起使用的,它是一个.NET API网关,作为面向使用.NET运行微型服务/面向服务的体系结构需要统一的系统入口点,即当客户端(Web站点,手机A ...
- (2)ASP.NET Core3.1 Ocelot路由
1.路由 前一个章节我们已经介绍过Ocelot,相信大家也了解到,Ocelot的主要功能是接收客户端等传入的HTTP请求,并将其转发到下游服务.Ocelot当前仅以另一个http请求的形式支持此功能( ...
- (3)ASP.NET Core3.1 Ocelot认证
1.认证 当客户端通过Ocelot访问下游服务的时候,为了保护下游资源服务器会进行认证鉴权,这时候需要在Ocelot添加认证服务.添加认证服务后,随后使用Ocelot基于声明的任何功能,例如授权或使用 ...
- (4)ASP.NET Core3.1 Ocelot负载均衡
1.负载均衡 Ocelot可以在每个路由的可用下游服务中实现负载均衡,这使我们更有效地选择下游服务来处理请求.负载均衡类型:●LeastConnection:根据服务正在处理请求量的情况来决定哪个服务 ...
- (7)ASP.NET Core3.1 Ocelot Swagger
1.前言 前端与后端的联系更多是通过API接口对接,API文档变成了前后端开发人员联系的纽带,开始变得越来越重要,而Swagger就是一款让你更好的书写规范API文档的框架.在Ocelot Swagg ...
- 探索Asp net core3中的 项目文件、Program.cs和通用host(译)
引言 原文地址 在这篇博客中我将探索一些关于Asp.net core 3.0应用的基础功能--.csproj 项目文件和Program源文件.我将会描述他们从asp.net core 2.X在默认模版 ...
- ASP.NET Core3.1使用IdentityServer4中间件系列随笔(三):创建使用[ClientCredentials客户端凭证]授权模式的客户端
配套源码:https://gitee.com/jardeng/IdentitySolution 上一篇<ASP.NET Core3.1使用IdentityServer4中间件系列随笔(二):创建 ...
- ASP.NET Core3.1使用IdentityServer4中间件系列随笔(二):创建API项目,配置IdentityServer保护API资源
配套源码:https://gitee.com/jardeng/IdentitySolution 接上一篇<ASP.NET Core3.1使用IdentityServer4中间件系列随笔(一):搭 ...
随机推荐
- JSOI 2008 【魔兽地图】
其实这题是我从noip前就开始做的...那个时候打的Pascal,一直TLE,转了C++之后我又写了一遍,A了... 辛酸史: 题目描述: DotR (Def ...
- RHSA-2017:2907-重要: wpa_supplicant 安全更新
[root@localhost ~]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) 修复命令: 使用root账号登陆She ...
- firewalld和iptables区别
在RHEL7里有几种防火墙共存:firewalld.iptables.ebtables,默认是使用firewalld来管理netfilter子系统,不过底层调用的命令仍然是iptables等. fir ...
- 使用AirtestProject+pytest做支付宝小程序UI自动化测试
一,前言 1,背景 因公司业务需要做支付宝小程序的UI自动化测试,于是在网上查找小程序的自动化资料,发现微信小程序是有自己的测试框架的,但几乎找不到支付宝小程序UI自动化测试相关的资料.白piao失败 ...
- thinkphp6.0.x 反序列化详记(一)
前言 这几天算是进阶到框架类漏洞的学习了,首当其冲想到是thinkphp,先拿thinkphp6.0.x来学习一下,体验一下寻找pop链的快乐. 在此感谢楷师傅的帮忙~ 环境配置 用composer指 ...
- keccak和sha3的区别
keccak应用 在以太坊中,用keccak哈希算法来计算公钥的256位哈希,再截取这256位哈希的后160位哈希作为地址值. keccak和sha3的区别 sha3由keccak标准化而来,在很多场 ...
- JS获取指定月份的天数几种方法
最近看到一个有意思的试题,正好在需求中也碰到类似的问题,即计算某个月的天数问题.碰到类似问题也许大部分会想是不是还要判断闰年.平年,如果这样想的话就复杂了,下面给出具体的计算方法. 获取月份天数方法一 ...
- 转 mysql show processlist 查看当前连接
show processlist和show full processlist processlist命令的输出结果显示了有哪些线程在运行,不仅可以查看当前所有的连接数,还可以查看当前的连接状态帮助识别 ...
- spring boot:redis+lua实现生产环境中可用的秒杀功能(spring boot 2.2.0)
一,秒杀需要具备的功能: 秒杀通常是电商中用到的吸引流量的促销活动方式 搭建秒杀系统,需要具备以下几点: 1,限制每个用户购买的商品数量,(秒杀价格为吸引流量一般会订的很低,不能让一个用户全部抢购到手 ...
- C# 8: 默认接口方法
翻译自 John Demetriou 2018年8月4日 的文章 <C# 8: Default Interface Methods>[1],补充了一些内容 C# 8 之前 今天我们来聊一聊 ...