- JBoss Fuse 教程
- JBoss Fuse – 主页
- JBoss Fuse - ESB 简介
- 什么是 Fuse?
- JBoss Fuse – Apache Karaf
- JBoss Fuse – Apache Camel
- JBoss Fuse – Camel 概念
- JBoss Fuse – Apache CXF
- JBoss Fuse – REST Web 服务
- JBoss Fuse – Apache AMQ
- JBoss Fuse – 使用 Camel 的 AMQ
- JBoss Fuse – Fabric
- JBoss Fuse – 子容器
- JBoss Fuse – 问题和解决方案
- JBoss Fuse 有用资源
- JBoss Fuse 快速指南
- JBoss Fuse - 有用资源
- JBoss Fuse - 讨论
JBoss Fuse 快速指南
JBoss Fuse - ESB 简介
在本章中,我们将从企业服务总线 (ESB) 的基础知识开始。下面是对 ESB 的详细解释,包括其优点、缺点和一些便于理解的图表。
什么是 ESB?
ESB 代表企业服务总线。ESB 最简单的形式是一种中间件,它充当信息高速公路,帮助多个应用程序进行通信。
在企业世界中,我们为许多事情开发解决方案。这些解决方案可能使用不同的技术和不同的数据格式。由于这些技术的通信或数据格式的兼容性差异,将这些解决方案一起使用变得很麻烦。因此,我们需要一种技术来允许这些不同解决方案之间的**松散耦合集成**。
ESB 旨在通过成为位于所有应用程序中间的“中心”,并促进它们之间的消息路由来简化这一集成问题。ESB 充当调解器,充当信息高速公路,负责数据转换路由,让程序员或开发人员专注于自己的应用程序逻辑。
当我们理解 ESB 为其专门设计的问题时,理解 ESB 就变得非常简单,解决方案也变得容易。应该清楚地了解如何启用许多不同的系统(使用不同的语言编写,并在使用不同数据格式的不同机器上运行)来共享信息并形成一个集成的业务平台。
集成问题
在企业平台中,多个应用程序协同工作并整体提供业务功能是很常见的,但这些应用程序的集成是最经常出现的问题。随着应用程序的增长,这个问题会变得更加困难。
每个应用程序都可以使用自己的格式输入和输出数据。如果应用程序的数量较少,这种方法效果很好,但是随着应用程序数量的增加,集成方法也需要改进。例如,如果业务的特定应用程序需要更改,则所有依赖于该主应用程序的应用程序的输出或输入数据格式都会受到影响。
这种方法是集成面临的最大障碍,它需要紧密耦合的架构。这就是 ESB 发挥作用的地方。每个应用程序不需要直接与其他应用程序通信;相反,所有应用程序都与 ESB 通信,ESB 处理信息的路由和内部数据格式转换。
为什么选择 ESB?
以下是解释为什么企业服务总线必不可少的一些要点。
ESB 旨在简化与具有不同兼容性应用程序的集成问题。
它充当中间件,充当所有应用程序的调解器,并促进它们之间的消息路由。
每个应用程序不再直接与其他每个应用程序交互,现在每个应用程序只有一个与 ESB 的接口。
ESB 负责将消息转换为/从通用格式转换,并将其路由到其目的地。
如果必须替换任何现有应用程序,这种方法的主要节省将成为一大优势。您不必编写大量新的接口,而只需关注一个接口(应用程序和 ESB 之间的接口)。
SOA 与 ESB?
SOA 和 ESB 通常可以互换使用,但它们完全不同。
SOA 是一种设计模式,它允许应用程序通过通信协议在网络上公开其功能作为服务,而 ESB 是一种促进不同系统之间通信的模型,但是 ESB 可以用作实施 SOA 的主干。
什么是 Fuse?
JBoss Fuse 是 Red Hat 的开源 ESB 解决方案。它是一个基于社区项目 Apache Servicemix 的企业解决方案。
与 Fuse 集成
JBoss Fuse 是一个轻量级且灵活的集成平台,允许快速集成企业应用程序。
Fuse 最初由 Progressive Software Inc. 开发,该公司于 2012 年被 Red Hat 收购。JBoss Fuse 6.1.0.redhat-379 GA 是 Fuse 的稳定版本,可以从其官方网站下载。
架构
Fuse 将各种技术组合在一起作为单个产品。
组件
Apache CXF
Apache CXF 是一个开源 Web 服务开发框架,它也支持 SOAP 和 REST Web 服务的开发。
Apache Camel
Apache Camel 是一个基于 EIP 的集成框架。EIP 或企业集成模式是企业集成中反复出现问题的已识别解决方案。使用这些预定义的开箱即用模式的组合,可以迅速实现完整的集成解决方案。
它允许使用多种领域特定语言(如 Java、Spring DSL 和 Scala 等)编写路由逻辑。
Apache AMQ
Apache AMQ 是一个 JMS,它根据 JMS 标准提供可靠的消息传递系统。它不仅支持 JMS 规范,还提供 JMS 规范中未包含的一些令人兴奋且有用的功能。
Apache Karaf
Apache Karaf 是一个轻量级的 OSGi 容器,充当工件的运行时环境。与 JVM 相比,Apache Karaf 更具动态性。它允许在运行时安装或卸载模块。Fuse 中的所有工件都部署在 Karaf 中。
Fabric
Fabric 提供了一种简单的方法来管理大型分布式环境中工件的部署。它为所有多个 Fuse 实例提供集中式管理。
安装 Fuse
安装 Fuse 非常简单。与其他 JBoss 产品一样,Fuse 以 zip 文件的形式提供,可以解压缩,并且在进行一些小的配置更改后可以直接启动。
安装 Fuse 是一个四步过程:
下载
从以下链接下载 Fuse 6.1.0 GA。https://jboss.com.cn/
解压缩
与所有其他 JBoss 产品一样,Fuse 也是一个平台无关的 zip 文件。
将下载的文件解压缩到您希望作为 Fuse 安装目录的目标目录中。明智地选择此目录,因为它应该在 Fuse 实例的整个生命周期中保持不变。
**注意** - 即使 Fuse 的解压缩和启动方式与其他 JBoss 产品一样,也不建议在安装完成后将 Fuse 安装从一个位置移动到另一个位置。
配置
解压缩 Fuse 后,您将在解压缩的目录中找到以下目录:
- bin
- etc
- deploy
- lib
- licenses
- extras
- quickstarts
我们将只使用其中的两个目录**bin** 和**etc**。
实际上,在解压缩 Fuse 后,我们应该能够直接启动 Fuse,但这将使用所有默认配置启动 Fuse,这对于生产环境是不建议的。强烈建议在启动 Fuse 之前进行以下更改。
设置环境变量
设置以下环境变量 – **JAVA_HOME**
该变量应指向 Java 安装目录 – **M2_HOME**
该变量应指向 Maven 安装目录 – **PATH**
设置路径变量以包含 Java 和 Maven 可执行文件。
Windows
在 Windows 上,可以通过以下说明进行设置:
开始→我的电脑→右键单击→属性→高级系统设置→环境变量。
UNIX 和克隆系统
对于每个用户,在 *nix 操作系统中都有一个 bash 配置文件。我们可以通过更改此文件来添加或编辑现有的系统变量。
$ vi ~/.bash_profile
**注意** - 此文件的任何更改都是永久性的。强烈建议在更改原始文件之前备份现有文件。
基本配置
我们将讨论 JBoss Fuse 的基本配置,为此,我们必须从以下命令开始 **Edit $FUSE_INSTALLATION_DIR/etc/**
在 **user.properties** 中
#admin=admin,admin
这需要根据我们想要的第一个管理员用户名进行更改,第二个管理员密码,第三个可能保持不变,因为它表示一个角色,并且不要忘记删除 #
例如 – FuseAdmin = FusePAss,admin
在 **system.properties** 中
karafName = root
这指示您要为 Karaf 实例指定的名称。
我们可以将其命名为任何我们想要的名称,例如 Cont1。
确保您指定的名称是唯一的名称,并且尚未被另一个 Fuse 实例使用。
在 **org.ops4j.pax.web.cfg** 中
org.osgi.service.http.port = 8181
此属性指示要用于访问 Fuse 提供的基于浏览器的界面 HAWTIO 的端口
HAWTIO 是从 6.0 版本开始提供的 Fuse 的内置浏览器界面
在 **org.ops4j.pax.url.mvn.cfg** 中
org.ops4j.pax.url.mvn.localRepository = D:/repository
此属性指示 Maven 的本地存储库的路径,Fuse 将从中安装其工件。
org.ops4j.pax.url.mvn.settings = D:/Maven/conf/settings.xml
此属性指示 Fuse 应该使用的 settings.xml,以从 Maven 获取工件。
配置 Maven
Maven 是安装 Fuse 的先决条件。如果您不知道 Maven 是什么,请参考 https://tutorialspoint.com/maven/
Maven 是用于构建 Fuse 工件的构建工具。当我们发出安装工件的命令时,Fuse 首先在 Maven 本地存储库中搜索工件。因此,我们必须让 Fuse 知道 Maven 的安装位置和 Maven 本地存储库的路径。
编辑 $FUSE_INSTALLATION_DIR/etc/ **org.ops4j.paxurl.mvn.cfg**
更新以下两个属性:
- org.ops4j.pax.url.mvn.settings = $M2_HOME/conf/settings.xml
- org.ops4j.pax.url.mvn.localRepository = $local_repo
**注意** - 请将 **$local_repo** 更改为 Maven settings.xml 中提到的本地存储库的实际路径。
运行
完成基本的配置更改后,我们现在可以启动Fuse。所有与Fuse一起使用的二进制文件都位于$FUSE_INSTALLATION_DIR。
启动Fuse有两种方法:
使用./fuse
这将允许您在启动Fuse的同一窗口中查看所有进度和日志。
它将在与下面所示相同的终端中提供Karaf控制台。
注意:这将在控制台模式下启动Fuse,这意味着当用户注销会话或关闭终端时,Fuse进程也将停止,这在生产或开发场景中是不希望的。此脚本仅应用于调试Fuse。
使用./start
这不会在屏幕上显示任何日志,甚至不会显示进度,但这将在后台启动Fuse,并且当用户退出会话或关闭终端时,Fuse服务不会停止。
在实际应用程序中,需要这种行为。即使我们关闭终端,Fuse也应该在后台运行。
如果要连接到在后台运行的Fuse,可以使用位于同一文件夹中的client脚本。
您应该获得如下所示的显示。
退出客户端脚本不会停止Fuse服务。它只会关闭Fuse控制台。
HAWTIO
Fuse还使用FMC(Fuse管理控制台)提供对其的完整GUI访问。您可以在以下URLhttps://:8181上找到GUI。
通过执行命令所做的所有操作也可以通过访问此基于浏览器的GUI来完成。当我们有多个容器并在Fabric环境中运行时,它变得非常有用。
JBoss Fuse - Apache Karaf
在本章中,我们将讨论Apache Karaf,以及为什么它被称为轻量级OSGi容器,以及它的优点和其他重要特性。
JVM问题
JVM或Java虚拟机并不充当实际的虚拟机。一台机器,允许您动态地停止、启动或重新启动在其内部运行的组件。它有时可能允许类级别的热部署,但是您无法在虚拟机中部署或卸载应用程序的组件而无需重新启动它。
为了解决这个问题并在Java应用程序中允许模块化,Fuse使用基于OSGi的运行时,称为Apache Karaf。
OSGi
OSGi技术是一组规范,定义了Java的动态组件系统。这些规范允许开发模型,其中应用程序由许多不同的(可重用)组件(动态地)组成。
OSGi的优点
降低复杂性:应用程序构建为协作组件,这些组件彼此隐藏其实现细节,从而降低了复杂性。
可重用性:许多组件可以利用部署在容器中的相同组件。
部署:OSGi通过其生命周期管理API支持动态启动、停止和更新组件,而无需重新启动容器。
Bundle与Feature
以下是Bundle和Feature之间的比较。
Bundle
Bundle对于OSGi相当于JAR对于JVM。Bundle是在OSGi容器中可部署的工件。Bundle是协同工作或独立工作以形成应用程序的组件。
这些Bundle可以在运行时安装、卸载、更新、启动或停止,而无需重新启动容器。
Feature
Feature是一种将多个Bundle一起部署的方法。有时,将Bundle分组部署更有意义。Feature允许我们只需一个命令即可部署一组Bundle。
为什么需要另一个容器?
Apache Karaf是一个基于OSGi的运行时,我们的应用程序Bundle就在其中运行。Fuse使用Apache Karaf作为其运行时,Bundle在其中运行并协作以提供业务功能。
Karaf构建在Felix和equinox之上,它们是OSGi框架。
Karaf架构
Apache Karaf为基本的OSGi运行时添加了以下附加功能。
热部署
Karaf支持热部署。它包含一个热部署目录。放置在此目录中的任何内容都将自动部署并作为Bundle安装到Karaf中。
日志记录
Karaf通过在$Fuse_home/data/log中为所有Bundle生成日志来提供集中式日志记录。我们可以在$Fuse_home/etc目录中的org.ops4j.pax.logging.cfg中编辑日志记录器配置。
管理控制台
Karaf提供了一个复杂而清晰的管理控制台来与Fuse的运行实例进行交互。它还提供了一套预安装的命令,可用于在运行时管理和监控组件(Bundle)。此控制台是可扩展的,因此它允许我们通过向控制台添加新的Bundle来向控制台添加新命令。
SSH访问
Karaf允许通过SSH远程访问此管理控制台。任何拥有有效凭据的人都可以通过SSH终端连接到Karaf管理控制台。
JBoss Fuse - Apache Camel
在本章中,我们将讨论什么是Apache Camel以及它如何有效地在端点之间路由数据,以及一些示例。
什么是Apache Camel?
Apache Camel是一个开源集成框架,于2007年初启动。
它是一种基于EIP(企业集成模式)的方法,它提供了几种现成的模式实现,可用于解决企业集成问题。EIP只不过是针对企业集成中记录良好且反复出现的问题的成熟解决方案。
Camel也称为路由和中介引擎,因为它有效地在端点之间路由数据,同时承担繁重的负载,例如数据格式转换、端点连接等等。
基本示例
使用Apache Camel的先决条件:
- Java
- Maven
- Redhat JBoss Fuse 6.1-GA-379
创建应用程序的基本框架
mvn:archetype generate –DgroupId = com.tutorialpoint.app –DartifactId = camel-first-app –DarchetypeGroupId = org.apache.camel.archetypes –DarchetypeArtifactId = camel-archetype-spring –DinteractiveMode = false -X
这应该生成以下目录结构。
这是我们生成的Camel应用程序的基本框架。
编辑camel-context.xml
编辑camel-first-app → src → main → resources → META-INF\spring\camel-context.xml使其与以下内容匹配
<?xml version = "1.0" encoding = "UTF-8"?>
<!-- Configures the Camel Context-->
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://camel.apache.org/schema/spring
http://camel.apache.org/schema/spring/camel-spring.xsd">
<camelContext xmlns = "http://camel.apache.org/schema/spring">
<!-- here is a sample which processes the input file
(leaving them in place - see the 'noop' flag)
then performs content based routing on the message using XPath -->
<route>
<from uri = "file:///d:/src/data?noop=false"/>
<choice>
<when>
<xpath>/person/city = 'London'</xpath>
<log message = "UK message"/>
<to uri = "file:///d:/target/messages/uk"/>
</when>
<otherwise>
<log message = "Other message"/>
<to uri = "file:///d:/target/messages/others"/>
</otherwise>
</choice>
</route>
</camelContext>
</beans>
编辑pom.xml
在<plugins></plugins>内添加以下代码:
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<version>2.3.4</version>
<extensions>true</extensions>
<configuration>
<instructions>
<Bundle-SymbolicName>
${project.artifactId}
</Bundle-SymbolicName>
<Import-Package>*</Import-Package>
</instructions>
</configuration>
</plugin>
将打包类型从jar → bundle更改。
<packaging>bundle</packaging>
使用以下命令构建项目:
mvn clean install
将项目安装到Fuse
使用Fuse.bat/start.bat启动Fuse。如果使用start.bat启动Fuse,请使用client.bat连接到Fuse。您应该获得如下所示的UI。
这是用于访问Karaf和Fuse命令的CLI。
install –s mvn:com.tutorialpoint.app/camel-firt-app/1.0-SNAPSHOT
测试您的项目是否正在运行
现在您的应用程序应该安装在Fuse中。将camel-first-app内的data目录复制并放置在D:/src/中,它应该将包含city = London的消息复制到D:/target/merssages/uk。
将输入文件放在D:/src/data中
输入
Message1.xml
<?xml version = "1.0" encoding = "UTF-8"?> <person user = "james"> <firstName>James</firstName> <lastName>Strachan</lastName> <city>London</city> </person>
Message2.xml
<?xml version = "1.0" encoding = "UTF-8"?> <person user = "hiram"> <firstName>Hiram</firstName> <lastName>Chirino</lastName> <city>Tampa</city> </person>
输出
在D:/target/messages/uk
<?xml version = "1.0" encoding = "UTF-8"?> <person user = "james"> <firstName>James</firstName> <lastName>Strachan</lastName> <city>London</city> </person>
在D:/target/messages/others
<?xml version = "1.0" encoding = "UTF-8"?> <person user = "hiram"> <firstName>Hiram</firstName> <lastName>Chirino</lastName> <city>Tampa</city> </person>
JBoss Fuse - Camel概念
在本章中,我们将了解不同的Camel概念。让我们从一个基本的例子开始,了解核心概念。
CamelContext
每个Camel应用程序至少都有一个CamelContext。这是我们添加Camel路由的地方。它类似于Spring的ApplicationContext。
Camel context可以被认为是一个容器,它将所有东西整合在一起。一个Camel context可以在其中包含多个路由。
路由
CamelContext可以包含一个或多个路由。路由是集成逻辑,它定义了数据如何在Camel context中从一个端点流向另一个端点。
端点
端点是通道的末端,系统可以通过它发送或接收消息。这就是我们在通信语言中所说的目的地或来源。
组件
组件是Camel中的扩展点。组件可以是技术、数据格式、转换器等的接口。它们也可以充当端点的工厂。
EIP
EIP代表企业集成模式。这些是针对重复出现的问题的已识别和众所周知的解决方案。Camel支持大多数企业集成模式。
基于内容的路由器
CBR模式允许我们根据输入文件的内容路由数据。
当我们必须根据输入正文的内容路由值时,使用此模式。
以下示例将从D:/data/input目录读取数据。读取后,它将检查data标签内的value标签。如果value标签包含value1,它将被发送到D:/value1,如果它包含value2,它将被发送到D:/value2,如果两者都不包含,则它将被发送到others。
<CamelContext xmlns = "http://camel.apache.org/schema/spring">
<route>
<from uri = "file:///D:/data/input"/>
<choice>
<when>
<xpath>/data/value = 'value1'</xpath>
<to uri = "file:///D:/value1"/>
</when>
<when>
<xpath>/data/value = 'value2'</xpath>
<to uri = "file:///D:/value2"/>
</when>
<otherwise>
<to uri = "file:///D:/others "/>
</otherwise>
</choice>
</route>
</camelContext>
输入
D:/data/input/message1.xml
<data> <value>value1</value> </data>
D:/data/input/message2.xml
<data> <value>value2</value> </data>
输出
D:/value1/
<data> <value>value1</value> </data>
D:/value2/
<data> <value>value2</value> </data>
拆分器
拆分器模式用于将输入数据拆分为较小的块。
此模式通常与需要拆分成块的大量输入数据一起使用,因此它变得可处理。它根据输入标记字符串将输入分解成较小的片段。
<CamelContext xmlns = "http://camel.apache.org/schema/spring">
<route>
<from uri = "file:///D:/inbox"/>
<split streaming = "true">
<tokenize token = "order" xml = "true"/>
<to uri = "activemq:queue:order"/>
</split>
</route>
</CamelContext>
输入
D:/inbox/message.xml
<order>
<data>
<value>value1</value>
</data>
</order>
<order>
<data>
<value>value2</value>
</data>
</order>
<order>
<data>
<value>value3</value>
</data>
</order>
输出
如果检查AMQ,您会发现发布了3条消息。
<order>
<data>
<value>value4</value>
</data>
</order>
收件人列表
当需要从消息正文本身检索收件人列表时,使用收件人列表模式。
在以下示例中,一条消息将发送给在customer标签中列出的所有收件人,这些收件人是逗号分隔的字符串列表。
<CamelContext xmlns = "http://camel.apache.org/schema/spring">
<route>
<from uri = "jms:xmlOrders" />
<recipientList>
<xpath>/order/customer</xpath>
</recipientList>
</route>
</camelContext>
其他EIP
Camel几乎支持所有已识别的EIP。一些常用的EIP如下所示。
日志:记录完整消息或部分消息
消息过滤器:过滤消息内容
重新排序器:按顺序获取所有标记
Wiretap:检查正在传输的消息
EIP的完整列表及其用法可以在Camel的官方文档中找到 http://camel.apache.org/eip.html
Camel中的异常处理
使用错误处理程序:这是处理Camel中异常的最简单方法。
要使用此方法,我们必须配置错误处理程序类bean并将其作为引用提供给CamelContext errorHandlerRef属性。
<bean id = "loggingErrorHandler" class = "org.apache.camel.builder.LoggingErrorHandler"> <property name = "logName" value = "mylogger.name"/> <property name = "level" value = "DEBUG"/> </bean> <camelContext errorHandlerRef = ” loggingErrorHandler” > … </camelContext>
使用Try Catch Finally
Camel还支持Java风格的Try Catch Finally块进行错误处理。
就像Java一样,它具有以下三个块:
doTry块包含可能生成异常的代码。
doCatch块包含在发生异常时需要执行的代码。
doFinally块包含必须执行的代码,无论是否发生异常。无论是否引发异常,它都将始终执行。
注意:Mock是测试组件,不建议用于其他目的。它是Camel中用于测试的组件,就像测试驱动开发中的jMOck组件一样。
<route>
<from uri = "direct:start"/>
<doTry>
<process ref = "someProcesorThatmayFail"/>
<to uri = "mock:result"/>
<doCatch>
<exception>java.io.IOException</exception>
<exception>java.lang.IllegalStateException</exception>
<to uri = "mock:catch"/>
</doCatch>
<doFinally>
<to uri = "mock:finally"/>
</doFinally>
</doTry>
</route>
在上面的示例中,我们可以提供catch块需要处理的异常列表。
在Fuse中部署Bundle
使用Fuse.bat/start.bat启动Fuse。
如果使用start.bat启动Fuse,请使用client.bat连接到Fuse。您应该获得如下所示的UI。
这是用于访问Karaf和Fuse命令的CLI。
install –s mvn:group.id /artifact.id/version e.g. install –s mvn:com.tutorialpoint.app/camel-firt-app/1.0-SNAPSHOT
JBoss Fuse - Apache CXF
在本章中,让我们讨论什么是Apache CXF以及它如何在开发SOAP和Rest Web服务中提供帮助。
什么是Apache CXF?
Apache CXF是一个Web服务开发框架,可用于开发SOAP和Rest Web服务。CXF完全符合JAX-RS和JAX-Ws标准。
它现在是最广泛使用的Web服务开发框架。CXF已经学习并改进了Axis2,Axis2现在正逐渐被CXF取代。
CXF与Axis2
| CXF | Axis2 | |
|---|---|---|
| 改进 | CXF是目前最常用的框架。 它对Axis2有很多改进 |
Axis2正逐渐被CXF取代。 与CXF相比,它需要更多代码 |
| 所需代码 | 与Axis2相比,CXF需要的代码更少 |
Axis2相比之下需要更多代码 |
| 标准符合性 | CSF 完全兼容 JAX-RS 和 JAX-WS |
Axis2 不完全兼容 JAX-RS 和 JAX-WS |
| 兼容 Spring | 是 |
否 |
| 前端分离 | 前端与 JAX-WS 代码干净分离 |
未提供干净的分离 |
SOAP
SOAP 代表简单对象访问协议 (Simple Object Access Protocol)。它是一种用于在两个系统之间通过 Web 服务交换结构化信息的协议。它主要依赖于 XML 来构建数据,并使用 HTTP 或 SMTP 进行消息协商和传输。
有两种开发 SOAP Web 服务的方法:
代码优先 (Code first) − 在这种方法中,WSDL 从代码生成。
契约优先 (Contract first) − 在契约优先方法中,代码从 WSDL 生成。
使用 CXF 开发 SOAP
配置 Maven
将以下配置文件添加到 Maven 的 settings.xml 文件中。
<profiles>
<profile>
<id>Jboss-Fuse</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<repositories>
<repository>
<id>fusesource</id>
<url>http://repo.fusesource.com/nexus/content/groups/public/</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
<releases>
<enabled>true</enabled>
</releases>
</repository>
</repositories>
</profile>
</profiles>
创建骨架
mvn archetype:generate -DarchetypeGroupId = org.apache.servicemix.tooling -DarchetypeArtifactId = servicemix-cxf-code-first-osgi-bundle -DarchetypeVersion=2012.01.0.redhat-60024 -DgroupId = org.fusesource.example -DartifactId = cxf-basic -Dversion = 1.0-SNAPSHOT
构建 Web 服务项目.
mvn clean install
使用以下命令将 Web 服务安装到 Fuse 中.
JBossFuse:karaf@root>install -s mvn:org.fusesource.example/cxf-basic/1.0-SNAPSH
检查 bundle 是否已注册 SOQP Web 服务
打开 URL https://:8181/cxf
Web 服务应按如下方式列出。
测试 Web 服务
mvn -Pclient
信息 − 从 com.to 类创建服务 {http://ws.totorials.com/} PersonService
torials.ws.Person Invoking getPerson... getPerson._getPerson_personId = Guillaume getPerson._getPerson_ssn = 000-000-0000 getPerson._getPerson_name = Guillaume [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 30.668 s [INFO] Finished at: 2016-02-15T21:01:20+05:30 [INFO] Final Memory: 10M/37M [INFO] ------------------------------------------------------------------------
JBoss Fuse - REST Web 服务
首先,REST 代表具象状态传输 (Representational State Transfer)。它是一种基于无状态、可缓存的客户端-服务器协议(大多数情况下为 HTTP)开发 Web 服务的方法。
REST Web 服务使用 HTTP 请求来发布、获取和删除网络数据。
使用 CXF 开发 REST
创建一个简单的 Maven 快速启动项目
mvn archetype:generate -DgroupId = com.tuts.abhinav -DartifactId = rest-service -DarchetypeArtifactId = maven-archetype-quickstart -DinteractiveMode = false
添加依赖项
<dependency> <groupId>org.apache.servicemix.specs</groupId> <artifactId>org.apache.servicemix.specs.jsr311-api-1.1.1</artifactId> <version>1.9.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.servicemix</groupId> <artifactId>servicemix-http</artifactId> <version>2013.01</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.16</version> </dependency>
添加构建指令
<build>
<defaultGoal>install</defaultGoal>
<plugins>
<plugin>
<groupId>org.apache.felix</groupId>
<artifalctId>maven-bundle-plugin</artifactId>
<version>2.3.4</version>
<extensions>true</extensions>
<configuration>
<instructions>
<Bundle-SymbolicName>rest-example-database-post-method
</Bundle-SymbolicName>
<Import-Package>* </Import-Package>
</instructions>
</configuration>
</plugin>
</plugins>
</build>
添加 Fuse 插件仓库
<pluginRepositories>
<pluginRepository>
<id>fusesource.m2</id>
<name>FuseSource Community Release Repository</name>
<url>http://repo.fusesource.com/nexus/content/repositories/releases</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
<releases>
<enabled>true</enabled>
</releases>
</pluginRepository>
<pluginRepositories>
添加仓库
<repositories>
<repository>
<id>fusesource.m2</id>
<name>FuseSource Community Release Repository</name>
<url>http://repo.fusesource.com/nexus/content/repositories/releases</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
<releases>
<enabled>true</enabled>
</releases>
</repository>
<repository>
<id>fusesource.ea</id>
<name>FuseSource Community Early Access Release Repository</name>
<url>http://repo.fusesource.com/nexus/content/groups/ea</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
<releases>
<enabled>true</enabled>
</releases>
</repository>
</repositories>
创建服务类
在 com/tuts/ 下创建类 UserService.java
package com.tuts;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
@Path("/UserService_1")
public class UserService {
@GET
@Path("/get_data")
@Produces(MediaType.APPLICATION_JSON)
public String getUser() {
String reponse = "This is standard response from REST";
return reponse;
}
}
创建 Blueprint.xml
在 /src/main/resources/OSGI-INF/blueprint 下创建 blueprint.xml 文件
<?xml version = "1.0" encoding = "UTF-8"?>
<blueprint xmlns = "http://www.osgi.org/xmlns/blueprint/v1.0.0"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xmlns:jaxrs = "http://cxf.apache.org/blueprint/jaxrs"
xsi:schemaLocation = "http://www.osgi.org/xmlns/blueprint/v1.0.0
http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd
http://cxf.apache.org/blueprint/jaxrs
http://cxf.apache.org/schemas/blueprint/jaxrs.xsd">
<jaxrs:server id = "service" address = "/users">
<jaxrs:serviceBeans>
<ref component-id = "userService" />
</jaxrs:serviceBeans>
</jaxrs:server>
<bean id = "userService" class = "com.tuts.UserService" />
</blueprint>
在 Fuse 中安装 REST 服务
install -s mvn:com.tuts.abhinav/rest-service/1.0-SNAPSHOT
检查 Bundle 是否已注册 Web 服务
打开 URL https://:8181/cxf
测试 Web 服务
打开 URL https://:8181/cxf/users12/UserService_1/get_data
JBoss Fuse - Apache AMQ
在本章中,我们将了解 ActiveMQ 以及它如何充当消息代理,从而允许应用程序彼此通信。
什么是 AMQ?
ActiveMQ 是一个用 Java 编写的开源消息代理。它完全符合 JMS 1.1 标准。
JMS 是一种允许开发基于消息的系统的规范。ActiveMQ 充当消息代理,位于应用程序之间,允许它们以异步和可靠的方式进行通信。
消息类型
为了更好地理解,下面解释了两种消息传递选项。
点对点
在这种类型的通信中,代理仅将消息发送给一个消费者,而其他消费者将等待从代理接收消息。没有消费者会收到相同的消息。
如果没有消费者,代理将保留消息,直到它获得一个消费者。这种类型的通信也称为基于队列的通信,其中生产者将消息发送到队列,并且只有一个消费者从队列中获取一条消息。如果有多个消费者,他们可能会收到下一条消息,但他们不会收到与其他消费者相同的消息。
发布/订阅
在这种类型的通信中,代理将相同的消息副本发送给所有活动消费者。这种类型的通信也称为基于主题的通信,其中代理将相同的消息发送给已订阅特定主题的所有活动消费者。此模型支持单向通信,不需要对传输的消息进行验证。
创建队列和主题
Fuse 自带 ActiveMQ。我们可以使用 FMC 控制台(基于浏览器的 AMQ 工作界面)访问 ActiveMQ。
使用localhost:8181登录 FMC 并选择ActiveMQ选项卡。
- 点击 +创建
- 输入队列/主题名称
- 从单选按钮中选择队列/主题
- 点击创建队列/创建主题
现在您应该能够在 root → Queue → 下看到已创建的TestQ。
要检查已创建的主题,请按照 root → Topic 操作。
浏览/删除队列的内容
使用localhost:8181登录 FMC
选择 ActiveMQ 选项卡
Root → Queue → TestQ
- 要检查此消息的内容,请点击该特定消息。
您可以通过点击右上角的“删除”按钮来删除特定消息
JBoss Fuse - 使用 Camel 的 AMQ
在本章中,我们将学习 ActiveMQ 如何与 Camel 协同工作的基础知识。
配置 ActiveMQ 组件
在我们可以在代码中使用 ActiveMQ 队列或主题之前,我们必须配置 ActiveMQComponent。ActiveMQComponent 的最小配置可以按照以下程序所示进行:
<bean id = "activemq" class = "org.apache.activemq.camel.component.ActiveMQComponent"> <property name = "brokerURL" value = "tcp://:61616"/> <property name = "userName" value = "admin"/> <property name = "password" value = "admin"/> </bean>
brokerURL − 指定 AMQ 代理的主机和端口。
username − 指定用于连接到 AMQ 代理的用户名。
password − 指定用于连接到 AMQ 代理的密码。
连接到队列
现在我们已经配置了 ActiveMQComponent,我们可以在我们的 CamelContext 中将其用作端点。
我们将使用以下格式的 AMQ 端点:
Activemq:[queue|topic]:[queueName|topicName]
将消息写入 AMQ
<?xml version = "1.0" encoding="UTF-8"?> <!-- Configures the Camel Context--> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
在 Fuse 容器中部署此 bundle 后,您应该能够看到已发布到 AMQ 的消息,这些消息作为文件放置在D:/src/data中。
输入
D:/src/data/input.txt
Test me
输出
从 AMQ 读取
<?xml version = "1.0" encoding = "UTF-8"?>
<!-- Configures the Camel Context-->
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://camel.apache.org/schema/spring
http://camel.apache.org/schema/spring/camel-spring.xsd">
<camelContext xmlns = "http://camel.apache.org/schema/spring">
<!-- here is a sample which processes the input files
(leaving them in place - see the 'noop' flag)
then performs content based routing on the message using XPath -->
<route>
<from uri = "activemq:queue:TestQ"/>
<to uri = "file:///d:/src"/>
</route>
</camelContext>
<bean id = "activemq" class = "org.apache.activemq.camel.component.ActiveMQComponent">
<property name = "brokerURL" value = "tcp://:61616"/>
<property name = "userName" value = "admin"/>
<property name = "password" value = "admin"/>
</bean>
</beans>
输入
部署此 bundle 后,您应该会看到在 D:/src 中生成一个文件,并且消息已消耗。还应为此队列显示消费者。
输出
D:/src
Test me
写入主题
<?xml version = "1.0" encoding = "UTF-8"?>
<!-- Configures the Camel Context-->
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://camel.apache.org/schema/spring
http://camel.apache.org/schema/spring/camel-spring.xsd">
<camelContext xmlns = "http://camel.apache.org/schema/spring">
<!-- here is a sample which processes the input files
(leaving them in place - see the 'noop' flag)
then performs content based routing on the message using XPath -->
<route>
<from uri = "file:///d:/src"/>
<to uri = "activemq:topic:TestTopic” />
</route>
</camelContext>
<bean id = "activemq" class = "org.apache.activemq.camel.component.ActiveMQComponent">
<property name = "brokerURL" value = "tcp://:61616"/>
<property name = "userName" value = "admin"/>
<property name = "password" value = "admin"/>
</bean>
</beans>
从主题读取
<?xml version = "1.0" encoding = "UTF-8"?>
<!-- Configures the Camel Context-->
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://camel.apache.org/schema/spring
http://camel.apache.org/schema/spring/camel-spring.xsd">
<camelContext xmlns = "http://camel.apache.org/schema/spring">
<!-- here is a sample which processes the input files
(leaving them in place - see the 'noop' flag)
then performs content based routing on the message using XPath -->
<route>
<from uri = "activemq:topic:TestTopic"/>
<to uri = "file:///d:/src2"/>
</route>
</camelContext>
<bean id = "activemq" class = "org.apache.activemq.camel.component.ActiveMQComponent">
<property name = "brokerURL" value="tcp://:61616"/>
<property name = "userName" value = "admin"/>
<property name = "password" value = "admin"/>
</bean>
</beans>
输入
D:/src/file1.xml
<order>
<data>
<value>value1</value>
</data>
</order>
<order>
<data>
<value>value2</value>
</data>
</order>
<order>
<data>
<value>value3</value>
</data>
</order>
输出
D:/src/
<order>
<data>
<value>value1</value>
</data>
</order>
<order>
<data>
<value>value2</value>
</data>
</order>
<order>
<data>
<value>value3</value>
</data>
</order>
JBoss Fuse - Fabric
什么是 Fabric?
Fabric 为多个 Fuse 实例提供管理和编排功能。Fabric 允许我们从单点控制连接到它的所有 Fuse 实例。普通的 Fuse 容器可以转换为 Fabric。Fabric 中包含 Fabric 注册表,它充当数据存储,其中包含有关其管理的容器的所有信息。
为什么选择 Fabric?
Fabric 具有以下特殊功能,使其成为在分布式环境中使用的理想选择。
- 监控 Fabric 中所有容器的状态。
- 启动和停止远程容器。
- 配置远程容器以运行特定应用程序。
- 升级应用程序并在实时系统中推出补丁。
- 快速启动和配置新容器,例如应对系统负载增加。
Fabric 设置
创建 Fabric
可以使用以下命令将普通的 Fuse 容器转换为 Fabric
fabric: create --clean --zookeeper-password myZooPass
将其他容器连接到 Fabric:
fabric:join --zookeeper-password myZooPass <fabric_host>:2181 Cont1
注意 − 请将 <fabric_host> 替换为实际运行 Fabric 的主机名。
当您使用localhost:8181从浏览器登录 Fuse 管理控制台时,您应该能够看到两个容器,如下面的屏幕截图所示。Fabric 容器由其前面的一个小云符号表示。
配置文件
配置文件包含以下信息:
- 要安装的 Bundle
- 要安装的功能
- 要应用的配置
配置文件提供了一种在 Fabric 环境中在多个服务器上安装相同的一组 Bundle、功能和配置的方法。
如果将相同的配置文件应用于多个容器,并且我们从任何容器对该配置文件进行更改,则类似的更改将自动部署到应用了该配置文件的其余容器。
创建配置文件
登录 FMC localhost:8181
运行时 → 管理
在左侧的“配置文件”菜单下,点击+
输入要赋予配置文件的名称,然后点击创建。
之后,应该创建配置文件。
将配置文件应用于容器
运行时 → 容器 → root(选择所需的容器)
点击添加,这将打开一个弹出框。搜索所需的配置文件,然后再次点击添加。
配置文件应显示在列表中,如下面的屏幕截图所示。
部署 Bundle
要部署 Bundle,请使用以下路径:
运行时 → 容器 → root(选择所需的容器)→ First_profile(选择配置文件)
点击 Bundle 选项卡。设置以下格式的 Bundle 路径,然后点击+。
mvn:group.id/artifact.id/version
例如:mvn:com.tutorialpoint.app/camel-firt-app/1.0-SNAPSHOT
Bundle 将添加到配置文件中,并将部署到已分配该配置文件的所有容器。
卸载 Bundle
要卸载 Bundle,请使用以下路径:
运行时 → 容器 → root(选择所需的容器)→ First_profile(选择配置文件)
点击 Bundle 选项卡,搜索要删除的 Bundle,然后点击X。Bundle 将从应用了该配置文件的所有容器中删除。
JBoss Fuse - 子容器
子容器提供了管理不断增长的负载的最简单方法。当系统遇到流量突然增加,单个容器无法应对负载时,我们可以轻松创建一组子容器并在它们之间分配负载,而不是创建全新的容器。
创建子容器
使用localhost:8181登录 FMC
现在,按照以下路径操作:运行时 → 容器 → +创建(右侧的按钮)
输入子名称、父容器实例数等详细信息。
点击创建并启动容器
管理子容器
子容器仅充当普通容器。
停止子容器
要停止子容器,请按照以下路径操作:运行时 → 容器 → Child1
点击停止以停止子容器。
启动子容器
要启动子容器,请按照以下路径操作:运行时 → 容器 → Child1
点击“启动”以启动子容器。
JBoss Fuse - 问题和解决方案
本章将讨论使用 Fuse 时可能遇到的一些已知问题,并介绍如何解决这些问题。
代码更改未反映
使用客户端脚本连接到 Fuse 实例。使用以下命令搜索您遇到问题的捆绑包。
JBossFuse:karaf@root > list|grep <Bundle Description> For Example: JBossFuse:karaf@root > list|grep Camel [ 255] [Active ] [ ] [ ] [ 60] Fabric8 :: Camel Component (1.0.0.redhat-379) [ 266] [Active ] [ ] [Started] [ 60] A Camel Spring Route (1.0.0.SNAPSHOT)
注意 - 从上述命令的输出中获取捆绑包 ID,并使用以下命令。
JBossFuse:karaf@root > update <bundle id> JBossFuse:karaf@root > update 266
捆绑包未下载
这可能是由于以下两个原因造成的:
- 未指定 Maven 仓库
- 仓库中不存在捆绑包
未指定 Maven 仓库
Maven 是一个用于构建 Fuse 工件的构建工具。当我们发出安装工件的命令时,Fuse 首先会在 Maven 本地仓库中搜索工件。因此,我们必须让 Fuse 知道 Maven 的安装位置和 Maven 本地仓库的路径。
编辑 $FUSE_INSTALLATION_DIR/etc/ **org.ops4j.paxurl.mvn.cfg**
更新以下两个属性:
- org.ops4j.pax.url.mvn.settings = $M2_HOME/conf/settings.xml
- org.ops4j.pax.url.mvn.localRepository = $local_repo
注意 - 请将 $local_repo 替换为 Maven settings.xml 文件中提到的本地仓库的实际路径。
仓库中不存在捆绑包
如果 Maven 设置已就位,但在下载捆绑包时仍然遇到问题,请确保捆绑包的 JAR 文件存在于 Maven 仓库的正确位置。
例如,如果下载以下捆绑包时出现错误:
mvn:com.tutorialpoint.app/camel-first-app/1.0-SNAPSHOT
我们必须在 $M2_REPO/com/tutorialpoint/app/camel-first-app/1.0-SNAPSHOT 中检查实际的 JAR 文件是否存在。
注意 - 需要将 $M2_REPO 替换为 Fuse 配置为使用的 Maven 仓库的实际路径。
无法登录 FMC(基于浏览器的 GUI)
未创建用户 - 如果您看到以下 UI,但无法登录,并显示“登录失败,禁止访问”的消息。
检查是否已在 $FUSE_INSTALLATION_HOME/etc/users.properties 中添加用户。
添加用户的正确格式为:
Username = Password,Role
HAWTIO 端口不同
如果您甚至无法在浏览器中通过 localhost:8181 获取 UI,请检查您是否在 URL 中提到了正确的端口。
$FUSE_INSTALLATION_HOME/etc/org.ops4j.pax.web.cfg
编辑文件中以下属性以使用您要访问的端口。
org.osgi.service.http.port=8181
AMQ Broker 无法工作
确保 61616 端口已打开且当前未被其他端口使用。如果要更改此默认 61616 端口,可以在 $FUSE_INSTALLATION_HOME/etc/System.properties 中编辑它。
activemq.port = 61616