Apache Camel - 简介



假设您所在的城镇有一家大型在线杂货店,例如印度的 Bigbasket,邀请您为他们设计一个 IT 解决方案。这个稳定且可扩展的解决方案将帮助他们克服目前面临的软件维护问题。这家在线商店已经运营了十年。商店接受客户对不同类别产品的在线订单,并将其分发给相应的供应商。例如,假设您订购了一些肥皂、油和牛奶;这三件商品将分别分发给三个相应的供应商。然后,这三个供应商将把他们的货物发送到一个共同的配送点,从那里由配送中心完成整个订单。

当这家商店开始营业时,它接受以逗号分隔的纯文本文件形式提交的订单。一段时间后,商店转向了消息驱动的订单下达方式。后来,一些软件开发者建议使用基于 XML 的订单下达方式。最终,商店甚至采用了 Web 服务接口。现在,真正的难题来了。订单现在采用不同的格式。显然,每次公司升级订单接受格式时,都不想破坏先前部署的接口,以免造成客户的混淆。

同时,随着业务不断发展,商店定期增加了新的供应商。每个供应商都有自己接受订单的协议。我们再次面临集成问题;我们的应用程序架构必须具有可扩展性,以适应具有其独特订单下达机制的新供应商。

整个情况如下图所示:

Application Architecture

现在,让我们看看 Apache Camel 如何帮助您为上述场景提供一个优雅、易于维护和可扩展的解决方案架构。

在我们继续讨论解决方案之前,我们需要做一个小的假设。在本教程中的所有讨论中,我们都假设在线订单采用 XML 格式。我们在所有讨论中都将使用的订单文件的典型格式如下所示:

<?xml version = "1.0" encoding = "UTF-8"?>
<OrderID Order = "001">
   <order product = "soaps">
      <items>
         <item>
            <Brand>Cinthol</Brand>
            <Type>Original</Type>
            <Quantity>4</Quantity>
            <Price>25</Price>
         </item>
         <item>
            <Brand>Cinthol</Brand>
            <Type>Lime</Type>
            <Quantity>6</Quantity>
            <Price>30</Price>
         </item>
      </items>
   </order>
   
   <order product = "Oil">
      <items>
         <item>
            <Brand>Saffola</Brand>
            <Type>Gold</Type>
            <Quantity>2</Quantity>
            <Price>649</Price>
         </item>
         <item>
            <Brand>Fortune</Brand>
            <Type>Sunlite</Type>
            <Quantity>1</Quantity>
            <Price>525</Price>
         </item>
      </items>
   </order>
   
   <order product = "Milk">
      <items>
         <item>
            <Product>Milk</Product>
            <Brand>Amul</Brand>
            <Type>Pure</Type>
            <Quantity>2</Quantity>
            <Price>60</Price>
         </item>
      </items>
   </order>
</OrderID>

我们将使用上述 XML 模板来说明本教程中的 Camel 示例。

广告