专栏首页大魏分享(微信公众号:david-share)设计一个应用集成的路由:构建以API为中心的敏捷集成系列-第五篇

设计一个应用集成的路由:构建以API为中心的敏捷集成系列-第五篇

声明

  • 本文的内容仅限于技术探讨,不能作为指导生产环境的素材;
  • 鼓励读者购买红帽培训获得更多系统性的培训。
  • 由于篇幅有限,文章中的步骤仅展现了关键的部分。

一、应用集成的需求

对于一个公司而言,应用集成的需求可能来自于:

  • 将本地业务扩展到全球
  • 采购其他公司
  • 公司被收购

需要集成系统和应用程序以维持高效运营

公司业务需求

  • 举例: Send instructions, payments, etc.
  • 支持业务和公司发展
  • 与内部和外部伙伴交易
  • 在应用程序和后端系统之间交换数据和信息
  • 自动化IT流程以提高效率和灵活性

1. 解耦生产者和消费者,实现业务的松耦合.

2.使用消息:

  • 将生产者与消费者脱钩
  • 发送包含有关要执行的操作的信息的事件

Message 消息: Unit of transport containing 消息传递的内容包括

  • Headers
  • Properties
  • Body

路由和中介功能:

  • Message not enough when designing for complex architectural use cases 在为复杂的架构用例设计时,仅使用消息传递难以实现,必须要有路由的功能
  • Traditional network layer transports information ,Does not make data routing decisions 传统的网络层仅传输信息, 而不能做出数据路由决策
  • Data routing decisions handled by specific integration technology or framework ,Known as mediation and routing engine 由特定集成技术或框架处理的数据路由决策, 称为中介和路由引擎

Java Integration Framework Java集成框架

  • Supports all concepts presented previously
  • Simplifies:
    • Endpoint exposure 暴露端点
    • Message processing 消息处理
    • Application integration 应用集成
  • Supports:
    • Enterprise integration patterns (EIPs)
    • Standards-based application program interface (API)
    • Domain-specific language (DSL)

我们看一下支持DSL方式的路由:

我们看一下支持XML (Spring, Blueprint)的路由

二、应用集成的挑战

  • Integration process complex even with knowledge of how machines, platforms, applications exchange data 客户即使了解服务器机器、平台应用交换数据的数量,集成流程还是比较复杂的,依然很难完成。
  • Need to support business requirements 集成需要能够支持业务需求
  • Numerous open and proprietary protocols and standards: 应用有众多开放和专有协议和标准:
    • CORBA (互通性)
    • Copybook (legacy system)
  • Aggregation/correlation 确保应用聚合
  • Workflow implementation 工作流实施
    • Real-time 实时
    • Straight-through processing 直通式处理
    • Asynchronous or synchronous 同步或异步

三、Apache Camel的概念

Camel Exchange object: Wrapper that encapsulates message and its metadata

Camel Exchange对象是封装消息及其元数据的包装器

Camel Exchange object:由以下内容组成:

  • Body
  • Headers and Properties
  • Attachment (optional)
  • Exception
  • Exchange ID

Processor

  • Processors encapsulate logic that manipulates Exchange 处理器封装了控制Exchange的逻辑
  • Route definitions start with from(), followed by list of .to() processors 路由的定义是由一些列processor组成
    • Example: from().to().to()
  • Route definitions create two lists: 路由的定义会创建:
    • Inputs: List of from()
    • Outputs: List of .to()
  • First processor acts as Consumer, initiates Exchange creation 第一个处理器充当消费者,启动Exchange创建
  • Pipeline optionally can contain processors acting as Producer

通道可选地可以包含充当生产者的处理器

DSL

DSL:为特定问题域设计的编程语言,如字符串操作和数据库查询

使用DSL语言描述的路由

示例:Java,XML(Spring,Blueprint),Simple,Groovy,MVELJava DSL示例:

XML DSL example:

Component and Endpoint

  • Component class generates endpoint objects based on parameters 组件类根据参数生成端点对象
  • Consumer or Producer endpoints created from factory endpoint class
  • Consumer: Polls, schedules call, or waits (event-driven)
  • Producer: Sends message synchronously or asynchronously 生产者:以同步或异步方式发送消息

Endpoint URI

  • Endpoints defined using URI syntax: scheme://contextPath?key=value&key=value …
  • Scheme = component name
  • Camel checks classpath to discover component use

Exchange Pattern

Apache Camel supports two topologies:

  • FireForget: InOnly
  • Request/Reply: InOut

InOnly pattern

  • Only In compartment used
  • No response returned to Consumer(不会回复消费者)

InOut pattern

  • In object transports incoming message(在对象传输传入消息)
  • Response assigned to Out compartment

Exchange: Always returned to Consumer (InOnly/InOut)

Camel Container

CamelContext = Runtime environment

Registry for endpoints, routes

Acts as server runtime

Can be deployed in any Java container

Examples: Red Hat Fuse/Red Hat AMQ, JBoss EAP, Wildfly, Apache Tomcat, Apache ActiveMQ

Can also be deployed standalone

CamelContext created programmatically in Java using either:

Dependency injection: Spring, Blueprint

Java annotation: CDI

Route Registration

Life Cycle 生命周期

默认值:Apache Camel路由自动启动

轮询和调度消费者使用文件和资源

端点,CamelContext实现org.apache.camel.Service

服务提供启动,停止,暂停,恢复的方法

四、实验展现

该项目包含Apache Camel路由。 Camel路由从src / data目录中使用五个XML文件,并为每个XML文件创建一个Camel Exchange对象。

Camel Exchange对象表示消息交换,包括请求消息及其相应的回复、以及异常消息。 、

Exchange对象包含文件元数据作为标头和属性,并使用基于内容的路由器(CBR)企业集成模式(EIP)对条件进行评估。 课程后面将详细介绍EIP。

CBR逻辑检查每个XML文件以获取country标记的值。 如果其中一个条件匹配,则Exchange对象将在同一国家/地区名称的相应目录中重新创建相同的源文件。 如果条件不匹配,则Exchange对象将在target / work / cbr / output / others目录中重新创建相同的源文件。

创建 Fuse项目

接下来,查看项目:

查看xml文件:

在Source和Design视图之间切换,以分析编辑器画布中显示的路径,并检查路径及其端点后面的代码:

探索端点属性

在本节中,您将使用“Design”视图来探索为每个端点定义的属性。 您选择每个端点并查看“属性”视图中显示的有关该端点的信息。 您可以检查典型的Camel项目的外观,并了解如何使用Fuse Integration透视图来查看Apache Camel路径。

单击“Details”以检查和操作端点的每个属性:

单击Documentation以阅读构建端点时使用的Camel组件的文档:

单击位于视图中心的When端点。

在Properties视图中,选择Details选项卡。

验证端点的Expression是/ order / customer / country ='US':

切换到Source视图以分析端点的等效代码。

Java DSL,Blueprint和Spring XML是Source视图的受支持语言。

在本地运行项目

Red Hat Fuse项目是与Camel上下文关联的Apache Camel路由的集合,这是路由的基本路由规则库。 您在Red Hat Developer Studio中启动Red Hat Fuse项目。

如前所述,无论何时创建Spring或Blueprint应用程序上下文,在camel-context.xml文件中声明的不同Bean都由Spring或OSGi Blueprint框架实例化。 这就是DefaultCamelContext和RouteBuilder(包含基于DSL的路由定义的类)的创建方式。

在本节中,您将运行Red Hat Fuse项目并验证结果是否符合项目的目标。

在Project Explorer视图中,右键单击camel-lab项目并选择New→Folder:

将/ src / main / data文件夹中的五个XML文件复制并粘贴到/ work / cbr / input文件夹中:

右键单击camel-lab项目,然后选择Run As→Local Camel Context:

Apache Camel Maven插件启动,Console视图显示创建了Camel上下文并启动了Apache Camel路由:

在Console视图中看到日志条目,表明对这五个XML文件的处理已完成:

在Project Explorer中,右键单击work / cbr / output文件夹,选择Refresh,然后检查其他,uk和us子文件夹的内容,以验证这些XML文件的最终正确位置:

查看Camel和Java EE JMX MBean的状态

在本节中,您将查看各种Camel和Java EE JMX MBean的状态,使用JMX层和JMX Navigator来发现构成Camel上下文和ActiveMQ代理的不同MBean对象。

选择JMX Navigator视图。

单击“新建连接”图标:

在“创建JMX连接”对话框中,确保选中“默认JMX连接”选项,然后单击“下一步”。

在JMX Navigator视图中,将“用户定义的连接”树展开一级。

双击JMX服务器连接。

连接状态更改为已连接。

将显示JMX Server,MBeans JMX对象和Camel JMX对象的图标。

继续展开Camel JMX域的树,直到出现cbr-route项,然后选择cbr-route:

单击Processors 并检查结果:

单击“配置文件”并检查结果:

启用跟踪和测试

跟踪功能允许您跟踪Exchange对象的内容和处理器的活动。

请按照以下步骤启用跟踪:

在JMX Navigator中,展开Camel JMX域MBean以显示cbr-example-context项。

右键单击cbr-example-context并选择Start Tracing:

当cbr-example-context图标顶部出现绿色错误时,将为Camel路由启用跟踪。

如果没有出现错误,请刷新cbr-example-context:

进一步的测试追踪功能

在本节中,您将进一步测试跟踪功能,创建消息,并使用“消息和属性”视图查看处理详细信息。

使用Project Explorer展开/ src / main / data文件夹。

选择order5.xml文件并复制它。

将文件粘贴到同一目录中,将其重命名为order6.xml:

选择order5.xml文件并再次复制。

将文件粘贴到同一目录中,将其重命名为order7.xml。

在Project Explorer中,将order6.xml和order7.xml文件按顺序拖放到work / cbr / input中

从JMX Navigator视图中选择cbr-route图标。

在Properties视图中,检查有关路由的表格信息,包括:

  • Route ID
  • Processor ID
  • Exchanges Completed
  • Exchanges Failed
  • Mean Processing Time
  • Max Processing Time
  • Min Processing Time
  • Last Processing Time

设计新项目

在本节中,您将设计一个新的Red Hat Fuse项目,并使用Fuse Integration透视图创建Apache Camel路径。 为此,您使用现有的Maven项目并添加Apache Camel路由,HelloBean和向控制台发送消息的业务逻辑。

将sayHello方法添加到Bean

在设计Apache Camel路由之前,必须将sayHello方法添加到HelloBean类的主体。 路线使用此方法。 该方法接受Exchange对象作为输入参数并返回String对象。

查看camel-lab-2项目的项目内容:

查看HelloBean类

打开HelloBean类并添加sayHello方法

将Fuse Apache Camel路由添加到项目中

使用Fuse Integration编辑器创建一个路径,该路由以指定的时间间隔(每X秒)触发一次计时器事件。 要设计路线,请完成以下任务:

创建Camel上下文

编辑计时器和SetBody组件属性

将Bean标记和Bean处理器添加到项目中

将日志处理器添加到项目中

创建Camel上下文

打开Fuse Integration透视图。

在Project Explorer中,展开src / main / resources /目录。

右键单击同一目录,然后选择新建→其他....

在Select a wizard屏幕中,展开General,选择Folder,然后单击Next:

Right-click the blueprint directory to select it.

Select New → Camel XML File:

双击刚创建的camelContext.xml文件,在Fuse Integration编辑器中将其打开。

从Palette的Components部分中,选择Timer组件并将其拖到画布上显示的_route1路径上:

在画布上,选择表示计时器组件的绿色矩形。

在“属性”视图中,将以下值分配给计时器组件的这些属性:

Id:timer-of-the-demo

Uri:timer:// demo?delay = 5000

通过从菜单栏中选择文件→保存来保存您的工作。

从Palette的Transformation部分中,选择Set Body组件并将其拖到_route1路径上:

确保SetBody组件与画布上的计时器组件相邻。

选择SetBody组件后,选择Properties视图中的以下属性:

General Expression: simple

当出现其他属性字段时,将您的名称指定为嵌套Expression属性的值:

创建从timer-of-the-demo组件到SetBody组件的连接:

添加Bean标记和处理器

切换到Camel路由的Source视图。

在第一个CamelContext标记之前添加以下<bean>标记:

<bean id="helloBean" class="com.redhat.gpte.training.camel.HelloBean"/>

创建Apache Camel上下文时,标记是实例化HelloBean单例所必需的。

切换到“设计”视图。

从Palette的Components部分中,选择Bean组件并将其拖到Camel _route1路径上。

添加日志处理器

从Palette的Components部分中,选择Log组件并将其拖到_route1 Camel路径上。

如果画布上的Log组件仍处于选中状态,请将值$ {body}分配给Message字段。

这个简单的表达式提取并管理Camel Exchange主体的内容到运行时日志:

验证生成的源代码类似于:

在本地运行项目

在Project Explorer中,右键单击camelContext.xml文件,然后选择Run As→Local Camel Context ....

CamelContext启动,在下载所有Apache Maven代码工件后,Camel路由激活。

根据计时器组件中设置的5000毫秒值,验证消息是否每五秒钟出现在日志中:

本文分享自微信公众号 - 大魏分享(david-share)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-11-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • IBM PowerHA 6 DARE 的功能介绍

    DARE 的功能介绍 PowerHA 6.1 提供了 cluster 动态调整的功能,即在 cluster 处于活动的状态时,动态地对 cluster 拓扑和资...

    魏新宇
  • 从开发角度看四类企业应用架构1: 通过Maven编译并运行一个Java应用

    魏新宇
  • GPFS 3.4 的配置变更与性能评估

    GPFS 的概念 GPFS 的全称为:General Parallel File System,即通用并行文件系统。IBM GPFS 是一个可自由扩展的高性能并...

    魏新宇
  • 如何设置电脑不能访问公网但是能够访问内网

    方法: 删除本地路由 手动添加只能访问内网的路由 首先查看本地路由 打开cmd 输入 ipconfig /all 通常默认网关对应的路由即是默认...

    我是李超人
  • Blender、Maya、C4D哪个最适合做3D动画?

    写在前面:关于哪个软件更容易学,其实把其中的一个学专学精了都会比较吃香,建议初学者先考虑清楚今后要从事的职业和发展方向,再有针对性的精修;

    Renderbus云渲染农场
  • 总监看完top详解后做出了这样的决定

    top命令是我们在日常工作中用的比较多的一个,学会使用top,就相当于有了一把趁手的兵器,上可九天揽月,下可五洋捉鳖。

    致码DevOps
  • InnoDB引擎的底层实现

    InnoDB的存储文件有两个,后缀名分别是 .frm和 .idb;其中 .frm是表的定义文件, .idb是表的数据文件。

    AlbertZhang
  • Exchange删除移动完成的邮箱记录

    在Exchange服务器维护中,常用 New-MoveRequest 命令来移动邮箱到指定的数据库。要想查询移动的状态,可使用 Get-MoveRequest ...

    水中游泳的小鸟
  • 视频上云网关EasyCVR程序数据库内数据会丢失吗?

    对我们的研发团队来说,做视频行业,除了需要关注传输速率的问题之外,视频数据的存储也是一个重要问题,视频的数据是庞大的,保证视频数据的安全和存储我们同样要重视。

    EasyNVR
  • 使用 Airflow 帮助提升数据质量

    Airflow 是属于 Apache 基金会的开源项目,可以帮助数据工程师构建完整的数据 ETL(数据抽取、转换和加载)流程。Airflow 使用 DAG(有向...

    哒呵呵

扫码关注云+社区

领取腾讯云代金券