企业集成模式:Spring Integration 和 Apache Camel

前段时间写了一个功能,MQTT 消息转发给 gRPC 服务端,
换成 Camel 实现,试通了感觉 Camel 挺不错。

想着以前写的 Spring 集成 MQTT 用的 Spring Integration,正好对比一下。
阅读 Spring Integration 文档,说灵感来源于《企业集成模式》这本书。
搜索发现 Spring Integration 和 Apache Camel 都属于 “集成框架”,还有一个 Mule
尝试搜集资料,总结对比一下。

《企业集成模式》

作者网站

https://www.enterpriseintegrationpatterns.com/patterns/messaging/

有内容介绍,不过还是看图比较直观

PDF【金山文档】 企业集成模式
https://kdocs.cn/l/cfbM5BO6gyYj

书第10页

书上的图不清晰,重画了一下

Spring Integration

官网

https://docs.spring.io/spring-integration/reference/index.html

Spring Integration 的简单介绍,感觉了解有一些名词即可。真正体会还是需要看图和看代码

Spring Integration 是一个基于 Spring 框架的企业集成解决方案,旨在简化不同应用程序之间消息传递通信系统集成
它提供了一种声明性的方式来定义和组织消息驱动的应用程序,通过一系列的消息通道消息处理器转换器过滤器组件来构建集成流程。

其核心思想是将应用程序拆分成可重用的消息处理模块,这些模块通过消息通道进行通信。

Spring Integration 支持多种消息传递方式,包括基于消息队列、文件、HTTP、WebSocket 等,同时也提供了与外部系统集成的能力。
通过 Spring Integration,开发者可以轻松地构建复杂的集成流程,处理不同来源和形式的消息,并能够在这些消息之间进行路由、转换、过滤、聚合等操作,以满足不同场景下的集成需求。
整合了 Spring 生态的优势,让开发者能够更加方便地在 Spring 应用中实现消息驱动的集成解决方案。

Spring 集成框架概述

这段话来自 Spring 集成框架概述

作为 Spring 编程模型的延伸,Spring Integration 提供了各种配置选项,包括注解、带有命名空间支持的 XML、带有通用“bean”元素的 XML 以及直接使用底层 API。
该 API 基于明确定义的策略接口和非侵入式的委托适配器。
Spring Integration 的设计灵感来自于 Spring 中常见模式与 Gregor Hohpe 和 Bobby Woolf 在《企业集成模式》(Addison Wesley,2004)一书中描述的知名模式之间的强烈关联。
已经阅读过该书的开发人员应该能够立即理解 Spring Integration 的概念和术语。

消息

消息通道

消息路由器

服务激活器

一个入站通道适配器端点,连接一个源系统到一个消息通道

一个出站通道适配器端点,连接一个消息通道到一个目标系统

集成 MQTT

简单的示例,介绍一下用法

Java DSL(Domain Specific Language,领域特定语言)是 Spring Integration 提供的一种编程方式,用于以流畅的方式配置消息通道、消息处理器、消息端点等集成组件。
它提供了一种直观、流畅的方法来定义整个集成流程,使得代码更易读、更易维护。

使用 Java DSL 配置 Spring Integration 可以让你通过编写代码来定义整个消息通道、消息处理器和消息端点之间的流程。
这种方式相比于 XML 配置更加灵活,并且可以利用 Java 的编程能力来完成集成流程的定义。

pom.xml 里的依赖

<!-- MQTT -->
<dependency>
    <groupId>org.springframework.integration</groupId>
    <artifactId>spring-integration-mqtt</artifactId>
</dependency>

<!-- Spring Integration Stream -->
<dependency>
    <groupId>org.springframework.integration</groupId>
    <artifactId>spring-integration-stream</artifactId>
</dependency>

使用 IntegrationFlow

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.integration.dsl.IntegrationFlow;
import org.springframework.integration.dsl.IntegrationFlows;
import org.springframework.integration.mqtt.inbound.MqttPahoMessageDrivenChannelAdapter;

@Configuration
public class MqttIntegrationConfig {

    @Bean
    public IntegrationFlow mqttInbound() {
        MqttPahoMessageDrivenChannelAdapter adapter = new MqttPahoMessageDrivenChannelAdapter(
                "tcp://localhost:1883",
                "My-ClientID-ioufev",
                "topic1", "topic2");
        adapter.setBeanName("myIntegrationFlowMqttPahoAdapter");

        return IntegrationFlows.from(adapter)
                .handle(message -> {
                    // 处理收到的 MQTT 消息
                    String payload = message.getPayload().toString();
                    System.out.println("Received message: " + payload);
                    // 在这里添加你的处理逻辑
                })
                .get();
    }
}

说明

1、MQTT 底层实现肯定是 Eclipse Paho,Spring Integration 只是封装了一层方便调用。
2、使用 Java DSL 配置的写法确实比较直观

Apache Camel

官网

https://camel.apache.org/
https://github.com/apache/camel/
https://zh.wikipedia.org/zh-cn/Apache_Camel

Camel is an Open Source integration framework that empowers you to quickly and easily integrate various systems consuming or producing data.
Camel 是一个开源集成框架,使您能够快速轻松地集成各种消费或生产数据的系统。

Apache Camel 是一个基于规则路由和中介引擎,提供企业集成模式的 Java 对象(POJO)的实现,通过应用程序接口(或称为陈述式的 Java 领域特定语言(DSL))来配置路由和中介的规则。
领域特定语言意味着 Apache Camel 支持你在的集成开发工具中使用平常的,类型安全的,可自动补全的 Java 代码来编写路由规则,而不需要大量的 XML 配置文件。
同时,也支持在 Spring 中使用 XML 配置定义路由和中介规则。

文章

Apache Camel 调研

Camel 实战第二版 第一章 初识 Camel

复制文件的例子,很好的切入点,路由的功能很好的描述了

Apache Camel 教程

这个入门介绍简洁直接有条理。

概念

以下是 Apache Camel 的一些概念:

  1. 路由(Route)- Camel 中的核心概念,它描述了如何将消息从一个端点(endpoint)传输到另一个端点,并应用一系列的转换和处理。
  2. 组件(Component)- Camel 中的组件是一组用于连接到不同数据源或目标的预定义端点。例如,JMS 组件用于连接到 JMS 队列或主题,HTTP 组件用于连接到 HTTP 服务器等。
  3. 处理器(Processor)- Camel 中的处理器用于对消息进行转换和处理。例如,过滤器、转换器、聚合器等等。
  4. 谓词(Predicate)- Camel 中的谓词是一个用于测试消息是否满足某些条件的函数。例如,判断消息是否为空,或者是否满足某些标准。
  5. 消息(Message)- Camel 中的消息是路由中的基本单元。消息通常包含一些元数据和有效负载数据。
  6. Exchange - Exchange 是在 Camel 路由中传递的消息容器。Exchange 包含消息、消息头和其他元数据。它还提供了一个机制,用于在处理器之间传递附加信息。
  7. 聚合器(Aggregator)- Camel 中的聚合器用于合并一组相关的消息。例如,将一组相关的订单合并为单个订单。
  8. 路由策略(Routing Policy)- Camel 中的路由策略用于控制路由中消息的流动。例如,从一组路由中选择一个,或者使用负载均衡策略。
  9. 触发器(Trigger)- Camel 中的触发器用于触发路由中的操作。例如,基于时间的触发器可用于定期执行某些任务。
  10. 转换器(Type Converter)- Camel 中的转换器用于将一种类型的消息转换为另一种类型。例如,将字符串转换为数字。

流程图

以下是一个简单的 Apache Camel 路由流程图示例:


+---------------+                +---------------+                +---------------+
|  Input Source |    -------->   |   Processor   |    -------->   |  Output Sink  |
+---------------+                +---------------+                +---------------+
       |                                   |                                   |
       |                                   |                                   |
       +--------------+        +-----------+------------+        +--------------+
                      |        |                        |        |
                      +------> | Message Transformation | <------+
                               |                        |
                               +------------------------+

上述流程图中,Apache Camel 路由由以下三个基本组件组成:

  1. 输入源(Input Source)- 这是路由的起点,它接收消息并将其传递给处理器。例如,可以使用 JMS 组件来连接到 JMS 队列或主题,或使用 HTTP 组件来接收 HTTP 请求。
  2. 处理器(Processor)- 处理器用于转换和处理消息。例如,可以使用 Bean 处理器来调用 Java Bean 或使用过滤器来过滤消息。
  3. 输出汇(Output Sink)- 这是路由的终点,它将处理后的消息发送到目标位置。例如,可以使用 JMS 组件将消息发送到 JMS 队列或主题,或使用 HTTP 组件将消息发送回 HTTP 客户端。

在流程图中,箭头表示消息的流动方向。
在 Apache Camel 中,路由策略可以控制消息的流动方向和顺序。
同时,Apache Camel 也提供了许多内置的处理器和组件,以及可扩展的 API,使用户能够自定义处理器和组件以满足自己的需求。

集成 MQTT

简单的示例,介绍一下用法

Apache Camel 是一个开源的集成框架,它提供了多种 DSL(领域特定语言)来简化集成开发。
Camel 提供了多种 DSL,其中包括 Java DSL、Spring DSL、Blueprint DSL 等,用于配置和定义路由规则、消息转换、数据路由等。

Camel 的 DSL 是为了简化和表达集成模式而设计的,让开发者能够以一种更加直观和易于理解的方式来定义路由和处理数据。
它支持不同级别的抽象,允许使用不同的语法风格来表达路由规则。

pom.xml 里的依赖

<dependency>
    <groupId>org.apache.camel.springboot</groupId>
    <artifactId>camel-spring-boot-starter</artifactId>
    <version>3.20.6</version>
</dependency>

<dependency>
    <groupId>org.apache.camel.springboot</groupId>
    <artifactId>camel-paho-starter</artifactId>
    <version>3.20.6</version>
</dependency>

配置文件 application.yml

camel:
  springboot:
    main-run-controller: true
  component:
    direct:
      enabled: true
    paho:
      broker-url: tcp://127.0.0.1
      qos: 0
      user-name: 
      password: 

示例代码

import org.apache.camel.builder.RouteBuilder;
import org.springframework.stereotype.Component;

@Component
public class MqttToFileRoute extends RouteBuilder {
    @Override
    public void configure() throws Exception {

        // 创建一个从 MQTT 主题接收消息的路由
        // paho 指的是 Paho MQTT 组件,要在配置文件中配置相关参数
        from("paho:topic1")
                .log("Received message: ${body}")
                .process(exchange -> {
                    // 处理消息
                });

        // 转发主题到另一个主题
        from("paho:topic2")
                .to("paho:topic3");

        // 将收到的消息写入到文本文件
        from("paho:topic4")
                .convertBodyTo(String.class)
                .to("file:E:\\Data\\Camel?fileName=mqtt_messages.txt");

    }
}

说明

1、MQTT 底层实现肯定是 Eclipse Paho,Apache Camel 只是封装了一层方便调用。
2、路由配置简单直接,from 和 to 方法简单直接到你觉得本来就应该是这样子。

Camel 组件

Camel 组件,真是非常多,我看到的感兴趣的有

  • 实现 MQTT 的 Paho
  • 实现 OPC UA 的 OPC UA CLIENT,当然底层驱动是 Eclipse milo
  • KAFKA
  • gRPC
  • PLC4X,PLC4X 是 Apache 的开源下项目,号称“通用协议适配器”,感觉和 OPC 的面向对象映射的思路是一致的,想通过增加一层统一的接口或者模型,来调用不同的工业协议驱动来连接 PLC
  • COAP
posted @ 2023-12-06 10:48  ioufev  阅读(274)  评论(0编辑  收藏  举报