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. ACM蒟蒻的爪巴之路

    ACM蒟蒻的爪巴之路 从今天开始ACM菜狗yjhdd的博客之路就要开始啦~ 以后会不定时更新题解以及自己的理解感悟和收获(ง •_•)ง (多半是想划水的时候来写写博客Orz)

  2. randomatic

    下载 randomaticrandomatic 使用简单的字符序列生成指定长度的随机字符串.原generate-password. 请考虑下面这个项目的作者,Jon Schlinkert主演的,考虑项 ...

  3. 多测师讲解python _unttest框架002(结合项目实战)_高级讲师肖sir

    第一种调用方法: if __name__ == '__main__':# #第一种运行方法:运行所有的用例 import unittestfrom selenium import webdriverf ...

  4. 多测师_肖sir_性能测试之性能测试了解001(jmeter)

    一.了解jmeter 1.Jmeter的概念? JMeter是Apache组织开发的基于Java的压力测试工具.具有开源免费.框架灵活.多平台支持等优势.除了压力测试外,JMeter在接口测试方面也有 ...

  5. 习题3-2 分子量(Molar Mass, ACM/ICPC Seoul 2007, UVa1586)

    #include<stdio.h> #include<string.h> #include<ctype.h> double getweight(char x) { ...

  6. SpringBoot+MongoDB实现物流订单系统

    码字不易,点赞收藏,养成习惯!原创作者公众号:bigsai.更多精彩期待与您分享!项目收录在github的MongoDB案例中,文章收录在回车课堂中如果没基础请看看前两篇(墙裂推荐)MongoDB从立 ...

  7. 关于umi-request GET请求参数携带数组

    在使用umi-request时候发现GET传递数组,后台在接收时只能接受到最后一个,对此记录一下. 问题: // 发送数据: request(url, { params: { select: [1,2 ...

  8. 单调队列优化题:最大数(P1198)

    题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值. 限制:不超过当前数列的长度.(L>0) ...

  9. docker启动服务---------------elasticsearch

      一 环境 vbox5.2.8 centos7     docker 19.03.1 elasticsearch 7.9.1 二 进入centos7启动dcoker systemctl start ...

  10. 2020年sublime text3可用的注册码

    2020年sublime text3可用的注册码 最近终于找到可以用的sublime text3注册码了,仅供各位同学交流学习使用.用完请删除,购买正版! ----- BEGIN LICENSE -- ...