欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Ocelot(十二)- 请求聚合

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

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