Ocelot允许您指定聚合多个普通ReRoutes的Aggregate ReRoutes(聚合路由),并将其响应映射到一个对象中。一般用于当您有一个客户端向服务器发出多个请求,而这些请求可以合并成一个的时候。此功能允许您通过Ocelot实现前端类型结构的后端。

此功能是问题 79的一部分,并且作为问题 298的一部分进行了进一步改进。

为了设置它,你必须在ocelot.json中做如下的事情。 这里我们已经指定了两个普通的ReRoutes,每一个都有一个Key属性。 然后,我们使用ReRouteKeys列表中的键指定组成两个ReRoutes的聚合,然后设置UpstreamPathTemplate,它的工作方式与普通的ReRoute相似。 很明显,您不能在ReRoutes和Aggregates之间复制UpstreamPathTemplates。 除RequestIdKey之外,您可以使用普通ReRoute所有的选项(在下面的陷阱中进行了解释)。

高级应用-注册你自己的聚合器

Ocelot只是基本的请求聚合,然后我们添加了一个更高级的方法,让用户从下游服务中获取响应,然后将它们聚合到响应对象中。

ocelot.json的设置与基本聚合方法几乎相同,只需额外添加一个Aggregator属性,如下所示。

{
"ReRoutes": [
{
"DownstreamPathTemplate": "/",
"UpstreamPathTemplate": "/laura",
"UpstreamHttpMethod": [
"Get"
],
"DownstreamScheme": "http",
"DownstreamHostAndPorts": [
{
"Host": "localhost",
"Port": 51881
}
],
"Key": "Laura"
},
{
"DownstreamPathTemplate": "/",
"UpstreamPathTemplate": "/tom",
"UpstreamHttpMethod": [
"Get"
],
"DownstreamScheme": "http",
"DownstreamHostAndPorts": [
{
"Host": "localhost",
"Port": 51882
}
],
"Key": "Tom"
}
],
"Aggregates": [
{
"ReRouteKeys": [
"Tom",
"Laura"
],
"UpstreamPathTemplate": "/",
"Aggregator": "FakeDefinedAggregator"
}
]
}

这里我们添加了一个叫FakeDefinedAggregator的聚合器。当Ocelot尝试聚合这个ReRoute的时候,会去查看这个聚合器。

为了使这个聚合器可用,我们必须像下面这样把FakeDefinedAggregator添加到OcelotBuilder。

services
.AddOcelot()
.AddSingletonDefinedAggregator<FakeDefinedAggregator>();

现在,当Ocelot尝试聚合上述ReRoute时,它会在容器中找到FakeDefinedAggregator并使用它来聚合ReRoute。 由于FakeDefinedAggregator是在容器中注册,因此您可以将它需要的任何依赖项都添加到容器中,如下所示。

services.AddSingleton<FooDependency>();

services

.AddOcelot()

.AddSingletonDefinedAggregator<FooAggregator>();

在这个例子中FooAggregator依赖FooDependency,将会被容器解析。

除此之外,Ocelot还允许您添加如下所示的瞬态聚合器。(参考.net core依赖注入,译者注)

services
.AddOcelot()
.AddTransientDefinedAggregator<FakeDefinedAggregator>();

为了实现一个聚合器,你必须实现这个接口。

public interface IDefinedAggregator
{
Task<DownstreamResponse> Aggregate(List<DownstreamResponse> responses);
}

使用此功能,您几乎可以做任何您想做的事情,因为DownstreamResponse包含内容,头和状态代码。 如果需要,我们可以添加额外的东西,只需在GitHub上提出这个问题。请注意,如果在向聚合中的ReRoute发出请求时HttpClient抛出异常,那么您将不会获得其DownstreamResponse,但您会获得其他请求成功的DownstreamResponse。 如果某个请求抛出异常,则会被记录。

基本演示

{
"ReRoutes": [
{
"DownstreamPathTemplate": "/",
"UpstreamPathTemplate": "/laura",
"UpstreamHttpMethod": [
"Get"
],
"DownstreamScheme": "http",
"DownstreamHostAndPorts": [
{
"Host": "localhost",
"Port": 51881
}
],
"Key": "Laura"
},
{
"DownstreamPathTemplate": "/",
"UpstreamPathTemplate": "/tom",
"UpstreamHttpMethod": [
"Get"
],
"DownstreamScheme": "http",
"DownstreamHostAndPorts": [
{
"Host": "localhost",
"Port": 51882
}
],
"Key": "Tom"
}
],
"Aggregates": [
{
"ReRouteKeys": [
"Tom",
"Laura"
],
"UpstreamPathTemplate": "/"
}
]
}

你也可以设置Aggregate的UpstreamHost和ReRouteIsCaseSensitive,和其他ReRoutes的作用是一样的。

如何路由/tom返回 {“Age”: 19},路由/laura返回{“Age”: 25},那么聚合之后的相应就如下所示。

{"Tom":{"Age": 19},"Laura":{"Age": 25}}

目前的聚合功能非常简单。 Ocelot只是从你的下游服务获得响应,并将其复制到json字典中,如上所示。将ReRoute键作为字典的关键字,下游服务的响应体作为值。你可以看到这个对象就是没有任何缩进空格的JSON。

来自下游服务相应的所有头部都会丢失。

Ocelot将总是将聚合请求的内容类型返回application/json。

如果下游服务返回404,那么聚合将为该下游服务返回空内容。 即使所有下游都返回404,它也不会是聚合响应为404。

疑难杂症 / 更多信息

您不能将ReRoutes与特定的RequestIdKeys一起使用,因为这将使跟踪非常的复杂。

聚合仅支持GET HTTP动词。

原作者:小水 原文链接:https://www.cnblogs.com/loogn/p/9007768.html

Ocelot(十二)- 请求聚合的更多相关文章

  1. 使用Typescript重构axios(二十二)——请求取消功能:收尾

    0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...

  2. Ocelot(二)- 请求聚合与负载均衡

    Ocelot(二)- 请求聚合与负载均衡 作者:markjiang7m2 原文地址:https://www.cnblogs.com/markjiang7m2/p/10865511.html 源码地址: ...

  3. Ocelot(二)- 请求聚合

    原文:Ocelot(二)- 请求聚合 Ocelot(二)- 请求聚合与负载均衡 作者:markjiang7m2 原文地址:https://www.cnblogs.com/markjiang7m2/p/ ...

  4. .Net微服务实践(三):Ocelot配置路由和请求聚合

    目录 配置 路由 基本配置 占位符 万能模板 优先级 查询参数 请求聚合 默认聚合 自定义聚合 最后 在上篇.Net微服务实践(二):Ocelot介绍和快速开始中我们介绍了Ocelot,创建了一个Oc ...

  5. JMeter—监听器(十二)

    参考<全栈性能测试修炼宝典JMeter实战>第六章 JMeter 元件详解中第七节监听器用来显示JMeter取样器的测试结果,能够以树.表.图形形式显示,也可以以文件方式保存. 一.设置默 ...

  6. 使用Typescript重构axios(十二)——增加参数

    0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...

  7. 使用Typescript重构axios(十六)——请求和响应数据配置化

    0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...

  8. 使用Typescript重构axios(十八)——请求取消功能:总体思路

    0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...

  9. 使用Typescript重构axios(十九)——请求取消功能:实现第二种使用方式

    0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...

  10. 使用Typescript重构axios(三十二)——写在最后面(总结)

    0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...

随机推荐

  1. zookeeper一二三

    1.zookeeper介绍 ZooKeeper 是一个开源的分布式协调服务,由雅虎创建,是 Google Chubby 的开源实现.分布式应用程序可以基于 ZooKeeper 实现诸如数据发布/订阅. ...

  2. 表皮囊肿?wtf

    https://baike.baidu.com/item/%E8%A1%A8%E7%9A%AE%E5%9B%8A%E8%82%BF/7852024?fr=aladdin

  3. win10 powershell 验证下载的包的MD5/sha1的签名值

    巧用Win10自带的PowerShell命令校验文件的Hash值(MD5.SHA1/256等) 发表于2017年3月8日由MS酋长 通常为了保证我们从网上下载的文件的完整性和可靠性,我们把文件下载下来 ...

  4. Intellij IDEA远程调试tomcat

    1.windows系统 文件catalina.bat首行增加下面代码 set CATALINA_OPTS=-server -Xdebug -Xnoagent -Djava.compiler=NONE ...

  5. Zookeeper中的FastLeaderElection选举算法简述

    Zookeeper是一个开源的分布式应用协调项目, 当中为了保证各节点的协同工作,Zookeeper在工作时须要有一个Leader. 而Leader是怎样被选举出来的?Zookeep中使用的缺省算法称 ...

  6. sql 语法树 常量

    SELECT id,'|',url,'|',update_time FROM tab LIMIT 10;SELECT COUNT(1) AS parent,(SELECT COUNT(1) FROM ...

  7. res_d_l =[{'contents':d.contents,'href':d.attrs['href']} for d in rd] 泛型

    from selenium import webdriverfrom selenium.webdriver.chrome.options import Options# from selenium.w ...

  8. 在Eclipse中tomcat 内存配置

    修改1: 在Eclipse中下面Servers双击Tomcat Server... 然后点击General InformAtion 下的Open launch configuration: 会弹出Ed ...

  9. Java 负载均衡

    什么是负载均衡 负载均衡,英文 名称为Load Balance,指由多台服务器以对称的方式组成一个服务器集合,每台服务器都具有等价的地位,都可以单独对外提供服务而无须其他服务器的辅助.通过某种 负载分 ...

  10. mysql16---读写分离

    读写分离(负载平衡)(读写分离肯定要用到主从复制) 如果数据库压力很大,一台机器支撑不了,那么可以用mysql复制实现多台机器同步,将数据库的压力分散. 分表不能解决并发量大的问题. Sql语句发过来 ...