gpt4 book ai didi

web-services - Apache Camel 聚合多个REST服务响应

转载 作者:行者123 更新时间:2023-12-04 13:17:13 26 4
gpt4 key购买 nike

我是Camel的新手,想知道如何使用Camel来实现下面提到的用例,

我们有一个REST Web服务,可以说它有两个服务操作callA和callB。
现在,我们在前面有ESB层,可以在访问此实际的Web服务URL之前拦截客户端请求。

现在我正在尝试做这样的事情-
在ESB中公开一个客户端将实际调用的URL。在ESB中,我们使用的是Camel的Jetty组件,它只是该服务调用的代理。因此,可以说此URL为/my-service/scan/

现在,在收到@ESB的请求后,我要调用这两个REST端点(callA和callB)->获取其响应-resA和resB->将其聚合到单个响应对象resScan->返回客户端。

我现在所拥有的只是-

<route id="MyServiceScanRoute">
<from uri="jetty:http://{host}.{port}./my-service/scan/?matchOnUriPrefix=true&amp;bridgeEndpoint=true"/>
<!-- Set service specific headers, monitoring etc. -->
<!-- Call performScan -->
<to uri="direct:performScan"/>
</route>

<route id="SubRoute_performScan">
<from uri="direct:performScan"/>
<!-- HOW DO I??
Make callA, callB service calls.
Get their responses resA, resB.
Aggregate these responses to resScan
-->
</route>

最佳答案

我认为您不必要地使解决方案复杂化了一点。 :)以我的拙见,调用两个独立的远程Web服务并连接结果的最佳方法是:

  • 使用multicast
  • 并行调用服务
  • 使用GroupedExchangeAggregationStrategy
  • 汇总结果

    上述解决方案的路由可能如下所示:
    from("direct:serviceFacade")
    .multicast(new GroupedExchangeAggregationStrategy()).parallelProcessing()
    .enrich("http://google.com?q=Foo").enrich("http://google.com?q=Bar")
    .end();

    传递给direct:serviceFacadeResponse的Exchange将包含Exchange.GROUPED_EXCHANGE属性,该属性设置为服务调用结果列表(在我的示例中为Google搜索)。

    这就是如何将direct:serviceFacade连接到Jetty端点:
    from("jetty:http://0.0.0.0:8080/myapp/myComplexService").enrich("direct:serviceFacade").setBody(property(Exchange.GROUPED_EXCHANGE));

    现在,您使用Jetty组件在ESB上公开的对服务URL的所有HTTP请求都将生成对子服务的两次调用所串联的响应。

    有关消息和端点的动态部分的进一步注意事项

    在许多情况下,在端点中使用静态URL不足以实现所需的功能。您可能还需要准备有效负载,然后再将其传递给每个Web服务。

    一般来说,用于实现动态端点或有效负载参数的路由类型在很大程度上取决于您使用网络服务所使用的组件(HTTPCXFRSRestlet,RSS等)。每个组件的程度和动态配置方式都不同。

    如果您的端点/有效负载应受到动态影响,您还可以考虑以下选项:

    使用多播端点的onPrepareRef选项预处理传递给每个端点的交换副本。您可以使用它来引用自定义处理器,该处理器将在将有效负载传递给多播端点之前对其进行修改。这可能是用HTTP组件的Exchange.HTTP_URI header 组成onPrepareRef的好方法。

    使用Recipient List (也像多播一样提供parallelProcessing)来动态创建REST端点URL。

    使用Splitter模式(启用parallelProcessing)将请求拆分为专用于每个服务的较小消息。再一次,该选项可以与HTTP组件的Exchange.HTTP_URI header 一起很好地工作。仅当可以使用相同的终结点类型定义两个子服务时,此方法才起作用。

    如您所见,Camel非常灵活,可通过多种方式为您实现目标。考虑问题的背景并选择最适合您的解决方案。

    如果您向我展示要在聚合服务的每个请求上调用的REST URL的更具体示例,我可以为您提供建议,我将选择哪种解决方案以及如何实现该解决方案。特别重要的是要知道请求的哪一部分是动态的。我还需要知道您要使用哪个服务使用者(这取决于您将从服务接收的数据类型)。

    关于web-services - Apache Camel 聚合多个REST服务响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10610820/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com