一、简介
Camel is an Open Source integration framework that empowers you to quickly and easily integrate various systems consuming or producing data.
Camel 是一个开源的集成框架,能够让开发者快速、轻松地整合/集成不同的应用/系统,并作为中间件在各种系统之间消费或生产数据。
之所以Camel能在多种技术栈的系统之间快速集成,打通信息流,那是因为其拥有一个丰富的组件库,包含超过320个组件(核心和非核心的组件)。组件就像一个插头,允许系统连接到外部系统,比如邮箱、磁盘、FTP服务等等。
这样通过组件可用于解决简单的消息传递和数据传输问题,而且还可以提供数据安全性,不需要开发者在系统架构的基础设施层反复地造轮子。
二、核心
Camel 的两个核心概念
- EIP,处理消息
- Components,接受和发送消息(Endpoint)
除了上面提到的两个,还有两个核心,包括
- Route ,即定义数据从那儿来,到哪儿去
- Camel Context,是一个引擎(也可看做容器或者小型的应用服务器),用于运行和管理Route
Route
是开发者在Camel中配置的对象,包含上下游两个Endpoint
和一个Eip
处理器。从上游接受数据,经过Eip
处理,再发送给下游,下面的代码是用Java语法表示将文件从一个文件夹移动到另外一个文件夹:
from("file:root/customers/new").to("file:root/customers/old");
Camel Context
它是一个上下文容器,当Camel启动时,首先读取Route定义,然后创建Route,并讲路由添加到Camel Context里,然后启动Context。
当服务Camel终止时,Route将会被关闭,然后Camel 的上下文也会关闭。
总结
官方文档指出,Camel可以处理几乎所有的事情,包括从Http通信、磁盘读取、与Twitter、Facebook 等应用程序交流、与AWS、Azure等云服务提供商通信、与消息中间件交互等等,应有尽有。
Apache Camel 中间件的核心观点是把更多的时间放在对你企业有意义的代码上,Camel使得以有效的方式连接上百多个不同的异构服务端点变得简单和可扩展。它的组件驱动方法着重于在编写集成逻辑时减少模板代码。
总的来说,可以把Camel类比成一条管道,承接上游,内部处理后输送到下游,内部处理过程中,可以做比如更改、转换数据,或者传输到另一个管道等等。
三、 Endpoint
在Apache Camel
中,提供了多种终端类型支持:
-
Direct Endpoint()
此端点用于将消息直接发送到同一Camel上下文中的特定端点。例如,如果您有一条路由需要向同一应用程序中的另一条路由发送消息,则可以使用直接端点。 -
File Endpoint
该端点用于从文件系统读取或写入文件。例如,如果需要从CSV文件中读取数据并在Camel路由中处理它,则可以使用文件端点。 -
HTTP Endpoint
此端点用于发送或接收HTTP请求和响应。例如,如果需要与使用HTTP的外部API集成,则可以使用HTTP端点。 -
JMS Endpoint
该端点用于使用Java消息传递服务(JMS)发送或接收消息。例如,如果你需要集成像ActiveMQ或RabbitMQ这样的消息传递系统,你可以使用JMS端点。 -
Kafka Endpoint
这个端点用于使用Apache Kafka发送或接收消息。例如,如果你需要集成一个使用Kafka的流媒体平台,你可以使用Kafka端点。 -
MQTT Endpoint
该端点用于使用MQTT协议发送或接收消息。例如,如果您需要与使用MQTT进行通信的物联网设备集成,则可以使用MQTT端点。 -
SMTP Endpoint
该端点用于使用简单邮件传输协议(SMTP)发送电子邮件。例如,如果您的应用程序需要根据某些事件发送电子邮件通知,则可以使用SMTP端点。 -
Timer Endpoint
此端点用于使用计时器以特定间隔触发事件。例如,如果您的应用程序需要定期执行某些任务(例如,每5分钟一次),则可以使用计时器端点。 -
SEDA endpoint
此端点用于同一JVM内的内存消息传递。它允许在应用程序的不同部分之间进行异步通信,而不需要网络通信的开销。
Direct Endpoint: This endpoint is used to send messages directly to a specific endpoint within the same Camel context. For example, if you have a route that needs to send a message to another route within the same application, you can use a direct endpoint.
File Endpoint: This endpoint is used to read or write files from a file system. For example, if you need to read data from a CSV file and process it in your Camel route, you can use a file endpoint.
HTTP Endpoint: This endpoint is used to send or receive HTTP requests and responses. For example, if you need to integrate with an external API that uses HTTP, you can use an HTTP endpoint.
JMS Endpoint: This endpoint is used to send or receive messages using the Java Messaging Service (JMS). For example, if you need to integrate with a messaging system like ActiveMQ or RabbitMQ, you can use a JMS endpoint.
Kafka Endpoint: This endpoint is used to send or receive messages using Apache Kafka. For example, if you need to integrate with a streaming platform that uses Kafka, you can use a Kafka endpoint.
MQTT Endpoint: This endpoint is used to send or receive messages using the MQTT protocol. For example, if you need to integrate with IoT devices that use MQTT for communication, you can use an MQTT endpoint.
SMTP Endpoint: This endpoint is used to send emails using the Simple Mail Transfer Protocol (SMTP). For example, if your application needs to send email notifications based on certain events, you can use an SMTP endpoint.
Timer Endpoint: This endpoint is used to trigger events at specific intervals using a timer. For example, if your application needs to perform certain tasks at regular intervals (e.g., every 5 minutes), you can use a timer endpoint.
SEDA Endpoint
全称Simple and Efficient Direct Access
,
SEDA端点基于JVM内存进行消息传递,实现应用程序不同部分之间的异步通信,不需要通过网络通信。
Example:
from("direct:start")
.to("log:myLogger")
.to("seda:queue");
from("seda:queue")
.to("mock:result");
在本例中,定义了一个名为seda:queue
的SEDA端点。
第一个端点direct:start
用作路由的起点,它先向myLogger
记录器发送消息,然后向seda:queue
端点发送消息。
第二个端点接收来自seda:queue
的消息,并将其发送到名为mock:result
的模拟端点。
简单调用:
template.sendBody("seda:queue", "Hello World!");
这会向direct:start
端点发送一条消息,消息体为“Hello World!”,然后触发上面定义的路由。
Kafka Endpoint
Kafka
端点用于给Apache Kafka
发送或接收消息。
from("direct:start")
.to("log:myLogger")
.to("kafka:myTopic?brokers=localhost:9092");
from("kafka:myTopic?brokers=localhost:9092")
.to("mock:result");
例子中定义了一个名为kafka:myTopic
的Kafka端点。
第一个端点direct:start
被用作路由的起点,它向myLogger
记录器发送消息,然后向kafka:myTopic
端点发送消息。
第二个端点接收来自kafka:myTopic
的消息,并将其发送到一个名为mock:result
的模拟端点。
简单调用:
template.sendBody("kafka:myTopic", "Hello World!");
发送一个消息体“Hello World!”到kafka:myTopic
端点,然后触发上面定义的路由。
注意: 需要在URI中使用“brokers=host1:port1,host2:port2”的格式指定Kafka代理。
参考资料:
- 知乎 等风来长 《Apache Camel 了解一下?》
https://zhuanlan.zhihu.com/p/545063918
- Apache Camel 官方文档:
https://camel.apache.org/camel-core/getting-started/index.html#BookGettingStarted-Endpoint