在 Spring Boot 上使用 Fuse
在 Spring Boot 上开始使用 Red Hat Fuse
摘要
前言
为了开始使用 Fuse,您需要下载并安装 Spring Boot 容器的文件。有关安装、开发和构建第一个 Fuse 应用程序的信息和说明。
使开源包含更多
红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。我们从这四个术语开始:master、slave、黑名单和白名单。由于此项工作十分艰巨,这些更改将在即将推出的几个发行版本中逐步实施。详情请查看我们的 CTO Chris Wright 信息。
第 1 章 在 Spring Boot 上使用 Fuse
要在 Spring Boot 上开发 Fuse 应用程序,可以生成并构建在 Spring Boot 上运行的 Fuse 示例增强程序项目。以下主题提供详情:
1.1. 关于 Spring Boot 上的 Fuse
Spring Boot 是众所周知的 Spring 容器的演进。Spring Boot 容器的一种不同质量是容器功能划分为小的块,它们可以单独部署。通过这种质量,您可以部署具有较小、专用于特定服务的容器,而且这种能力完全符合 微服务架构的范畴。
此容器技术的独特特点是:
- 尤其是适用于在可扩展云平台(Kubernetes 和 OpenShift)上运行。
- 占用空间小(适合微服务架构)。
- 针对配置 的 惯例进行了优化。
- 不需要应用服务器。您可以在 JVM 中直接运行 Spring Boot 应用程序 Jar。
1.2. 生成 booster 项目
Fuse booster 项目存在帮助开发人员开始运行独立应用程序。此处提供的说明,您可以生成其中一个增强程序项目,即 Circuit Breaker booster。本练习演示了在 Spring Boot 上 Fuse 的有用组件。
Netflix/Hystrix 电路断路器支持分布式应用程序处理对网络连接中断以及后端服务的临时不可用。断路器模式的基本理念是,会自动检测到相依服务的丢失,如果后端服务暂时不可用,可以编程替代行为。
Fuse 断路器提升程序由两个相关服务组成:
-
名称服务,返回
名称
到 greet 的后端服务。 -
一个
greetings
服务,调用name
服务的 frontend 服务以获取名称,然后返回字符串Hello, NAME
。
在本增强器演示中,Hystrix 断路器在 greetings
服务和 名称服务
之间插入。如果 后端名称
服务不可用,则 greetings
服务可以回退到替代行为,并立即响应客户端,而不必在等待 名称服务
重启时被阻止。
先决条件
- 您必须有权访问 {NameDevelopersPlatform}。
- 您必须具有受支持的 Java Developer Kit(JDK)版本。详情请查看 支持的配置 页面。
- 您必须已安装并配置了 Apache Maven 3.3.x 或更高版本,如 在 本地设置 Maven所述。
流程
- 导航到 https://developers.redhat.com/launch。
单击 START。
launcher 向导提示您登录到您的红帽帐户。
- 单击登录或注册按钮,然后登录。
- 在 Launcher 页面上,单击 Deploy an Example Application 按钮。
- 在 Create Example Application 页面上,在 Create Example Application 中输入 名称 fuse-circuit-breaker。
- 点 Select an Example。
在 示例 对话框中,选择 Circuit Breaker 选项。此时会出现一个 运行时 下拉菜单。
- 从 选择运行时 下拉菜单中选择 Fuse。
-
从版本下拉菜单中,选择 7.11(Red Hat Fuse )(不要选择
2.21.2(Community)
版本。 - 点击 Save。
- 在 Create Example Application 页面中,点 Download。
-
当您看到 Your Application is Ready 对话框时,点
Download.zip
。您的浏览器下载生成的 booster 项目(打包为 ZIP 文件)。 - 使用存档实用程序将生成的项目提取到本地文件系统中的便捷位置。
1.3. 构建您的 booster 项目
这些说明介绍了在 Spring Boot 上使用 Fuse 建立 Circuir Breaker booster 的步骤。
先决条件
- 您必须已通过 Red Hat Developer Portal 生成并下载您的 booster 项目。
- 您必须具有受支持的 Java Developer Kit(JDK)版本。详情请查看 支持的配置 页面。
- 您必须已安装并配置了 Apache Maven 3.3.x 或更高版本,如 在 本地设置 Maven所述。
流程
使用 Maven 打开 shell 提示符并从命令行构建项目:
cd fuse-circuit-breaker
mvn clean package
Maven 构建项目后,它会显示 Build Success 消息。
打开一个新 shell 提示符并启动名称服务,如下所示:
cd name-service
mvn spring-boot:run -DskipTests -Dspring-boot.run.arguments="--server.port=8081"
在 Spring Boot 启动时,您应该看到类似如下的输出:
... 2019-05-06 20:19:59.401 INFO 9553 --- [ main] o.a.camel.spring.SpringCamelContext : Route: route1 started and consuming from: servlet:/name?httpMethodRestrict=GET 2019-05-06 20:19:59.402 INFO 9553 --- [ main] o.a.camel.spring.SpringCamelContext : Total 1 routes, of which 1 are started 2019-05-06 20:19:59.403 INFO 9553 --- [ main] o.a.camel.spring.SpringCamelContext : Apache Camel 2.21.0.fuse-730078-redhat-00001 (CamelContext: camel-1) started in 0.287 seconds 2019-05-06 20:19:59.406 INFO 9553 --- [ main] o.a.c.c.s.CamelHttpTransportServlet : Initialized CamelHttpTransportServlet[name=CamelServlet, contextPath=] 2019-05-06 20:19:59.473 INFO 9553 --- [ main] b.c.e.u.UndertowEmbeddedServletContainer : Undertow started on port(s) 8081 (http) 2019-05-06 20:19:59.479 INFO 9553 --- [ main] com.redhat.fuse.boosters.cb.Application : Started Application in 5.485 seconds (JVM running for 9.841)
打开一个新 shell 提示符并启动问候服务,如下所示:
cd greetings-service
mvn spring-boot:run -DskipTests
在 Spring Boot 启动时,您应该看到类似如下的输出:
... 2019-05-06 20:22:19.051 INFO 9729 --- [ main] o.a.c.c.s.CamelHttpTransportServlet : Initialized CamelHttpTransportServlet[name=CamelServlet, contextPath=] 2019-05-06 20:22:19.115 INFO 9729 --- [ main] b.c.e.u.UndertowEmbeddedServletContainer : Undertow started on port(s) 8080 (http) 2019-05-06 20:22:19.123 INFO 9729 --- [ main] com.redhat.fuse.boosters.cb.Application : Started Application in 7.68 seconds (JVM running for 12.66)
问候服务通过
http://localhost:8080/camel/greetings
URL 公开 REST 端点。通过在网页浏览器中打开 URL 调用 REST 端点,或者打开另一个 shell 提示符并键入以下
curl
命令:curl http://localhost:8080/camel/greetings
以下是响应:
{"greetings":"Hello, Jacopo"}
要展示 Camel Hystrix 提供的断路器功能,可在运行名称服务的 shell 提示符窗口中按 Ctrl-C 来终止后端服务。
现在名称服务不可用,断路器在启动后启动,以防止在调用时导致 greetings 服务挂起。
通过在网页浏览器中打开
http://localhost:8080/camel/greetings
或通过在另一个 shell 提示符窗口中输入以下curl
命令调用 greetings REST 端点:curl http://localhost:8080/camel/greetings
以下是响应:
{"greetings":"Hello, default fallback"}
在运行 greetings 服务的窗口中,日志显示了以下消息序列:
2019-05-06 20:24:16.952 INFO 9729 --- [-CamelHystrix-2] route2 : Try to call name Service 2019-05-06 20:24:16.956 INFO 9729 --- [-CamelHystrix-2] o.a.c.httpclient.HttpMethodDirector : I/O exception (java.net.ConnectException) caught when processing request: Connection refused (Connection refused) 2019-05-06 20:24:16.956 INFO 9729 --- [-CamelHystrix-2] o.a.c.httpclient.HttpMethodDirector : Retrying request 2019-05-06 20:24:16.957 INFO 9729 --- [-CamelHystrix-2] o.a.c.httpclient.HttpMethodDirector : I/O exception (java.net.ConnectException) caught when processing request: Connection refused (Connection refused) 2019-05-06 20:24:16.957 INFO 9729 --- [-CamelHystrix-2] o.a.c.httpclient.HttpMethodDirector : Retrying request 2019-05-06 20:24:16.957 INFO 9729 --- [-CamelHystrix-2] o.a.c.httpclient.HttpMethodDirector : I/O exception (java.net.ConnectException) caught when processing request: Connection refused (Connection refused) 2019-05-06 20:24:16.957 INFO 9729 --- [-CamelHystrix-2] o.a.c.httpclient.HttpMethodDirector : Retrying request 2019-05-06 20:24:16.964 INFO 9729 --- [-CamelHystrix-2] route2 : We are falling back!!!!
-
有关此示例的更多信息,请打开 Circuit Breaker - Red Hat Fuse 页(尽管
问候
服务正在运行)。http://localhost:8080/此页面包含与监控断路器状态的 Hystrix 仪表板的链接。
第 2 章 本地设置 Maven
典型的 Fuse 应用程序开发使用 Maven 来构建和管理项目。
以下主题描述了如何在本地设置 Maven:
2.1. 准备设置 Maven
Maven 是一个来自 Apache 的免费开源构建工具。通常,您使用 Maven 来构建 Fuse 应用程序。
流程
- 从 Maven 下载 页面下载 Maven 的最新版本。
确定您的系统已连接到互联网。
构建项目时,默认行为是 Maven 搜索外部存储库并下载所需的工件。Maven 会查找可通过互联网访问的存储库。
您可以更改此行为,以便 Maven 只搜索本地网络上的存储库。也就是说,Maven 可以在离线模式下运行。在离线模式下,Maven 会在其本地存储库中查找工件。请参阅 第 2.3 节 “使用本地 Maven 软件仓库”。
2.2. 将红帽软件仓库添加到 Maven
要访问 Red Hat Maven 存储库中的工件,您需要将这些存储库添加到 Maven 的 settings.xml
文件中。Maven 在用户主目录的 .m2
目录中查找 settings.xml
文件。如果没有用户指定的 settings.xml
文件,则 Maven 将使用 M2_HOME/conf/
中的系统级 settings.xml 文件。
settings.xml
前提条件
您知道要在其中添加 Red Hat 软件仓库的 settings.xml
文件的位置。
流程
在 settings.xml
文件中,为红帽软件仓库添加存储库元素,如下例所示:
<?xml version="1.0"?> <settings> <profiles> <profile> <id>extra-repos</id> <activation> <activeByDefault>true</activeByDefault> </activation> <repositories> <repository> <id>redhat-ga-repository</id> <url>https://maven.repository.redhat.com/ga</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </repository> <repository> <id>redhat-ea-repository</id> <url>https://maven.repository.redhat.com/earlyaccess/all</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </repository> <repository> <id>jboss-public</id> <name>JBoss Public Repository Group</name> <url>https://repository.jboss.org/nexus/content/groups/public/</url> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>redhat-ga-repository</id> <url>https://maven.repository.redhat.com/ga</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </pluginRepository> <pluginRepository> <id>redhat-ea-repository</id> <url>https://maven.repository.redhat.com/earlyaccess/all</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </pluginRepository> <pluginRepository> <id>jboss-public</id> <name>JBoss Public Repository Group</name> <url>https://repository.jboss.org/nexus/content/groups/public</url> </pluginRepository> </pluginRepositories> </profile> </profiles> <activeProfiles> <activeProfile>extra-repos</activeProfile> </activeProfiles> </settings>
2.3. 使用本地 Maven 软件仓库
如果您在没有互联网连接的情况下运行容器,且您需要部署一个具有离线依赖项的应用程序,您可以使用 Maven 依赖项插件将应用程序的依赖项下载到 Maven 离线存储库中。然后,您可以将此自定义的 Maven 离线存储库分发到没有互联网连接的机器。
流程
在包含
pom.xml
文件的项目目录中,通过运行以下命令为 Maven 项目下载存储库,如下所示:mvn org.apache.maven.plugins:maven-dependency-plugin:3.1.0:go-offline -Dmaven.repo.local=/tmp/my-project
在本例中,构建项目所需的 Maven 依赖项和插件下载到
/tmp/my-project
目录中。- 将此自定义的 Maven 脱机存储库分发给任何没有互联网连接的机器。
2.4. 使用环境变量或系统属性设置 Maven 镜像
在运行应用程序时,您需要访问 Red Hat Maven 软件仓库中的工件。这些软件仓库添加到 Maven 的 settings.xml
文件中。Maven 检查以下 settings.xml
文件的位置:
- 查找指定的 url
-
如果没有找到查找
${user.home}/.m2/settings.xml
-
如果没有找到查找
${maven.home}/conf/settings.xml
-
如果没有找到查找
${M2_HOME}/conf/settings.xml
-
如果没有找到位置,则创建空的
org.apache.maven.settings.Settings
实例。
2.4.1. 关于 Maven 镜像
Maven 使用一组远程存储库访问工件,它们目前在本地存储库中不可用。存储库列表几乎总是包含 Maven Central 软件仓库,但对于 Red Hat Fuse,它还包含 Maven 红帽软件仓库。在某些情况下,如果无法访问不同的远程存储库,也可以使用 Maven 镜像机制。镜像替代了特定的存储库 URL,因此当搜索远程工件到单个 URL 时,所有 HTTP 流量都会定向到单个 URL。
2.4.2. 在 settings.xml
中添加 Maven mirror
要设置 Maven 镜像,请将以下内容添加到 Maven 的 settings.xml
中:
<mirror> <id>all</id> <mirrorOf>*</mirrorOf> <url>http://host:port/path</url> </mirror>
如果在 settings.xml
文件中找不到上述部分,则不使用该镜像镜像。要在不提供 XML 配置的情况下指定全局镜像,您可以使用系统属性或环境变量。
2.4.3. 使用环境变量或系统属性设置 Maven 镜像
要使用环境变量或系统属性设置 Maven 镜像,您可以添加:
-
为
bin/setenv
文件调用 MAVEN_MIRROR_URL 的环境变量 -
名为 mavenMirrorUrl 的系统属性到
etc/system.properties
文件
2.4.4. 使用 Maven 选项指定 Maven 镜像 url
要使用备用的 Maven 镜像 url,除了由环境变量或系统属性指定的其他属性外,在运行应用程序时使用以下 maven 选项:
-DmavenMirrorUrl=mirrorId::mirrorUrl
例如,
-DmavenMirrorUrl=my-mirror::http://mirror.net/repository
-DmavenMirrorUrl=mirrorUrl
例如,
-DmavenMirrorUrl=http://mirror.net/repository
。在本例中,<mirror> 的 <id> 只是一个镜像。
2.5. 关于 Maven 工件和协调
在 Maven 构建系统中,基本构建块是一个 工件。构建后,工件的输出通常是一个存档,如 JAR 或 WAR 文件。
Maven 的一个关键方面是能够定位工件并管理它们之间的依赖关系。Maven 协调 是标识特定工件位置的一组值。基本协调过程使用以下形式的三个值:
groupId:artifactId:version
有时,Maven 与一个 打包值或者一个打包 值和 分类器 值增加了基本的协调。Maven 协调可以具有以下格式之一:
groupId:artifactId:version groupId:artifactId:packaging:version groupId:artifactId:packaging:classifier:version
以下是值的描述:
- groupdId
-
定义工件名称的范围。您通常使用软件包名称的所有或部分作为组群 ID。例如,
org.fusesource.example
。 - artifactId
- 定义相对于组 ID 的工件名称。
- version
-
指定工件的版本。版本号最多可以有 4 个部分:
n.n.n.n
,其中版本号的最后一部分可以包含非数字字符。例如,1.0-SNAPSHOT
的最后一部分是字母数字子字符串0-SNAPSHOT
。 - 打包
-
定义构建项目时生成的打包实体。对于 OSGi 项目,打包是
捆绑包
。默认值为jar
。 - 分类器
- 可让您区分从同一 POM 构建但具有不同内容的工件。
工件的 POM 文件中的元素定义工件的组 ID、构件 ID、打包和版本,如下所示:
<project ... > ... <groupId>org.fusesource.example</groupId> <artifactId>bundle-demo</artifactId> <packaging>bundle</packaging> <version>1.0-SNAPSHOT</version> ... </project>
要定义上述构件的依赖项,您要将以下 依赖项元素添加到
POM 文件中:
<project ... > ... <dependencies> <dependency> <groupId>org.fusesource.example</groupId> <artifactId>bundle-demo</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies> ... </project>
不需要在前面的依赖项中指定 捆绑
软件包类型,因为捆绑包只是特定类型的 JAR 文件,jar
是默认的 Maven 软件包类型。但是,如果您需要在依赖项中明确指定打包类型,您可以使用 type
元素。