使用 Apache Camel 和 Quarkus 的微服务(第 2 部分)
在本系列的第一部分,我们看到了一个简化的基于微服务的汇款应用程序,它使用Apache Camel和 AWS SDK(软件开发工具包)作为 Java 开发工具,并使用Quarkus作为运行时平台来实现。如前所述,为了运行此类应用程序的生产,可能会考虑许多部署方案;第一个也是最简单的一个是以独立方式在本地运行它。这是我们将在这篇新文章中考虑的场景。
Quarkus 能够以两种模式运行您的应用程序:基于JVM(Java 虚拟机)和本机。基于 JVM 的模式是运行 Java 应用程序的标准经典方式。在这里,正在运行的应用程序不是直接针对操作系统执行的,而是在一种执行介质中嵌入和包装 Java 库和 API 的。这些库和 API 可能非常大,并且它们占用内存的特定部分,称为 Resident Set Size (RSS)。为了更多地了解 RSS 和 Quarkus(相对于Spring Boot如何处理它),请参阅此处。
因此,在 JVM 模式下,Quarkus 构建过程会生成多个 JAR(Java 存档)文件,如下所示:
<finalName>.jar 一个名为located in 的瘦 JARtarget/quarkus-app/app包含所有应用程序的类和其他工件
一个空心 JAR,quarkus-域名位于target/quarkus-app并包含运行应用程序所需的所有工件的列表,但不是工件本身,也不是应用程序
一个包含转换后的应用程序字节码的 JAR,命名generated-域名并位于target/quarkus-app/quarkus
lib位于target/quarkus-app包含所有应用程序依赖项的文件夹
以上所有工件都是在构建项目时由 quarkus-maven-plugin 生成的。这个相同的插件还支持创建一个 über JAR,其中包含运行应用程序所需的一切(即应用程序的代码,以及所有依赖项的代码)。
与 JVM 模式相反,Quarkus 本机模式运行可执行程序。这些程序直接针对操作系统执行,不需要任何 JVM。这种技术不是将 Java 代码编译为通常的字节代码(如在 JVM 模式中)而是编译为可执行文件,这显着减少了 RSS 的数量,从而减少了程序的大小。这提高了他们的表现。为了支持原生模式,Quarkus 依赖于GraalVM。
在 JVM 模式下运行
如前所述,JVM 模式是最简单的 Quarkus 运行模式。它包括执行quarkus-域名位于 target/quarkus-app 中的 。我们的项目在位于此处的源代码存储库中提供了几个脚本。让我们看一下start-域名,顾名思义,启动我们的微服务的那个。
#!/bin/sh ./delete-all-域名 ./create-域名 java -jar ./aws-camelk-file/target/quarkus-app/quarkus-域名 & sleep 3 java -jar ./aws-camelk-s3/target/quarkus-app/quarkus-域名 & sleep 3 java -jar ./aws-camelk-jaxrs/target/quarkus-app/quarkus-域名 & sleep 3 java -jar ./aws-camelk-sqs/target/quarkus-app/quarkus-域名 & sleep 3 ps ef | grep -i aws-camelk-file | grep -v grep | awk {'print $1'} > pid-aws-camelk-域名 ps ef | grep -i aws-camelk-s3 | grep -v grep | awk {'print $1'} > pid-aws-camelk-域名 ps ef | grep -i aws-camelk-jaxrs | grep -v grep | awk {'print $1'} > pid-aws-camelk-域名 ps ef | grep -i aws-camelk-sqs | grep -v grep | awk {'print $1'} > pid-aws-camelk-域名 ./copy-xml-域名
上面的 shell 脚本是一种 factotum,因为它接管了运行我们的四个微服务所需的所有操作并适当地处理它们。首先,它删除名称以字符串“mys3”开头且后跟随机后缀的所有 S3 存储桶。然后,它会创建一个 AWS SQS 队列(如果它尚不存在)。这些都是确保从干净的情况开始的理智操作。
之后,我们的四个微服务依次执行,中间有3秒的等待间隔,以保证它们在被伙伴调用之前已经完全启动。一旦启动,它们的 PID 将保存在扩展名为“pid”的文件中。这些文件稍后将在您想要停止时使用。
一旦所有微服务启动,管道就会通过将包含要执行的汇款的输入 XML 文件复制到每个第一个 Camel 路由轮询中的输入文件夹来触发。正如我们故事的第一部分所述,这将激活整个过程。
因此,要恢复,为了在 Quarkus 的 JVM 模式下运行我们的汇款应用程序,请执行以下命令:
$ cd aws-camelk $ ./delete-all-域名 #删除所有可能存在的“mys3...”S3 buckets $ ./purge-sqs-域名 #清除myQueue SQS队列 $ mvn clean package #这也将执行所有你定义的单元测试 $ ./start-域名 #启动微服务并保存它们关联的 PID
money-域名这会将位于的文件复制aws-camelk-model/src/main/resources/xml到/tmp/input文件夹中。这是 Camel 路由aws-camelk-file正在轮询的输入文件夹。
一旦 XML 文件到达那里,它就会根据自己的架构进行验证,位于aws-camelk-file/src/main/resource/xsd,如果有效,它会存储在名称为字符串“mys3”的 AWS S3 存储桶中,我们将随机生成的字符串附加到该存储桶中。在这里,XML 文件由aws-camelk-s3Camel 路由处理,该路由对其进行拆分、标记化和流式传输,然后将每个生成的 XML 消息发布到名为“myQueue”的 AWS SQS 队列。
最后但同样重要的是,Camel 路由aws-camelk-sqs正在处理每条已发布的消息,方法是将其从 XML 解组为 Java,然后将其编组为 JSON,然后将 HTTP POST 请求发送到 REST 端点 http://localhost:8080/xfer。
所有这些管道之后都可以检查 Quarkus 在控制台上显示的日志文件。通过将不同的 XML 文件复制到输入目录中,您可以根据需要重复该过程。但要注意:您不能处理同一个文件两次或更多次,因为关联的路由是幂等的,这意味着如果多次提供相同的输入文件将被忽略。但是您当然可以更改其名称。
一旦你有足够的时间来玩你的微服务,运行以下命令:
$ ./kill-域名 #使用它们的 PID 一个一个地停止微服务 $ ./delete-all-域名 #删除名称以"mys3"开头的所有S3 buckets $ ./purge-sqs-域名 #删除myQueue SQS队列中的所有消息 $ ./delete-sqs-域名 #删除myQueue SQS队列
现在你的环境干净了。下一篇文章将展示如何在 Quarkus 本机模式下执行与本地运行微服务相同的操作。