对于近期对于开源ESB产品的研究和分析,结合原有自研的轻量ESB产品以及对大型ESB商业套件多年产品实施的经验分析,准备对公司已有自主研发的轻量ESB产品进行一次大的产品改造。
在前面一篇ESB核心产品功能架构的文章里面已经提到,业界常见的ESB产品主要包括了三个核心部分的内容,即ESB服务设计器,ESB底层引擎和ESB管控治理平台三方面的内容。而实际上里面最重要的还是ESB底层核心引擎,业界主流的产品主要包括了两种实现标准,一种是类似Oracle和IBM的商业ESB产品里面基于SCA/SDO标准体系来实现,其更加体现了服务为重点,一种是类似ServiceMix,WSO2等产品则基于JBI标准来实现,更多的体现消息为主。
在这次的底层ESB核心引擎选择上,初步考虑基于Camel来扩展ESB底层核心引擎。或者也也可以说是基于开源的ServiceMix来进行相应的扩展。Camel是一款优秀的规则引擎产品,特别是其对企业EIP集成模式的完全支持,同时对大量外部开源产品的集成,包括CXF,ActiceMQ,JavaBean,FTP,Http,DB数据库等,这些都使得Camel是一个具备足够扩展性和定制能力的可选引擎。虽然对于Camel当前还没有相应的设计器,但是类似Talend,Fuse已经发布有相应的基于Camel的可视化设计器,我们也可以完全开发自己的设计器,前面也有文章谈到过基于Eclipse GMF插件进行设计器的开发等。
对于基于Camel的ESB底层引擎,再基于ESB场景的集成服务场景做一些说明:
1. 最常见的proxy service功能的实现
可以看到Camel实现最简单的Proxy Service是相当简单的,其核心能力还是通过CXF组件来实现。对于最简单的代理我们不需要生产相应的Service类,仅仅是请求转发。在CXF框架使用中,可以通过CXF自带的拦截器和Log组件来增加对输入和输出消息体的Log能力。
2. 在proxy Service的实现过程中需要增加Mapping映射能力
举个简单的场景来说,如果Camel通过CXF发布的代理WebService的Schema和我们需要调用的原生WebService之间的shema不一致,那么我们就需要对消息的结构进行映射处理。在Camel里面本身Mapping能力是相当弱的。在实现的过程中主要有两种方式可以考虑,其一是通过XSLT来实现消息体本身的转换,其重点是对于Route传递的消息格式通过XSLT模板文件进行转换和映射;其二是可以考虑通过Camel集成的Dozer组件来实现映射,其核心是通过CXF框架生成出来的Java类对象之间数据结构进行映射。
3. 消息中间件能力和消息本身的发布订阅等
可以看到Camel本身对消息中间件和消息队列能力的集成是相当完善的,其既支持基于JMS实现的ActiceMQ,也支持基于AMQP高级消息队列实现的RabbitMQ等。我们在ESB集成中遇到有消息发送和接收,1对N的消息发布订阅等场景的时候,两种组件都可以选择使用。如果是需要一个高性能的分布式消息发布订阅系统,我们还可以使用kafka组件,可以看到在Camel 2.13版本后已经完全集成了现在使用广泛的kafka消息中间件。
4. 对于集成过程中的路由,分支和判断能力实现
这个不用细讲,Camel本质就是规则引擎,可以看到在Camel里面实现相应的条件路由,分支判断等相当简单。在这部分不是简单的Choice组件和实现代码,看Camel参考手册里面可以看到Camel有大量的Processor组件可以协助我们完成相关的工作,比如split,filter,enrich,loop等。
5. 对于Http Rest服务的集成和服务代理等
可以看到在Camel里面专门提供了CXFRS组件来实现对rest服务的集成和服务代理能力,整个实现起来相当方便。同时Camel本身也提供了Rest和RestLet两个Rest服务相关的组件,对于Rest组件主要在Camel路由节点中可以将Rest定义为相应的Endpoint端点服务,而对于RestLet组件则其本身就可以用来发布Rest服务或消费Rest服务。
6. 对于FTP和文件的适配能力
在Camel里面有专门的File组件和Ftp组件,要实现对FTP服务器或文件目录的集成是相当容易的事情。例如我们可以通过这些组件实现从特定的FTP服务器或文件目录中读取文件,也可以用来将我们最终的消息流持久化到具体的文件中。
7. 对于DB的适配能力已经WS+DB场景实现
在Camel里面可以看到有不少的DB相关的组件,包括JDBC,SQL组件,也包括了Camel对Hibernate,IBatis等O/R Mapping框架的集成。但是我们也看到,这些都是通用的数据库访问组件,不像Talend这些产品对于DB适配有很强的支撑能力。
如果要实现WS+DB的场景,不管是适配到数据库的查询服务还是插入数据到数据库中的导入服务,我们在前端都可以采用CXF框架来实现对消息输入的获取,也可以在后端通过DB组件适配来实现数据库数据的查询或写入。但是其中关键点还是Mapping能力,即服务本身的Schema和数据库本身的查询和插入Sql语句数据项之间的映射。如果没有这种映射,那么对于这种场景我们都会涉及到要单独编写代码或相应的配置文件才能实现。而在类似Mule或Talend ESB工具里面可以看到,这些场景基本都可以通过设计器在前端动态配置完成。
为了扩展Camel这方面的能力,初步考虑的思路即自己对数据库的查询或导入进行封装,将其封装为独立的Java Bean对象,然后在Route的路由节点中增加Endpoint连接到我们自己的Java Bean类上面。基于这种方式需要做的工作就是定义相应的Mapping XML文件,对于不同的场景我们要修改的仅仅是这个配置文件就能够实现不同的数据查询或数据导入服务。
8.对于大数据本身的服务集成能力
在Oracle里面有专门的ODI来实现大数据服务集成,即可以理解为WS+ETL的组合模式。而在Camel里面,由于Camel本身有的足够的开放性,我们可以将自己开发的ETL JAVA组件定义的标准的Java Bean再集成到Camel Route设计里面。初步考虑可以将淘宝开源的DataX进行适当改造后集成到Camel里面以实现大数据集成。