Apache驼峰聚合多个REST服务响应

Ris*_*shi 6 rest web-services esb apache-camel aggregation

我是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>
Run Code Online (Sandbox Code Playgroud)

Hen*_*sek 15

我认为你不必要地使解决方案变得复杂一点.:)在我的拙见中,调用两个独立的远程Web服务并连接结果的最佳方法是:

上述解决方案的路由可能如下所示:

from("direct:serviceFacade")
  .multicast(new GroupedExchangeAggregationStrategy()).parallelProcessing()
    .enrich("http://google.com?q=Foo").enrich("http://google.com?q=Bar")
  .end();
Run Code Online (Sandbox Code Playgroud)

传递给direct:serviceFacadeResponse将包含的属性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));
Run Code Online (Sandbox Code Playgroud)

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

关于消息和端点的动态部分的进一步考虑

在许多情况下,在端点中使用静态URL不足以实现您的需求.您可能还需要在将有效负载传递给每个Web服务之前进行准备.

一般而言 - 用于实现动态端点或有效负载参数的路由类型高度依赖于您用于使用Web服务的组件(HTTP,CXFRS,Restlet,RSS等).每个组件的程度和方式都有所不同,您可以动态配置它.

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

使用onPrepareRefMulticast端点选项传递到每个端点的交换的预处理副本.您可以使用它来引用将在将有效负载传递到多播的端点之前修改有效负载的自定义处理器.这可能是使用HTTP组件的Exchange.HTTP_URI标头编写onPrepareRef的好方法.

使用" 收件人列表"(也可以parallelProcessing像多播一样提供)来动态创建REST端点URL.

使用parallelProcessing拆分模式(启用)将请求拆分为专用于每个服务的较小消息.再一次,这个选项可以很好地与Exchange.HTTP_URIHTTP组件的标头一起使用.仅当可以使用相同的端点类型定义两个子服务时,这才有效.

正如您所看到的,Camel非常灵活,可以让您以多种方式实现目标.考虑问题的背景,选择最适合您的解决方案.

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