(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中间件系列随笔(一):搭 ...
随机推荐
- 树型大融合——NOIP提高组2015 D1T3 【运输计划】
下午用一个小时看了一下树上差分,打了个差分模板,A了3题,真的爽! 题目描述: 公元2044 年,人类进入了宇宙纪元. L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之间,这 ...
- mysql通配符_,%查询
模糊查询 在使用模糊查询的时候,mysql使用的是最左原则,所以模糊查询语句: select * from sys_user where user_name like '#{userName}%' 我 ...
- SpringBoot使用activiti自定义流程demo解析
环境搭建[这里直接讲解自定义流程] 集成 Activiti Modeler 下载源码 我这里选用的是 Activiti 5.23.0 版本的页面,下载 zip,解压 Activiti 5.23.0 源 ...
- 多测师讲解性能测试_面试题_001高级讲师肖sir
什么叫做性能测试?1. 软件的性能是软件的一种非功能特性,它关注的不是软件是否能够完成特定的功能,所以一般来说性能测试介入的时机是在功能测试完成之后.另外,由定义中的及时性可知性能也是一种指标,可以 ...
- Cypress系列(65)- 测试运行失败自动重试
如果想从头学起Cypress,可以看下面的系列文章哦 https://www.cnblogs.com/poloyy/category/1768839.html 重试的介绍 学习前的三问 什么是重试测试 ...
- main函数标准写法
main函数签名 C++中允许两种格式,带参数的和不带参数的: int main() int main(int argc, const char* argv[]) 和C标准不同,C++中main函数必 ...
- docker查看ip
docker查看容器的网络ip docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' conta ...
- linux(centos8):安装prometheus服务端/node_exporter客户端(prometheus 2.18.1)
一,prometheus的用途 Prometheus是一个开源的系统监控和警报工具包 相比其他监控系统,它更适用于微服务的体系架构 它使用各种专用exporter,用来实现对硬件/存储/数据库/web ...
- C#中string类的几个方法(indexof、lastindexof、substring)(转)
String.IndexOf String.IndexOf 方法 (Char, Int32, Int32) 报告指定字符在此实例中的第一个匹配项的索引.搜索从指定字符位置开始,并检查指定数量的字符位置 ...
- tr命令-转换和删除字符
tr 转换和删除字符 支持标准输入 格式 tr [OPTION]...SET1[SET2] Translate, squeeze, and/or delete characters from stan ...