当前位置: 首页 > 后端技术 > Java

谁是微服务的赢家:Quarkusvs.SpringBoot

时间:2023-04-01 22:36:16 Java

容器时代(“Docker时代”)Java依然领先,但哪个更好?SpringBoot还是Quarkus?谁将是最先进的?SpringBoot或Quarkus。在容器时代(“Docker时代”),无可否认java的生命力,无论你是否使用它。Java在性能方面一直有优势,主要是因为代码和真机之间的抽象层,多平台的成本(一次编写,随处运行——还记得吗?),其中包括JVM-between(JVM:模拟一个真正的机器制造的软件机器)。今天,使用微服务架构,为始终在同一位置和平台(Docker容器-Linux)环境中运行的事物构建多平台(解释)事物也没有优势。可移植性现在不那么重要了(可能比以往任何时候都重要),那些额外的抽象级别也无关紧要。话虽如此,让我们对在Java中生成微服务的两种替代方案进行简单而原始的比较:非常知名的SpringBoot和鲜为人知(但)的Quarkus。什么是对手Quarkus?一套用于编写Java应用程序的GraalVM和HotSpot开源技术。它提供(正式如此)极快的启动时间和更低的内存占用。这使其成为容器和无服务器工作负载的理想选择。它使用Eclipse微配置文件(JAX-RS、CDI、JSON-P),这是JavaEE的一个子集来构建微服务。GraalVM是一个通用的多语言虚拟机(JavaScript、Python、Ruby、R、Java、Scala、Kotlin)。GraalVM(特别是SubstrateVM)支持提前(AOT)编译,将字节码转换为本机机器代码,从而生成本机可执行的二进制文件。请记住,并非所有功能都可以在本机执行中使用,AOT编译有其局限性。请注意这句话(引用GraalVM团队):我们运行激进的静态分析,这需要一个封闭的世界假设,这意味着在运行时可访问的所有类和所有字节码必须在构建时已知。因此,例如,反射和Java本机接口(JNI)将不起作用,至少开箱即用(需要一些额外的工作)。您可以在本机Java限制文档中找到限制列表。什么是弹簧引导?这是真的吗?好吧,我只想说一句话(请跳过),一句话:SpringBootisbuiltonSpringFramework。事实上,它是一个开源框架,提供了一种更简单的方法来构建、配置和运行基于Web的Java应用程序。使其成为微服务的良好候选者。战斗就绪——创建Docker镜像Quarkus镜像让我们创建Quarkus应用程序,稍后将打包到Docker镜像中。基本上,我们将执行与Quarkus入门教程相同的操作。使用Quarkusmaven原型创建项目:mvnio.quarkus:quarkus-maven-plugin:1.0.0.CR2:create-DprojectGroupId=ujr.combat.quarkus-DprojectArtifactId=quarkus-echo-DclassName="ujr.combat.quarkus.EchoResource"-Dpath="/echo"这将导致我们的项目结构如下:请注意,还创建了两个示例Dockerfiles(src/main/docker):一个用于普通JVM应用程序映像,一个用于本机应用图像。在生成的代码中,我们只需要更改一件事,添加以下依赖项,因为我们要生成JSON内容。io.quarkusquarkus-resteasy-jsonbQuarkus在整个RESTEasy项目实现中使用JAX-RS规范。这是我们的“整个”应用程序:仅此而已,使用下一个命令我们可以看到应用程序正在运行:mvncleancompilequarkus:dev在这种模式下,我们还启用了热部署和后台编译。我们做个简单的测试看看:curl-sw"\n\n"http://localhost:8080/echo/ualter|jq。现在我们看到它工作了,让我们创建Docker镜像。从这里下载GraalVM:https\://github.com/graalvm/graalvm-ce-builds/releases。重要的!不要下载最新版本19.3.0,它与Quarkus1.0不兼容,也许Quarkus1.1会。现在应该工作的版本是GraalVM19.2.1,得到这个。配置其环境变量的主路径:##在macOS下会是:exportGRAALVM_HOME=/Users/ualter/Developer/quarkus/graalvm-ce-java8-19.2.1/Contents/Home/然后在你的环境中安装GraalVMNativeImage:$GRAALVM_HOME/bin/guinstallnative-image让我们为当前平台生成一个原生版本(在本例中,是一个macOS的原生可执行文件)。mvnpackage-Pnative**\quarkus-echo-1.0-SNAPSHOT-runner**如果一切正常,我们可以在文件夹中找到一个名为./target的文件。这是你的应用程序的可执行二进制文件,你可以简单地通过运行\./target/quarkus-echo-1.0-SNAPSHOT-runner来启动它:不需要JVM(plain:java-cpapp:lib/:etcApp.jar*),这是一个本机可执行二进制文件。让我们为我们的应用程序生成一个本地Docker镜像。此命令将创建一个本地映像,一个带有Linux本地可执行应用程序的Docker映像。默认情况下,本机可执行文件是基于当前平台(macOS)创建的,并且由于我们知道生成的可执行文件与容器(Linux)在不同的平台上,我们将指示Maven从容器内部构建,生成一个nativedockerImage:mvnpackage-Pnative-Dquarkus.native.container-build=true此时,必须有Docker容器运行时和工作环境。这个文件将是一个64位Linux可执行文件,所以这个二进制文件自然不会在我们的macOS上运行,它是为我们的docker容器镜像构建的。所以,继续......让我们去生成docker镜像......dockerbuild-tujr/quarkus-echo-fsrc/main/docker/Dockerfile.native。##测试它...dockerrun-i--namequarkus-echo--rm-p8081:8081ujr/quarkus-echo关于Docker镜像大小的旁注:最终的docker镜像是115MB,但是你可以使用distroless图像版本,为.Distroless映像仅包含您的应用程序及其运行时依赖项,其他所有内容(包管理器、shell或标准Linux发行版中常见的普通程序)都被剥离。我们应用程序的Distroless图像大小为42.3MB。文件\./src/main/docker/Dockerfile.native-distroless已生成收据。关于DistrolessImages:“将运行时容器中的内容严格限制为应用程序需要的内容是谷歌和其他多年来在生产中使用容器的科技巨头采用的最佳实践”springboot反映在这里,想必大家都知道了如何制作一个通用的SpringBootDocker镜像,让我们跳过细节,好吗?只是一个重要的观察,代码是完全一样的。更好的是,几乎相同,因为我们当然使用SpringFramework注释。这是唯一的区别。您可以在提供的源代码(下面的链接)中检查每个细节。mvninstalldockerfile:build##Testingit...dockerrun--namespringboot-echo--rm-p8082:8082ujr/springboot-echo比较让我们启动两个容器,启动并运行几次,然后比较启动时间和内存占用。在此过程中,每个容器被创建和销毁10次。后来,分析了它们的启动时间和内存占用。下面显示的数字是基于所有这些测试的平均结果。启动时间显然,在可扩展性和无服务器架构方面,这个方面可以发挥重要作用。关于无服务器架构,在此模型中,通常临时容器将由事件触发以执行任务/功能。在云环境中,价格通常是基于执行次数而不是之前购买的一些计算能力。因此,此处的冷启动会影响此类解决方案,因为容器(通常)仅在执行其任务时处于活动状态。在可伸缩性方面,很明显,如果突然需要扩展,启动时间将定义容器完全准备好(启动并运行)以响应呈现的加载场景所需的时间。场景多么突然(需要和快速),长时间冷启动可能会更糟。让我们看看它们在启动时间方面的表现如何:好吧,您可能已经注意到它是启动时间图中插入的另一个测试选项。事实上,它与Quarkus应用程序完全相同,但使用JVMDocker映像构建(使用Dockerfile.jvm)。正如我们所看到的,即使是使用DockerImage和JVMQuarkus应用程序的应用程序也比SpringBoot具有更快的启动时间。毋庸置疑,QuarkusNative应用程序是明显的赢家,启动速度是迄今为止最快的。内存使用现在,让我们检查一下内存情况。检查每个容器应用程序在启动时需要消耗多少内存才能启动并运行,准备好接收请求。结论总之,这就是我们在LinuxUbuntu中看到的:看起来Quarkus赢得了两轮比赛(启动时间和内存占用),以明显的优势击败了它的竞争对手SpringBoot。这可能会让我们感到疑惑……也许是时候考虑一??些真正的测试、体验和试用Quarkus了。我们应该看看它在现实生活中的表现如何,它如何适合我们的业务场景,以及它最有用的地方。但是我们不要忘记不利的一面,正如我们在上面看到的,JVM的某些功能(还/不容易)在本机可执行二进制文件中不起作用。不管怎样,也许是时候给Quarkus一个证明自己的机会了,尤其是当冷启动问题一直困扰着你的时候。在环境中使用一个或两个带有Quarkus的Pod(K8s)怎么样,一段时间后看看它的表现会很有趣,不是吗?