使用 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等数据库生态工具。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/100919.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

css怎么实现文字描边

有时,我们会遇到UI稿有文字描边的效果,比如下图的效果。 一、给需要描边的文字加一个id选择器 例如: 二、css写法: number,{//这个是实现文字描边的关键,也就是‘空心文字’,这个是定义文字字符的描边的宽…

享元模式 基于享元模式的对象池设计与开发应用(设计模式与开发实践 P12)

文章目录 反例应用对象池对象池应用 享元模式(flyweight)是一种进行性能优化的模式,通过共享技术来支持大量细粒度的对象 如果系统中创建了大量相似的对象,我们就可以通过享元模式节省内存 反例 服装厂生产了一堆衣服&#xff…

为element-ui对话框组件(el-dialog)添加弹窗拖拽支持

创建dialogDrag.js /************************************************ Description: el-dialog弹窗组件添加拖拽支持 Dependencies:vue.jsel-dialog (element-ui) ************************************************/Vue.directive(dialogDrag, {bind: function (el) {const…

对比纯软开与嵌入式硬件开发谁更好呢?

对比纯软开与嵌入式硬件开发谁更好呢? 你的纠结和犹豫是理解的,职业选择确实是一个重要的决策。我明白你在嵌入式和软件开发之间犹豫不决的原因。让我给你提供一些建议,帮助你做出更明智的决定。最近很多小伙伴找我,说想要一些嵌入…

1600*A. Maze(DFS)

Problem - 377A - Codeforces 解析: 对于正向思考比较复杂的题目,我们可以反向思考。 由于最后剩余的 “ . ” 必须相连,所以我们将所有 “ . ” 全部换成 “ X ”,然后从其中DFS一个联通的“ X ”反向换成 “ . ”即可。 #incl…

MySQL数据加解密处理

问题: 对于一些敏感数据,比如用户的手机号、身份证号、银行卡号、敏感词之类进行加密处理,是一些系统的常用处理方式。但是这保证了数据的安全之外又诞生了另外一个问题,就是搜索这些信息的时候,模糊查询变得困难。 …

配资炒股优质平台排名:十大排名和评估!

随着互联网的发展,配资炒股平台已经成为了越来越多投资者的选择,但是市场上的配资炒股平台各不相同,投资者如何选择一家优质的平台呢?这时候,配资炒股优质平台排名就显得尤为重要。 配资炒股优质平台排名的作用&#…

机器学习中常见的监督学习方法和非监督学习方法有哪些。

问题描述:最近面试某些公司算法岗,看到一道简答题,让你举例熟悉的监督学习方法和非监督学习方法。 问题解答: 监督学习方法常见的比较多: 线性回归(Linear Regression): 用于回归问…

HTML5开发实例-3D全景(ThreeJs全景Demo) 详解(图)

前言 在现在市面上很多全景H5的环境下,要实现全景的方式有很多,可以用css3直接构建也可以用基于threeJs的库来实现,还有很多别的制作全景的软件使用 本教学适用于未开发过3D全景的工程狮 如果觉得内容太无聊可以直接跳到最后 下载代码 理论 整个3D全景所用的相关理论就…

将 Ordinals 与比特币智能合约集成:第 3 部分

基于 Ordinals 的 BSV-20 同质化代币 之前,我们展示了如何将比特币智能合约与 Ordinals 集成,Ordinals 可以被视为链上的 NFT。 在本文中,我们将展示如何将它们与同质化代币(即 BSV-20 代币)集成。 我们仍然以拍卖为例…

setattr()函数与getattr()函数用法

本文主要包括以下内容: 一、setattr函数1. 动态创建对象属性2. 修改对象属性3. 用于动态创建类的属性 二、getattr函数1. 获取对象属性的值2. 处理属性不存在的情况3. 获取模块中的函数或变量4. 获取类方法或静态方法 一、setattr函数 setattr 是 Python 内置函数之…

java上传文件到指定服务器

首先要知道服务器的用户名和密码。 注意&#xff1a;一般情况&#xff0c;如果不是强制要求&#xff0c;尽量不要将文件上传到服务器 步骤&#xff1a; 1.导入依赖 <!--图片上传到服务器需要的依赖--> <dependency> <groupId>com.jcr…

dubbo3+zookeeper/nacos+dubbo-admin

工程结构&#xff1a; 版本信息&#xff1a; jdk版本&#xff1a;1.8 springboot-parent版本&#xff1a;2.6.6springboot版本&#xff1a;2.6.6 dubbo-spring-boot-starter版本&#xff1a;3.0.7dubbo版本&#xff1a;3.0.7 dubbo-registry-zookeeper版本&#xff1a;3.0.7c…

Spring Boot的自动装配原理

Spring Boot的自动装配原理是该框架的核心特性之一&#xff0c;它通过一种智能机制来减少开发者的配置工作&#xff0c;使开发更加便捷。下面我将简要介绍Spring Boot自动装配的原理&#xff1a; 组件扫描&#xff1a;Spring Boot会自动扫描项目中的所有类&#xff0c;查找带有…

SRE实战:如何低成本推进风险治理?稳定性与架构优化的3个策略

一分钟精华速览 SRE 团队每天面临着不可控的各类风险和重复发生的琐事&#xff0c;故障时疲于奔命忙于救火。作为技术管理者&#xff0c;你一直担心这些琐事会像滚雪球一样&#xff0c;越来越多地、无止尽地消耗你的团队&#xff0c;进而思考如何系统性地枚举、掌控这些风险&a…

请求和响应的概述

请求&#xff1a;在浏览器地址栏输入地址&#xff0c;点击回车请求服务器&#xff0c;这个过程就是一个请求过程。 响应&#xff1a;服务器根据浏览器发送的请求&#xff0c;返回数据到浏览器在网页上进行显示&#xff0c;这个过程就称之为响应。 针对Servlet的每次请求&…

13、化“危机”为“契机”

10、质量审核的设立与合并 11、视频分类建议 12、建立健全人员培养培训体系 2019年底&#xff0c;内容仓的单日产量超过2.2万&#xff0c;业务部门提出了更高的产能需求&#xff0c;希望在20年达到日产近4万条的目标。为此部门根据当时的个人产能做了测算&#xff0c;提出了近…

软件测试之概念篇(需求,测试用例,BUG描述,产品的生命周期)

目录 1.什么是需求 2.什么是测试用例 3.什么是BUG 4.软件的生命周期 5.测试的生命周期 1.什么是需求 在大多数软件公司&#xff0c;一般会有两部分需求&#xff1a; 用户需求&#xff1a;可以理解为就是甲方提出需求&#xff0c;如果没有甲方&#xff0c;那么就是终端用…

IDEA使用模板创建webapp时,web.xml文件版本过低的一种解决方法

创建完成后的web.xml 文件&#xff0c;版本太低 <!DOCTYPE web-app PUBLIC"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN""http://java.sun.com/dtd/web-app_2_3.dtd" ><web-app><display-name>Archetype Created Web Appl…

Springboot使用sqlcipher4加密sqlite数据库

在有些业务场景&#xff0c;需要使用sqlite数据库&#xff0c;但sqlite数据库生的db文件&#xff0c;是明文的&#xff0c;该文件被别人拿到&#xff0c;就可以看到里面的所有数据&#xff0c;非常不安全&#xff0c;市面上有很多对sqlite数据库文件加密的方式&#xff0c;但都…