Apache Camel - 简介


考虑这样一种情况:您所在城镇的一家大型在线杂货店(例如印度的 Bigbasket)邀请您为他们设计 IT 解决方案。稳定且可扩展的解决方案将帮助他们克服当今面临的软件维护问题。这家网上商店在过去十年里一直在经营业务。该商店接受客户对不同类别产品的在线订单,并将其分发给各自的供应商。例如,假设您订购了一些肥皂、油和牛奶;这三件物品将分别分发给三个供应商。然后,三个供应商将把他们的物资发送到一个共同的配送点,整个订单将由配送中心完成。现在,让我们看看他们今天面临的问题。

当这家商店开始营业时,它接受以逗号分隔的纯文本文件形式的订单。一段时间后,商店改用消息驱动下单。后来,一些软件开发人员建议采用基于 XML 的订单放置方式。最终,该商店甚至采用了网络服务界面。现在,真正的问题来了。现在订单有不同的格式。显然,公司每次升级接单格式时,都不想破坏之前部署的界面,以免造成客户心里的混乱。

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

整个情况如下图所示 -

应用架构

现在,让我们看看 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 示例。