设计一个应用集成的路由:构建以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)

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

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏SpringBoot 核心技术

第三十五章:SpringBoot与单元测试的小秘密

3635
来自专栏微信公众号:Java团长

学习Spring MVC——从HelloWorld开始

  时隔十二年,中国女排最终过关斩将,用3:1的成绩证明了自己的实力,霸气夺冠,为中国赢得了一枚意义非常的金牌。这是一次全民的狂欢,一场视听盛宴,带给我们不仅是...

982
来自专栏纯洁的微笑

springboot(二):web综合开发

上篇文章介绍了Spring boot初级教程:spring boot(一):入门篇,方便大家快速入门、了解实践Spring boot特性;本篇文章接着上篇内容继...

4106
来自专栏java系列博客

Java面试通关要点汇总集之框架篇参考答案

2244
来自专栏互联网杂技

SpringBoot ( 二 ) :web 综合开发

spring boot web开发非常的简单,其中包括常用的json输出、filters、property、log等。

1203
来自专栏用户2442861的专栏

25个经典的Spring面试问答

本人收集了一些在大家在面试时被经常问及的关于Spring的主要问题,这些问题有可能在你下次面试时就会被问到。对于本文中未提及的Spring其他模块,我会单独分...

1022
来自专栏潇涧技术专栏

Android Ndk and Opencv Development 2

本节主要介绍的内容是Android NDK开发的核心内容和开发总结(包括很多常见问题的解决方案)。

1072
来自专栏何俊林

插件开发之360 DroidPlugin源码分析(五)Service预注册占坑

在了解系统的activity,service,broadcastReceiver的启动过程后,今天将分析下360 DroidPlugin是如何预注册占坑的?本篇...

2146
来自专栏猿天地

Netty 断线重连解决方案

本篇文章是Netty专题的第七篇,前面六篇文章如下: 高性能NIO框架Netty入门篇 高性能NIO框架Netty-对象传输 高性能NIO框架Netty-整合k...

7898
来自专栏菩提树下的杨过

spring 3.2.x + struts2 + mybatis 3.x + logback 整合配置

与前面的一篇mybatis 3.2.7 与 spring mvc 3.x、logback整合 相比,只是web层的MVC前端框架,从spring mvc转换成s...

4385

扫码关注云+社区

领取腾讯云代金券