企业集成模式: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 中的转换器用于将一种类型的消息转换为另一种类型。例如,将字符串转换为数字。

Camel 架构图

图片来源

在高层次上看 Camel 的架构非常简单。

CamelContext 表示 Camel 运行时系统,它连接不同的概念,如路由、组件或端点。

在此之下,处理器处理端点之间的路由和交换,而端点则集成不同的系统。

  1. CamelContext:它是 Camel 运行时的核心部分,负责管理和运行路由。在图中,它连接了不同的路由(如 Route 1、Route 2 等),并通过 DSL(领域特定语言)定义路由的行为。
  2. 路由 (Routes)路由定义了消息从一个端点流向另一个端点的路径,并且可以包含不同的处理器来操作消息。在图中,路由通过 DSL 描述,例如 .from().filter().xpath().to(),用于定义从哪里接收消息、如何处理消息以及将消息发送到哪里。
  3. 处理器 (Processors)处理器用于在端点之间对消息进行处理。图中显示了两个处理器示例:Message filter processor(消息过滤处理器)和 Content-based router processor(基于内容的路由处理器)。它们分别用于根据条件过滤消息或根据消息内容进行路由。
  4. 端点 (Endpoints)端点代表消息的源或目的地,可能是文件系统、JMS(Java 消息服务)、HTTP 等。它们通过组件来抽象实现,组件为各种技术提供了统一的接口,便于与不同系统集成。
  5. 组件 (Components)组件负责创建端点,用于处理不同的协议或技术。在图中,File、JMS、HTTP 都是组件的例子。

集成 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  阅读(648)  评论(0编辑  收藏  举报