使用 Apache Camel 和 Quarkus 的微服务(二)
【squids.cn】 全网zui低价RDS,免费的迁移工具DBMotion、数据库备份工具DBTwin、SQL开发工具等
在本系列的第一部分,我们看到了一个简化版的基于微服务的转账应用程序,该应用程序使用Apache Camel和AWS SDK(软件开发套件)作为Java开发工具,使用Quarkus作为运行时平台进行实现。如前所述,为了运行此类应用的生产版本,可能需要考虑许多部署情景;最初且最简单的情景是以独立方式在本地运行它。这也是我们在这篇新文章中将要探讨的情景。
Quarkus能够以两种模式运行你的应用程序:基于JVM(Java虚拟机)的模式和原生模式。基于JVM的模式是运行Java应用程序的标准传统方式。在这种情况下,运行的应用程序不是直接对操作系统执行,而是在某种执行媒介中执行,其中嵌入和包装了Java库和API。这些库和API可能非常庞大,并且它们占用了名为Resident Set Size(RSS)的内存的特定部分。
因此,在JVM模式下,Quarkus构建过程会生成几个JAR(Java Archive)文件,如下所示:
-
一个名为 .jar 的瘦JAR,位于 target/quarkus-app/app 中,包含所有应用程序的类和其他工件。
-
一个名为 quarkus-run.jar 的空壳JAR,位于 target/quarkus-app 中,包含运行应用程序所需的所有工件的列表,但不包括工件本身和应用程序。
-
一个包含变换后的应用程序字节码的JAR,名为 generated-bytecode.jar,位于 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-run.jar位于 target/quarkus-app 中的 。我们的项目在此处的源代码存储库中提供了几个脚本。让我们看一下它start-ms.sh,顾名思义,启动我们的微服务。
#!/bin/sh
./delete-all-buckets.sh
./create-queue.sh
java -jar ./aws-camelk-file/target/quarkus-app/quarkus-run.jar &
sleep 3
java -jar ./aws-camelk-s3/target/quarkus-app/quarkus-run.jar &
sleep 3
java -jar ./aws-camelk-jaxrs/target/quarkus-app/quarkus-run.jar &
sleep 3
java -jar ./aws-camelk-sqs/target/quarkus-app/quarkus-run.jar &
sleep 3
ps ef | grep -i aws-camelk-file | grep -v grep | awk {'print $1'} > pid-aws-camelk-file.pid
ps ef | grep -i aws-camelk-s3 | grep -v grep | awk {'print $1'} > pid-aws-camelk-s3.pid
ps ef | grep -i aws-camelk-jaxrs | grep -v grep | awk {'print $1'} > pid-aws-camelk-jaxrs.pid
ps ef | grep -i aws-camelk-sqs | grep -v grep | awk {'print $1'} > pid-aws-camelk-sqs.pid
./copy-xml-file.sh
上面的 shell 脚本是一种杂务,因为它接管了运行我们的四个微服务并适当处理它们所需的所有操作。首先,它删除名称以字符串“mys3”开头并后跟随机后缀的所有 S3 存储桶。然后,它会创建一个 AWS SQS 队列(如果尚不存在)。这些都是理智的操作,确保从干净的情况开始。
之后,我们的四个微服务被依次执行,它们之间有3秒的等待间隔,以保证它们在被伙伴调用之前已经完全启动。一旦启动,它们的 PID 就会保存在扩展名为“pid”的文件中。当您想要停止它们时,稍后将使用这些文件。
一旦所有微服务启动,就会通过将包含要执行的汇款的输入 XML 文件复制到每个第一个 Camel 路由轮询的输入文件夹来触发管道。这将激活整个过程,如我们故事的第一部分所述。
因此,要恢复,为了在 Quarkus 的 JVM 模式下运行我们的汇款应用程序,请执行以下命令:
$ cd aws-camelk$ ./delete-all-buckets.sh #Deletes all the possible existent "mys3..." S3 buckets$ ./purge-sqs-queue.sh #Purge the myQueue SQS queue$ mvn clean package #This will also executes all te defined unit tests$ ./start-ms.sh #Starts the micro-services and save their associated PIDs
money-transfers.xml这会将位于的文件复制aws-camelk-model/src/main/resources/xml到该/tmp/input文件夹中。这是 Camel 路由aws-camelk-file正在轮询的输入文件夹。
一旦 XML 文件到达那里,它就会根据自己的架构(位于 中)进行验证,aws-camelk-file/src/main/resource/xsd如果有效,它就会存储在 AWS S3 存储桶中,该存储桶的名称是字符串“mys3”,我们将随机生成的字符串附加到该存储桶中。此处,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-ms.sh #Stop the micro-services one by one using their PID$ ./delete-all-buckets.sh #Delete all the S3 buckets which names start with "mys3"$ ./purge-sqs-queue.sh #Deletes all the messages in the myQueue SQS queue$ ./delete-sqs-queue.sh #Deletes the myQueue SQS queue
现在你的环境已经干净了。下一篇文章将展示如何在 Quarkus 本机模式下执行与本地运行微服务相同的操作。请持续关注。
作者:Nicolas Duminil
更多内容请关注公号【云原生数据库】
squids.cn,云数据库RDS,迁移工具DBMotion,云备份DBTwin等数据库生态工具。
相关文章:
使用 Apache Camel 和 Quarkus 的微服务(二)
【squids.cn】 全网zui低价RDS,免费的迁移工具DBMotion、数据库备份工具DBTwin、SQL开发工具等 在本系列的第一部分,我们看到了一个简化版的基于微服务的转账应用程序,该应用程序使用Apache Camel和AWS SDK(软件开发套件…...
pid-limit参数实验
fork炸弹命令 :(){ :|:& };: 可以看到,如果docker没有限制,会遭到fork炸弹恶意 参考 https://www.cyberciti.biz/faq/understanding-bash-fork-bomb/...
jvm--执行引擎
文章目录 1. 执行引擎的工作流程2. 解释器、JIT及时编译器3. 热点代码及探测技术4. HotSpotVM 中 JIT 分类 执行引擎属于 JVM 的下层,里面包括解释器、及时编译器、垃圾回收器 JVM 的主要任务是负责 装载字节码到其内部,但字节码并不能够直接运行在操作…...
day13|二叉树理论
一、二叉树的定义 //定义一个二叉树:使用链式存储 public class TreeNode {int val; // 节点的值TreeNode left; // 左子节点TreeNode right; // 右子节点public TreeNode() {}// 构造函数,初始化节点值public TreeNode(int val){this.valval;}// 构造函…...
php+html+js+ajax实现文件上传
phphtmljsajax实现文件上传 目录 一、表单单文件上传 1、上传页面 2、接受文件上传php 二、表单多文件上传 1、上传页面 2、接受文件上传php 三、表单异步xhr文件上传 1、上传页面 2、接受文件上传php 四、表单异步ajax文件上传 1、上传页面 2、接受文件上传ph…...
日期时间参数,格式配置(SpringBoot)
介绍 在SpringBoot项目中,接口中的日期和时间类型的参数,配置格式。 日期格式 接口中常用的日期时间格式有两种: 字符串(比如:yyyy-MM-dd HH:mm:ss)时间戳(比如:1696839876955&a…...
JAVA 泛型的定义以及使用
泛型类 /*** <T> 为该类定义泛型,可以是一个或多个<T,...>* 定义的泛型可以在类中作为:* 类变量类型: T data* 类方法的入参以及返回类型 public void setData(T data),public T getData();次数以set&a…...
Day-08 基于 Docker安装 Nginx 镜像-负载均衡
1、反向代理后,自然而然就引出了负载均衡,下面简单实现负载均衡的效果; 2、实现该效果需要再添加一个 Nginx ,所以要增加一个文件夹。 /home|---mutou|----nginx|----conf.d|----html|----conf.d2|----html3 1.创建 html3 文件夹, 新建 index…...
3、在 CentOS 8 系统上安装 PostgreSQL 15.4
PostgreSQL,作为一款备受欢迎的开源关系数据库管理系统(RDBMS),已经存在了三十多年的历史。它提供了SQL语言支持,用于管理数据库和执行CRUD操作(创建、读取、更新、删除)。 由于其卓越的健壮性…...
sap 一次性供应商 供应商账户组 临时供应商 <转载>
原文链接:https://blog.csdn.net/xianshengsun/article/details/132620593 sap中有一次性供应商这个名词,一次性供应商和非一次性供应商又有什么区别呢? 有如何区分一次性供应商和非一次性供应商呢? 1 区分一次性供应商和非一次性…...
总结html5中常见的选择器
HTML5并没有引入新的选择器类型,它仍然使用CSS选择器来选择和操作HTML元素。HTML5中仍然可以使用CSS2和CSS3中定义的各种选择器。以下是HTML5中常见的选择器类型: 1. 元素选择器(Element Selector):使用元素名称作为选…...
Java基础面试-JDK JRE JVM
详细解释 JDK(Java Devalpment Kit)java 开发工具 JDK是Java开发工具包,它是Java开发者用于编写、编译、调试和运行Java程序的核心组件。JDK包含了Java编程语言的开发工具和工具集,以及Java标准库和其他一些必要的文件。JDK中的…...
OpenCV实现图像傅里叶变换
傅里叶变换 dftcv.dft(img_float32,flagscv.DFT_COMPLEX_OUTPUT): flags:标志位,指定变换类型,cv.DFT_COMPLEX_OUTPUT会返回复数结果。 傅立叶变换,将输入的图像从空间域转换到频率域。 返回结果: 此函数返回一个复杂数值数组,…...
快手新版本sig3参数算法还原
Frida Native层主动调用 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81…...
Linux 安全 - LSM机制
文章目录 前言一、LSM起源二、LSM简介2.1 MAC2.2 LSM特征 三、Major and Minor LSMs3.1 Major LSMs3.2 Minor LSMs3.3 BPF LSM 四、LSM 框架五、LSM Capabilities Module六、LSM hooks 说明参考资料 前言 在这两篇文章中介绍了 Linux 安全机制 Credentials : Linu…...
uni-app:实现简易自定义下拉列表
效果 代码 <template><view><view class"dropdown-trigger" tap"showDropdown">{{ selectedItem }}</view><view class"dropdown-list" v-if"showList"><view class"dropdown-item" v-f…...
排序算法——直接插入排序
一、介绍 插入排序就是将前两个元素排好,再将第三个元素通过与前边的元素比较后插入适当的位置,再将第四个元素插入,不断重复插入与前边元素比较的操作,直到将元素都排列好。 演示如下: 视频演示:…...
手动抄表和自动抄表优缺点对比
随着科技的发展,自动抄表技术已经越来越成熟,被广泛应用于各个领域。然而,手动抄表在一些特定场景下仍然具有一定的优势。本文将从手动抄表和自动抄表的优缺点入手,对比分析它们的应用场景和使用价值。 1.成本低:手动抄…...
HiSilicon352 android9.0 emmc添加新分区
添加新分区 从emmc中单独划分出一个分区,用来存储相关数据(可用于存储照片,视频,音乐和文档等)或者系统日志log,从而不影响到其他分区。 实现方法: device/hisilicon/Hi3751V350/etc/Hi3751V3…...
networkX-04-查找k短路
文章目录 1.构建图2.使用networkX查找最短路径3.自己构建方法 教程仓库地址:github networkx_tutorial import networkx as nx import matplotlib.pyplot as plt1.构建图 # 创建有向图 G nx.DiGraph()# 添加带权重的边 edges [(0, 1, 1), (0, 2, 2), (1, 2, 1), …...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...
