夸克代码_关于夸克的思考

夸克代码

Quarkus,新的“超音速,亚原子” Java框架目前正受到广泛关注。 对于企业Java的未来而言,此构建和运行时工具背后的思想确实比我们感兴趣。 使用Quarkus有什么好处和缺点?

摆脱动力

Quarkus认为,在容器化的世界中,企业Java运行时的大多数动态并不是真正需要的。 将应用程序构建到容器映像后,通常不应更改其功能。 企业容器带来的所有动态都允许使用功能强大且灵活的编程和部署模型,但是一旦我们的应用程序在容器中启动后,它们通常将不再更改。

Quarkus采取的方法是定制仅包含应用程序所需内容的运行时,并简化企业运行时的大部分动态。 企业Java代码在很大程度上依赖于控制反转(IoC),也就是“不给我们打电话,我们给您打电话”。 想依赖注入的ALA @Inject ,HTTP与资源@Path@GET ,或与事件观察家@Observes 。 我们的开发人员以声明方式指定应该发生什么,并且实现可以确保实现。 这允许非常高效的编程模型,但在运行时也会带来繁重的工作,因为有人必须将所有这些松散的末端放在一起。 现在,我们的想法是,如果我们的应用程序不应该在运行时发生变异,那么大多数这些动态因素都可以在构建时解决。 然后,生成的代码主要可以包括直接调用。 所有的魔法都被烧掉了。

现在,这与过去(从今天看来)不支持IoC且需要直接调用代码中功能的笨重的企业框架所实现的结果相同吗? 从开发人员的角度来看,一点也不。 在我们的代码中,我们仍然使用相同的有效声明式方法,相同的注释。 构建过程负责将动态重新带回现实。

Quarkus还支持使用GraalVM构建本机可执行文件。 通过这种方法,我们使用提前(AOT)编译将应用程序预先构建并编译为本机可执行文件,而这些本机可执行文件无需动态扫描所有类并将其加载到JVM中。 与常规JVM相比,生成的可执行文件启动速度非常快,并且资源消耗较低。

标准的力量

在Quarkus上,我发现最吸引人的是它基于已知的企业标准构建,例如CDI,JAX-RS等。 我们可以通过本机可执行文件或使用Java运行时,在优化的运行时中运行应用程序,而不是使用成熟的应用程序服务器。

许多起义企业框架要求开发人员再次学习新的API,有时(有时甚至更少)重新发明方向,例如如何实现REST端点。 但是,从开发人员和项目的角度来看,当现有的API和解决方案足够时,我看不到重新学习和重新编写应用程序的好处。 使用Quarkus所采用的方法,开发人员可以编写和采用基于CDI,JAX-RS和JPA的应用程序,并通过将运行时更改为Quarkus对其进行优化。

企业Java扩展

除了Java Enterprise中包含的功能外,Quarkus还扩展了项目中可能需要的可用功能。 除了受支持的Java EE和MicroProfile规范外,还有用于响应消息传递的Quarkus扩展,Vert.x或Camel。 例如,可以通过@Inject EventBus Vert.x的EventBus类型。 这与我们在EE中习惯的开发人员经验相符。

我喜欢从已知的企业API开始,然后通过保持相同的声明性方法来扩展它们,以进一步满足应用程序的需求。

无服务器企业Java

Quarkus的独特卖点之一是,本机运行时间极短,并且本机运行Java应用程序。 认真地说,几毫秒内开始的一切都会改变需求,我们需要快速启动和拆除我们的应用程序。

在几乎适用于所有Java的世界中,这仍然是最大的限制之一。 从性能角度来看,JVM需要大量时间来启动,更不用说预热HotSpot引擎并达到其全部吞吐量了。 相当公平,这是有原因的,因为运行时已针对长时间运行的流程中的吞吐量进行了优化。 由于应用程序应该以快速启动为目标,以便用户可以等待它,因此以常规方式启动JVM根本不够。

提到的AOT编译方法使我们能够在将Java应用程序作为本机映像执行时编写它们。 通过这样做,我们使Java工作负载能够在“无服务器”环境中执行,在该环境中我们可以将工作负载扩展到零,并且能够快速启动,而不会在初始启动时间上惩罚用户。

但是,通常情况下,生活并不那么容易。 GraalVM不支持常规JVM的全部功能集,例如,它不以通常的方式支持Reflection,并且许多企业运行时都不会作为本机可执行文件开箱即用。

话虽如此,通过考虑到运行时的局限性来开发实现,在Red Hat的朋友们为Quarkus的开发付出了多少工作,这确实令人印象深刻。 只有这样,我们才能结合这些部分并以本机方式运行Java Enterprise应用程序。 Quarkus应用程序在正常的JVM上也可以很好地运行,至少在我看来,启动过程“足够快”不到一秒钟。

尽管对于Enterprise Java来说,这是个好消息,但从我的角度来看,要求将其缩放为零并Swift启动,但启动时间并不是全部。 尽管这一新的举动无疑很有趣,但是我们不应该忘记,绝大多数企业正在运行,并且很可能会继续运行较长时间的工作量。 但是,在运行时消除大多数“动态”的方法也对总体资源消耗产生积极影响,并且肯定是有希望的。

但是,在我看来,原生启动时间甚至不是最大的好处。

开发周转时间:“令人欣喜的编码”

Quarkus允许我们的开发人员以极快的热重载来修改和测试我们的业务代码。 Maven插件的quarkus:dev目标使我们能够更改和保存文件,框架可以自动方式重新加载类并在运行的应用程序内交换行为。 我们可以在几毫秒后重新执行并测试更改后的功能,这在人类的React时间内即刻完成。 开发周期和反馈回路的周转时间因此变得尽可能短。 正如我的朋友埃德森·柳永(Edson Yanaga)所说:“这是激发喜悦的编码”。 我完全同意。

总的来说,我非常喜欢短延迟。 我认为,抗争延迟的口头禅是使许多Google服务使用起来令人愉悦。 通常,在编码时,我们希望获得并留在流程中。 开发人员的思考时间非常宝贵,我们不希望被这种流程打扰,而要等待几秒钟以上的时间; 否则,一个人会分神,拿另一杯咖啡,或更糟的是,在社交媒体上看,然后就会引起您的注意。

在我看来,最短的周转时间是Quarkus框架的最大优势。 但是,即使没有Quarkus,如果您使用现代的应用程序容器和某些工具,您也已经可以实现热重新部署时间,从而实现了按需开发模式。 例如,Open Liberty可以在不到一秒钟的时间内部署应用程序,并且与WAD之类的工具结合使用时,我们可以真正缩短周转时间,如本视频所述 。

有关集成测试的一些注意事项:很有帮助的是,整个Quarkus应用程序的快速启动使测试实际上更适合于在部署级别(而不是代码级别)进行集成测试。 即,使用该应用程序的通信接口部署和端到端测试单个应用程序。 但是,构建时间缓慢的主要原因之一是测试阶段的运行时间长,每个阶段都会启动应用程序或应用程序的一部分。 单。 测试运行。 即使Quarkus提供的启动时间很短,一旦越来越多的测试场景成为管道的一部分,这种影响也会变得巨大。 通常,我们应该做的是在测试套件执行过程中定义一个或最多几个部署,在这些部署中,我们对应用程序进行端到端测试,而不必在这之间重新启动正在运行的被测应用程序。 无论我们使用Quarkus的功能进行测试,还是使用专门的测试项目来完善已启动的应用程序,这都无关紧要。

连续交货周转时间

GraalVM本机构建的缺点之一是该构建需要很长时间。 取决于您的机器三十秒或更长时间。 甚至比我们在Java世界中应该习惯的要更长的时间。 在我们的开发管道中,这意味着我们不希望仅在持续交付管道内部对每个代码更改执行本机构建。 即使如此,我们仍然需要考虑到这会减慢整体管道执行时间,否则可能会更快地执行。 遵循只构建应用程序一次并在交付生产之前对完全构建的应用程序进行全面测试的口号,这意味着端到端/系统/验收测试的周转时间也会增加。

除了本机可执行文件,Quarkus还支持精简部署工件,如精简JAR,它仅包含由我们开发的实际业务逻辑类。 Quarkus可以使用这种方法,因为它将库和我们自己的代码分开。 看一下构建的*-runner.jar的大小和内容。 实现和所需的库包含在lib/目录下。 就像常规的Java Enterprise应用程序一样,这使我们能够通过优化写时复制文件系统映像层来利用Docker的优势。 如果您对这些图像层有所了解,您会注意到在容器化的世界中这当然是有道理的。 容器映像的构建和传输时间也影响整个构建执行时间。 在这种情况下,精简部署工件可提供最佳体验。 根据我的经验,总体图像大小几乎没有关系; 重要的是我们可以多快地重建并重新传输实际更改的层。 即使使用微小的本机映像,与精简的部署工件相比,这些大小和时间仍要大几个数量级。

在项目中,我们需要在管道执行时间和容器启动时间之间进行权衡。 除了将规模缩减为零的方法外,部署方案还应利用某种形式的蓝绿色部署,以免用户无论如何都不会停机。 考虑到这一点,生产启动时间不再是问题,因为旧版本将始终保持活动状态,直到新版本准备推出为止。 如果您参与的企业项目具有足够的用户,因此不必考虑将比例缩放到零,而是将新版本快速交付生产,则精简部署工件的方法可能更适合。

当前限制

当前框架的限制之一是Quarkus还不支持某些EE标准的全部集合。 例如,不支持EJB。 但是,支持事务,并且某些其他功能可以用Quarkus自己的功能代替。 一个例子是调度,其中Quarkus附带了自己的@Scheduled注释。 从我的角度来看,这似乎是一种合理的方法,可以尝试实现项目可能需要的功能并提供一个已经支持大多数必需功能的框架。

但是,Quarkus的发展非常Swift,所以让我们看看如何缩小这些差距。 同样,我相信这个框架看起来多么成熟和详尽,令人印象深刻。

Maven插件声明,尤其是如何在Quarkus文档中进行广告宣传,还有其他可以改进的地方。 很多人似乎都喜欢将大量XML放入其pom.xml ,但是我并不是很多。 我宁愿保持对Java应用程序关注点的清晰区分,而不是让Maven“构建一切”。 如果我们允许项目使用Maven的默认值,则将pom.xml内所需的LoC保持在最低限度,并让CI基础架构处理其上的所有内容。 例如,使用Quarkus,您至少可以摆脱其大部分pom.xml定义,而仅在CI管道中定义和构建本机映像。 然后有可能将pom.xml稍微简化一下。

但是,该文档承诺将有一个本机CLI“即将推出”,这在我看来是有希望的。

结论

Quarkus将云原生企业Java提升到一个新的水平,并实现了以前不可能实现的方案,尤其是在应用程序启动时间方面。 如果您打算实现零规模生产,那无疑是您想要研究的一项技术。

我非常喜欢Quarkus如何跟进一些技术以前采用的方法,将它们进一步发展,并提供一个单一的框架,包括所有的保护伞。 这使开发人员可以轻松上手,使用他们可能已经熟悉的企业标准,例如CDI或JAX-RS。 在我看来,这是一个很大的好处:无需尝试重​​塑企业世界,而是使用熟悉的技术,但是可以实现高度优化的实现。

作为开发人员,我发现AOT编译和其他JVM优化通常非常有趣。 您可能还会看看OpenJ9 JVM及其优化。 将运行时与Quarkus应用程序的JVM执行模式结合起来可能会很有趣。

要获得“纯” Java EE的快速开发人员经验,您可以查看WAD以及如何将其集成到Docker中。

翻译自: https://www.javacodegeeks.com/2019/04/thoughts-quarkus.html

夸克代码

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

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

相关文章

ntdll 异常代码0xc0000374_不要把异常当做业务逻辑,这性能可能你无法承受

一:背景1. 讲故事在项目中摸爬滚打几年,应该或多或少的见过有人把异常当做业务逻辑处理的情况(┬_┬),比如说判断一个数字是否为整数,就想当然的用try catch包起来,再进行 int.Parse,如果抛异常就说明不是整…

java中的hashset_Java中的HashSet

java中的hashset介绍: Java中的HashSet实现Set接口,即它不允许重复。 它在内部由HashMap支持,该哈希表基于哈希原理。 我们可以在HashSet中存储一个空值。 默认容量为16,负载系数为0.75,其中: Load facto…

win32bridge.server.exe函数不正确_修电脑?不,其实我们学的是......

COMPUTER计信学子Python?JAVA?C?C?HTML?身为重师计信人逢年过节总免不了被亲戚们“盘问”一番必问清单第一名就是“专业”他们往往从字面去理解而我们计信人被误解的频率相当高“学计算机的肯定会修电脑对吧”请接着看下去吧!我们学的到底是什么?(点击查看答案…

SimpleDateFormat详解

SimpleDateFormat 中的时间标识含义: G 年代标志符 y 年 M 月 d 日 h 时 在上午或下午 (1~12) H 时 在一天中 (0~23) m 分 s 秒 S 毫秒 E 星期 D 一年中的第几天 F 一月中第几个星期几 w 一年中第几个星期 W 一月中第几个星期 a 上午 / 下午 标记符 k 时 在一天中 …

java uuid_Java UUID

java uuid介绍: UUID(通用唯一标识符)表示一个128位长的唯一值 。 它也被普遍称为GUID(全球唯一标识符)。 UUID的标准表示形式由十六进制数字组成: 533a4559-e55c-18b3-8456-555563322002并具有36个字符 …

JDK 9.0.4 报错:程序包 com.sun.xml.internal.fastinfoset.stax.events 不存在/不可见

IDE:IntelliJ IDEA 构建工具:Maven JDK版本:JDK 9.0.4 在代码中使用下面的工具类: com.sun.xml.internal.fastinfoset.stax.events.Util报错如下: 或者 光标移到 Util 处,按下 Option Enter&#xff1a…

3650m5设置u盘启动_系统重装必备神器,U盘如何制作启动盘?

早些年的时候,电脑安装系统需要光盘,但是现在光盘也逐渐退出历史舞台。不管是台式计算机还是笔记本,光驱这个东西也逐渐消失。如果自己的计算机没有光驱,电脑又无法开机需要重装系统,这个时候该怎么办呢?可…

jtable隐藏全部_全部隐藏!

jtable隐藏全部在较早的文章中 ,我写了以下几句话: 在面向对象的代码库中,该工具包应尽可能离散。 您使用开发套件的次数越多,您的代码实际面向对象的次数就越少,或者您的抽象并不是最好的。 。 我认为有必要详细说明…

IntelliJ IDEA 如何多模块开发

参考: https://blog.csdn.net/jqc874789596/article/details/86609554

距离矢量路由算法的java代码_八大排序算法比较(附Java代码)

冒泡排序/*** 冒泡排序 比较好理解* 两两相比 较大的放后面* 时间复杂度O(n^2)*//*** 改进前的冒泡排序算法进行100,000数据排序运行时间为:3829ms* 优化后的冒泡排序算法进行100,000数据排序运行时间为:3551ms*/ public static void bubbleSort(int[] a…

jaxb注解使用_使用JAXB时

jaxb注解使用并没有很多例子可以说明这一点,但是如何在应用程序中使用JAXB可以在性能(和内存使用)方面产生巨大差异。 这个例子 在此博客文章中,我将使用一个名为Membership的示例对象,看起来像这样: 我们…

org.apache.tomcat.util.descriptor.web.WebXml.setVersion 未知版本字符串 [4.0]

参考: https://blog.csdn.net/qq_40829288/article/details/93936261 https://www.shuzhiduo.com/A/Ae5RnvaN5Q/ https://www.cnblogs.com/youpeng/p/11095504.html

python无法安装pycurl_Python安装pycurl失败的解决方法

Centos安装pycurlcentos 安装pycurlyum install python-devel curl-develpip3 install pycurlMac(老版本)安装pycurl解决MacOS升级后出现xcrun: error: invalid active developer path, missing xcrun的问题xcode-select --install然后dongchang-5:qqmusic baoshan$ pip3 insta…

组装一台计算机 java_如何在同一台计算机上安装多个Java版本

组装一台计算机 java一段时间以前,我写了一篇文章《 用示例解释Java Lambda表达式》,但是我很容易浏览Java 8,因为我在项目中使用了Java 8,并且允许我安装和使用它。 但是在我当前的项目中,我们仍在使用Java 8&#xf…

字符串类型的日期如何存储到数据表Date类型的字段中

在使用 JDBC 访问数据库存储数据时,日期类型的数据必须是 java.sql.Date 的才能注入到 SQL 语句中。 因此这里是将字符串类型的日期转换成 java.util.Date,接着再转换成 java.sql.Date ,最后注入到 SQL 语句中。 public class ProjectDAO { …

python执行linux命令返回结果_python执行linux命令的简单示例

对python执行linux命令的两种方法感兴趣的小伙伴,下面一起跟随编程之家 jb51.cc的小编两巴掌来看看吧!python执行linux命令有两种方法:在此以Linux常用的ls命令为例:方法一:使用os模块shell# python>> import os…

web api开启错误提示_当HTTP状态代码不足时:处理Web API错误报告

web api开启错误提示RESTful Web API设计的一个领域(经常被忽视)是如何报告与业务或应用程序有关的错误和问题。 首先要想到HTTP状态代码的正确用法,尽管非常方便,但通常它的信息量还不够。 让我们以400错误请求为例。 是的&#…

会议室分配时间最长_论文导论动态任务分配GPU上图计算的高效处理方式

编者按GPU作为一种硬件,相比较于CPU来说,有更多的并行度和更高的带宽,在图像处理领域取得了非常好的应用效果。越来越多的研究也正试图将GPU也应用到图计算领域中,然而GPU适合进行规则运算,但是图是一种不规则的数据表…

JS(Javascript)校验表单项的内容是否合规

<script !src"">/*** 分析&#xff1a;* 1.给表单绑定onsubmit事件* 监听器中判断每个方法检验的结果&#xff0c;如果都是true&#xff0c;则监听器方法返回true&#xff1b;如果有一个为false,* 则监听器方法返回false* 2.定义一些方法分别校验各个表单项* 3…

java \t怎么从头开始_如何从头开始以正确的面向对象方式创建Java Web Framework

java \t怎么从头开始您如何用Java设计Web应用程序&#xff1f; 您安装了Spring&#xff0c;阅读了手册&#xff0c;创建了控制器 &#xff0c;创建了一些视图&#xff0c;添加了一些注释 &#xff0c;它就可以工作了。 如果没有Spring &#xff08;Ruby中没有Ruby on Rails&…