前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计一个应用集成的路由:构建以API为中心的敏捷集成系列-第五篇

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

作者头像
魏新宇
发布2018-12-19 10:49:28
3.5K0
发布2018-12-19 10:49:28
举报

声明

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

一、应用集成的需求

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

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

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

公司业务需求

  • 举例: 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毫秒值,验证消息是否每五秒钟出现在日志中:

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-11-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大魏分享 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 路由和中介功能:
  • Java Integration Framework Java集成框架
  • Camel Container
  • Route Registration
  • Life Cycle 生命周期
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档