.NET Core 微服务—API网关(Ocelot) 教程 [四]
前言:
上一篇 介绍了Ocelot网关和认证服务的结合使用,本篇继续介绍Ocelot相关请求聚合和Ocelot限流
一、请求聚合
Ocelot允许声明聚合路由,这样可以把多个正常的Routes打包并映射到一个对象来对客户端的请求进行响应。
例如:在获取订单记录时,也需要查看订单中对应的商品信息,这里的数据就来源于两个微服务:订单服务、商品服务。如果不使用聚合路由时,对于现实一个订单信息时,客户端需要调用两次服务请求,实际上会造成服务端额外的性能消耗。这是如果配置了聚合路由时,客户端只需要请求一次聚合路由,然后聚合路由会合并订单服务和商品服务的请求结果到一个对象中,并返回给客户端。使用Ocelot的此特性可以让你很容易的实现前后端分离的架构。接下来我们就来验证该功能的实现。
在ocelot.json中进行如下配置:
1、为每个Route设置一个Key属性:如:"Key": "Catalog"
2、在ocelot.json中添加Aggregates节点,并指定RouteKeys中指定1中设置的Key值组成的数组,并设置UpstreamPathTemplate匹配上游用户请求;它的工作方式和正常的Route类似。
调整后如下:
{
"Aggregates": [
{
"RouteKeys": [
"Catalog",
"Ordering"
],
"UpstreamPathTemplate": "/GetOrderDetail/{id}"
}
],
"GlobalConfiguration": {
},
"Routes": [
{
"DownstreamPathTemplate": "/api/Values/{id}",
"DownstreamScheme": "http",
"DownstreamHostAndPorts": [
{
"Host": "localhost",
"Port":
}
],
"UpstreamPathTemplate": "/Catalog/{id}",
"UpstreamHttpMethod": [ "Get", "Post" ],
"LoadBalancerOptions": {
"Type": "RoundRobin"
},
"Key": "Catalog"
},
{
"DownstreamPathTemplate": "/api/Values/{id}",
"DownstreamScheme": "http",
"DownstreamHostAndPorts": [
{
"Host": "localhost",
"Port":
}
],
"UpstreamPathTemplate": "/Ordering/{id}",
"UpstreamHttpMethod": [ "Get", "Post" ],
"LoadBalancerOptions": {
"Type": "RoundRobin"
},
"Key": "Ordering"
}
]
}
3、如图调整项目代码:返回不同结果

4、访问设置的聚合地址结果如下:
返回结果为设置的Key组合的数据结构。

5、如果服务出现异常会怎么样:
a) 如果当某个服务出现异常会返回什么呢?接下来做个验证,修改订单服务返回结果:
public IActionResult Get(int id)
{
throw new Exception("模拟异常");
}

如图所示返回的结果和正常是结构是相同的,只是Ordering返回的是异常信息;
b) 如果某个服务宕机,回得到什么结果呢?接下来停止了Ordering服务访问结果如下,得到502错误

6、如果默认的聚合返回的结果数据结构不是我们想要的,想要修改怎么办?答案是使用自定义聚合
a)添加一个自动以聚合器FakeDefinedAggregator, 必须实现IDefinedAggregator接口。这个聚合器的功能很简单,就是将两个聚合请求的结果,用逗号拼接起来返回
public class FakeDefinedAggregator : IDefinedAggregator
{
public FakeDefinedAggregator()
{
}
public async Task<DownstreamResponse> Aggregate(List<HttpContext> responses)
{ List<string> result = new List<string>();
foreach (var item in responses)
{
byte[] tmp = new byte[item.Response.Body.Length];
await item.Response.Body.ReadAsync(tmp, , tmp.Length);
var val = Encoding.UTF8.GetString(tmp);
result.Add(val);
}
var merge = string.Join(";", result.ToArray());
List<Header> headers = new List<Header>();
return new DownstreamResponse(new StringContent(merge), HttpStatusCode.OK, headers, "some reason");
}
}
b)注册自定义聚合器
services.AddOcelot()
.AddSingletonDefinedAggregator<FakeDefinedAggregator>();
c)修改ocelot.json配置文件
"Aggregates": [
{
"ReRouteKeys": [
"Orders",
"Products"
],
"UpstreamPathTemplate": "/GetOrderDetail/{id}",
"Aggregator": "FakeDefinedAggregator"
}
]
d)运行结果:
{"id":,"name":"Api.Catalog1"};{"id":,"name":"Api.Ordering"}}
二、限流
1、修改Route节点中的添加如下节点:
"RateLimitOptions": {
"ClientWhitelist": [],
"EnableRateLimiting": true,
"Period": "10m",
"PeriodTimespan": ,
"Limit":
}
2、在GlobalConfiguration添加如下节点:
//限流
"RateLimitOptions": {
"QuotaExceededMessage": "您的请求量超过了配额1/10分钟",
"HttpStatusCode":
}
3、配置说明:
在Route和GlobalConfiguration节点中添加了RateLimitOptions节点
ClientWhitelist - 白名单,也就是不受限流控制的客户端
EnableRateLimiting - 是否开启限流
Period & Limit - 在一段时间内允许的请求次数
PeriodTimespan - 客户端的重试间隔数,也就是客户端间隔多长时间可以重试
QuotaExceededMessage - 限流以后的提示信息
HttpStatusCode - 超出配额时,返回的http状态码
4、配置说明:
客户端在10分钟之内只允许请求一次,在请求之后3秒钟之后可以重试
总结:
1、请求聚合需要为每个Route设置一个Key,并设置Aggregates节点指定需要的RouteKeys。
2、请求聚合支持自定义设置返回结果:实现IDefinedAggregator接口,并注册自定义聚合器;
3、在需要对服务器请求进行限流时,Ocelot也能很好的支持
后续:
后续将对Consul介绍,并结合Ocelot使用。
.NET Core 微服务—API网关(Ocelot) 教程 [四]的更多相关文章
- .NET Core 微服务—API网关(Ocelot) 教程 [二]
上篇文章(.NET Core 微服务—API网关(Ocelot) 教程 [一])介绍了Ocelot 的相关介绍. 接下来就一起来看如何使用,让它运行起来. 环境准备 为了验证Ocelot 网关效果,我 ...
- .NET Core 微服务—API网关(Ocelot) 教程 [三]
前言: 前一篇文章<.NET Core 微服务—API网关(Ocelot) 教程 [二]>已经让Ocelot和目录api(Api.Catalog).订单api(Api.Ordering)通 ...
- .NET Core 微服务—API网关(Ocelot) 教程 [一]
前言: 最近在关注微服务,在 eShop On Containers 项目中存在一个API网关项目,引起想深入了解下它的兴趣. 一.API网关是什么 API网关是微服务架构中的唯一入口,它提供一个单独 ...
- .NET Core微服务二:Ocelot API网关
.NET Core微服务一:Consul服务中心 .NET Core微服务二:Ocelot API网关 .NET Core微服务三:polly熔断与降级 本文的项目代码,在文章结尾处可以下载. 本文使 ...
- .NET Core微服务之基于Ocelot实现API网关服务
Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.啥是API网关? API 网关一般放到微服务的最前端,并且要让API 网关变成由应用所发起的每个请求的入口.这样就可以明显的简化客户端 ...
- .NET Core微服务之基于Ocelot实现API网关服务(续)
Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.负载均衡与请求缓存 1.1 负载均衡 为了验证负载均衡,这里我们配置了两个Consul Client节点,其中ClientServic ...
- .NET Core微服务之基于Ocelot+IdentityServer实现统一验证与授权
Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.案例结构总览 这里,假设我们有两个客户端(一个Web网站,一个移动App),他们要使用系统,需要通过API网关(这里API网关始终作为 ...
- .NET Core微服务之基于Ocelot+Butterfly实现分布式追踪
Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.什么是Tracing? 微服务的特点决定了功能模块的部署是分布式的,以往在单应用环境下,所有的业务都在同一个服务器上,如果服务器出现错 ...
- .Net Core微服务入门全纪录(四)——Ocelot-API网关(上)
前言 上一篇[.Net Core微服务入门全纪录(三)--Consul-服务注册与发现(下)]已经使用Consul完成了服务的注册与发现,实际中光有服务注册与发现往往是不够的,我们需要一个统一的入口来 ...
随机推荐
- Python实现性能自动化测试的方法【推荐好文】
1.什么是性能自动化测试? ◆ 性能 △ 系统负载能力 △ 超负荷运行下的稳定性 △ 系统瓶颈 ◆ 自动化测试 △ 使用程序代替手工 △ 提升测试效率 ◆ 性能自动化 △ 使用代码模拟大批量用户 △ ...
- Java应用服务器之tomcat基础配置(二)
前文我们聊了下tomcat的配置文件相关格式和组件简介以及webapp目录结构,manger部署和host managera部署,回顾请参考https://www.cnblogs.com/qiuhom ...
- 程序员为什么要使用Markdown
为什么要学习markdown? 一个让你难以拒绝的理由:markdown可以让你养成了记录的习惯. 我自从使用了markdown之后,就喜欢了写文档,记录工作日志,记录周会,记录季度计划,记录学习目标 ...
- 一起聊聊PHP的几个设计模式
工厂模式 1.简单工厂模式 目的 简单工厂模式是一个精简版的工厂模式. 它与静态工厂模式最大的区别是它不是『静态』的.因为非静态,所以你可以拥有多个不同参数的工厂,你可以为其创建子类.甚至可以模拟 ...
- Ubuntu查看和设置Root账户
前言: 要在Linux中运行管理任务,必须要具有root(也称为超级用户)访问权限.在大多数Linux发行版中,拥有一个单独的root账户是很常见的,但是Ubuntu默认禁用root账户.这可以防止用 ...
- CentOS7编译安装php7.1配置教程详解
这篇文章主要介绍CentOS7编译安装php7.1的过程和配置详解,亲测 ,需要的朋友可以参考. 1.首先安装依赖包: yum install libxml2 libxml2-devel openss ...
- Cypress系列(41)- Cypress 的测试报告
如果想从头学起Cypress,可以看下面的系列文章哦 https://www.cnblogs.com/poloyy/category/1768839.html 注意 51 testting 有一篇文章 ...
- docker时区不正确的问题修改记
前一阵子有一台服务器,mysql的时间比北京时间晚了8个小时.我知道是时区的问题,但是不知道为什么弄成这样,宿主机没有问题,后来一看mysql的docker,时区是错的. mybatis-plus打印 ...
- SpringBoot2 整合MinIO中间件,实现文件便捷管理
本文源码:GitHub·点这里 || GitEE·点这里 一.MinIO简介 1.基础描述 MinIO是一个开源的对象存储服务.适合于存储大容量非结构化的数据,例如图片.视频.日志文件.备份数据和容器 ...
- IDEA 2020.1.2,IDEA 2020.1.3永久破解(持续更新)
1. 本教程适用于 IntelliJ IDEA 2020.1.3 以下所有版本,请放心食用~2. 本教程适用于 JetBrains 全系列产品,包括 IDEA. Pycharm.WebStorm.Ph ...