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服务质量的更多相关文章

  1. (8)ASP.NET Core3.1 Ocelot Consul服务注册与发现

    1.服务注册与发现(Service Discovery) ●服务注册:我们通过在每个服务实例写入注册代码,实例在启动的时候会先去注册中心(例如Consul.ZooKeeper.etcd.Eureka) ...

  2. (1)ASP.NET Core3.1 Ocelot介绍

    1.简介 Ocelot原本设计仅为与.NET Core一起使用的,它是一个.NET API网关,作为面向使用.NET运行微型服务/面向服务的体系结构需要统一的系统入口点,即当客户端(Web站点,手机A ...

  3. (2)ASP.NET Core3.1 Ocelot路由

    1.路由 前一个章节我们已经介绍过Ocelot,相信大家也了解到,Ocelot的主要功能是接收客户端等传入的HTTP请求,并将其转发到下游服务.Ocelot当前仅以另一个http请求的形式支持此功能( ...

  4. (3)ASP.NET Core3.1 Ocelot认证

    1.认证 当客户端通过Ocelot访问下游服务的时候,为了保护下游资源服务器会进行认证鉴权,这时候需要在Ocelot添加认证服务.添加认证服务后,随后使用Ocelot基于声明的任何功能,例如授权或使用 ...

  5. (4)ASP.NET Core3.1 Ocelot负载均衡

    1.负载均衡 Ocelot可以在每个路由的可用下游服务中实现负载均衡,这使我们更有效地选择下游服务来处理请求.负载均衡类型:●LeastConnection:根据服务正在处理请求量的情况来决定哪个服务 ...

  6. (7)ASP.NET Core3.1 Ocelot Swagger

    1.前言 前端与后端的联系更多是通过API接口对接,API文档变成了前后端开发人员联系的纽带,开始变得越来越重要,而Swagger就是一款让你更好的书写规范API文档的框架.在Ocelot Swagg ...

  7. 探索Asp net core3中的 项目文件、Program.cs和通用host(译)

    引言 原文地址 在这篇博客中我将探索一些关于Asp.net core 3.0应用的基础功能--.csproj 项目文件和Program源文件.我将会描述他们从asp.net core 2.X在默认模版 ...

  8. ASP.NET Core3.1使用IdentityServer4中间件系列随笔(三):创建使用[ClientCredentials客户端凭证]授权模式的客户端

    配套源码:https://gitee.com/jardeng/IdentitySolution 上一篇<ASP.NET Core3.1使用IdentityServer4中间件系列随笔(二):创建 ...

  9. ASP.NET Core3.1使用IdentityServer4中间件系列随笔(二):创建API项目,配置IdentityServer保护API资源

    配套源码:https://gitee.com/jardeng/IdentitySolution 接上一篇<ASP.NET Core3.1使用IdentityServer4中间件系列随笔(一):搭 ...

随机推荐

  1. 序列化的JavaScript

    下载 序列化的JavaScript序列化的JavaScript 将JavaScript序列化为包含正则表达式.日期和函数的JSON超集. 概述 这个包中的代码最初是作为表示状态的内部模块.为了扩展它的 ...

  2. 用C写一个简单的推箱子游戏(一)

    我现在在读大二,我们有一门课程叫<操作系统>,课程考查要求我们可以写一段程序或者写Windows.iOS.Mac的发展历程.后面我结合网上的资料参考,就想用自己之前简单学过的C写一关的推箱 ...

  3. 【4】进大厂必须掌握的面试题-Java面试-jdbc

    1.什么是JDBC驱动程序? JDBC驱动程序是使Java应用程序与数据库进行交互的软件组件.JDBC驱动程序有4种类型: JDBC-ODBC桥驱动程序 本机API驱动程序(部分为Java驱动程序) ...

  4. 多测师讲解接口测试 _postman(上)_高级讲师肖sir

    Postman 一.Postman介绍 Postman是一个网页调试工具,也可以调试css.html Postman的操作环境 环境:Postman Mac.Windows X32.Windows X ...

  5. ip地址和网络端口总结

    ip地址 ip地址默认指ipv4地址,用4个字节表示,转换为点分10进制,可以表达范围0.0.0.0到255.255.255.255的地址,大约为42.95亿个地址.互联网编号分配机构(IANA,In ...

  6. Markdown--补充版

    markdown语法实例 markdown语法实例 强调 分割线 引用 标题Setext方式 大标题 小标题 标题Atx方式 一级标题 二级标题 三级标题 四级标题 五级标题 六级标题 无序列表 有序 ...

  7. APP反编译Xposed-Fdex2脱壳

    1.首先手机安装Xposed(app) 2.安装Fdex2(app) 3.打开Fdex2 4.点击要脱壳的app 5.adb pull (点击脱壳app时候弹出的来的路径) 保存本地路径 6.完结-. ...

  8. 没事学学KVM(五)虚拟机基础管理

    1.今天学习一下KVM的开机自启功能.开机启动,即随宿主机启动而启动 virsh autostart vm-name 开机自启的前提是libvirt功能也是开机启动的:systemctl enable ...

  9. 理解import声明 与 export声明

    import的两种使用方法 import "mod"; // 引入一个模块 import v from "mod"; // 把模块默认的导出值放入变量 v im ...

  10. D. Tavas and Malekas 解析(字串匹配)

    Codeforce 535 D. Tavas and Malekas 解析(字串匹配) 今天我們來看看CF535D 題目連結 題目 給你一個字串$p$和一些$index$代表字串$p$在哪些位置會和長 ...