您当前的位置:首页 > 电脑百科 > 程序开发 > 架构

谁才是微服务赢家:Quarkus 与 Spring Boot

时间:2022-02-11 10:46:51  来源:  作者:MicroStone

在容器时代(“Docker 时代”)JAVA 仍然处于领先地位,但哪个更好?Spring Boot 还是 Quarkus?

谁才是微服务赢家:Quarkus 与 Spring Boot

 

谁会最先进的?Spring Boot 或 Quarkus。

在容器时代(“ Docker 时代”),无论您是否在使用它,都不可否定java的活力。Java 在性能方面一直比较有优势,主要是因为代码和真实机器之间的抽象层,多平台的成本(一次编写,随处运行 - 还记得吗?),其中包含 JVM -between(JVM:模拟真实机器所做的软件机器)。

如今,使用微服务架构,也没有任何优势,为总是在同一个地方和平台上运行的东西(Docker 容器 - linux) 环境构建多平台(解释)的东西。可移植性现在不那么重要了(可能比以往任何时候都重要),那些额外的抽象级别并不重要。

话虽如此,让我们对在Java中生成微服务的两种替代方案进行简单而原始的比较:非常知名的Spring Boot和不太知名的(尚未)Quarkus

反对者

Quarkus是什么?

谁才是微服务赢家:Quarkus 与 Spring Boot

 

一套适用于GraalVM和 HotSpot的开源技术 ,用于编写 Java 应用程序。它提供(承诺)超快的启动时间和更低的内存占用。这使其成为容器和无服务器工作负载的理想选择。它使用 Eclipse 微配置文件(JAX-RS、CDI、JSON-P),这是 Java EE 的一个子集来构建微服务。

GraalVM 是一个通用的多语言虚拟机JavaScriptPython、Ruby、R、Java、Scala、Kotlin)。 GraalVM (特别是 Substrate VM)使提前(AOT)编译成为可能,将字节码转换为本地机器码,从而生成可以本地执行的二进制文件。

请记住,并非所有功能都可以在本机执行中使用,AOT 编译有其局限性。注意这句话(引用 GraalVM 团队):

我们运行需要一个封闭世界假设的激进静态分析,这意味着在运行时可访问的所有类和所有字节码必须在构建时已知。

因此,例如,反射和 Java 本机接口 (JNI) 将不起作用,至少是开箱即用的(需要一些额外的工作)。您可以在本机图像 Java 限制文档中找到限制列表。

Spring Boot是什么?

谁才是微服务赢家:Quarkus 与 Spring Boot

 

这是真的吗?好吧,我只想说一句(请随意跳过),一句话:Spring Boot构建在 Spring Framework 事实上,是一个开源框架,它提供了一种更简单的方式来构建、配置和运行基于 Web 的 Java 应用程序. 使其成为微服务的良好候选者。

战斗准备——创建 Docker 镜像

Quarkus镜像

让我们创建 Quarkus 应用程序,以便稍后将其包装在 Docker 映像中。基本上,我们将做与 Quarkus入门教程相同的事情。

使用 Quarkus maven 原型创建项目:

mvn io.quarkus:quarkus-maven-plugin:1.0.0.CR2:create
   -DprojectGroupId=ujr.combat.quarkus 
   -DprojectArtifactId=quarkus-echo
   -DclassName="ujr.combat.quarkus.EchoResource" 
   -Dpath="/echo"

这将导致我们项目的结构,如下所示:

谁才是微服务赢家:Quarkus 与 Spring Boot

 

请注意,还创建了两个示例Dockerfile (src/main/docker):一个用于普通JVM App Image,另一个用于Native App Image

在生成的代码中,我们只需要更改一件事,添加下面的依赖项,因为我们要生成 JSON 内容。

<dependency> 
   <groupId>io.quarkus</groupId>
   <artifactId>quarkus-resteasy-jsonb</artifactId> 
</dependency>

Quarkus 在整个 RESTEasy 项目实现中使用 JAX-RS 规范。

这是我们的“整个”应用程序:

谁才是微服务赢家:Quarkus 与 Spring Boot

 

这就是全部,使用下一个命令我们可以看到应用程序正在运行:

mvn clean compile quarkus:dev

在这种模式下,我们也开启了热部署,后台编译。让我们做一个简单的测试来看看:

curl -sw "nn" http://localhost:8080/echo/ualter | jq .
谁才是微服务赢家:Quarkus 与 Spring Boot

 

现在我们看到它正在工作,让我们创建 Docker 映像。从这里下载 GraalVM:https
://github.com/graalvm/graalvm-ce-builds/releases 。

重要的! 不要下载最新版本 19.3.0,它与Quarkus 1.0不兼容,也许 Quarkus 1.1 会。现在应该工作的版本是 GraalVM 19.2.1,得到这个。

配置其环境变量的主路径:

## At macOS will be: export 
GRAALVM_HOME=/Users/ualter/Developer/quarkus/graalvm-ce-java8-19.2.1/Contents/Home/

然后在你的环境中安装 GraalVM 的 Native Image:

$GRAALVM_HOME/bin/gu install native-image

让我们为当前平台生成本机版本(在这种情况下,将为 macOS 生成本机可执行文件)。

mvn package -Pnative


quarkus-echo-1.0-SNAPSHOT-runner如果一切正常,我们可以在 ./target 文件夹中找到一个名为的文件。这是您的应用程序的可执行二进制文件,您只需运行以下命令即可启动它
./target/quarkus-echo-1.0-SNAPSHOT-runner:无需使用JVM(普通:java -cp app:lib/:etc App.jar*),它是一个本机可执行二进制文件。

让我们为我们的应用程序生成一个 Native Docker Image。该命令将创建一个 Native 镜像,即带有 Linux 原生可执行应用程序的 Docker 镜像。默认情况下,本机可执行的文件是基于当前平台 (macOS) 创建的,因为我们知道生成的可执行文件与容器 (Linux) 的平台不同,我们将指示 Maven 构建从在容器内,生成原生 docker 镜像:

mvn package -Pnative -Dquarkus.native.container-build=true

此时,一定要有一个Docker容器运行时,一个工作环境。

该文件将是一个 64 位 Linux 可执行文件,因此很自然,这个二进制文件无法在我们的 macOS 上运行,它是为我们的 docker 容器映像构建的。所以,继续前进......让我们去生成 docker 图像......

docker build -t ujr/quarkus-echo -f src/main/docker/Dockerfile.native . 
  ## Testing it... 
docker run -i --name quarkus-echo --rm -p 8081:8081 ujr/quarkus-echo

附带说明,关于 Docker 映像大小:

最终的 docker 镜像是115MB,但是你可以使用distroless 镜像版本来制作一个很小的 ​Docker 镜像。Distroless 映像仅包含您的应用程序及其运行时依赖项,其他所有内容(包管理器、shell 或标准 Linux 发行版中常见的普通程序)都将被删除。我们应用程序的 Distroless 映像大小为42.3MB。该文件
./src/main/docker/Dockerfile.native-distroless有生成它的收据。

谁才是微服务赢家:Quarkus 与 Spring Boot

 

关于 Distroless Images: “*将运行时容器中的内容严格限制为应用程序所需的内容是google和其他在生产环境中使用容器多年的科技巨头采用的最佳实践*

spring boot镜像

到此,想必大家都知道如何制作一个普通的Spring Boot Docker镜像了,我们就略过细节吧?只是一个重要的观察,代码是完全相同的。更好的说法是,几乎相同,因为我们使用的是 Spring 框架注解,当然。这是唯一的区别。您可以检查提供的源代码中的每个细节(下面的链接)。

mvn install dockerfile:build 
## Testing it...
   docker run --name springboot-echo --rm -p 8082:8082 ujr/springboot-echo

战争

谁才是微服务赢家:Quarkus 与 Spring Boot

 

让我们启动两个容器,让它们启动并运行几次,然后比较Startup TimeMemory Footprint

在这个过程中,每个容器都被创建和销毁 10 次。后来,分析了它们的启动时间及其内存占用。下面显示的数字是基于所有这些测试的平均结果。

启动时间

显然,当涉及到可扩展性无服务器架构时,这方面可能会发挥重要作用。

关于 Serverless 架构,在此模型中,通常一个临时容器将由事件触发以执行任务/功能。在云环境中,价格通常基于执行次数,而不是之前购买的一些计算容量。因此,这里的 冷启动可能会影响这种类型的解决方案,因为容器(通常)只会在执行其任务时才处于活动状态。

在可扩展性中,很明显,如果需要突然向外扩展,启动时间将定义容器完全准备好(启动并运行)以响应呈现的加载场景所需的时间。

场景有多突然(需要和快速),长时间冷启动的情况可能更糟。

让我们看看它们在启动时间方面的表现:

好吧,您可能已经注意到它是在启动时间图中插入的另一个测试选项。实际上,它与 Quarkus 应用程序完全相同,但使用 JVM Docker 映像(使用 Dockerfile.jvm)生成。正如我们所看到的,即使是使用 Docker Image 和 JVM Quarkus 应用程序的应用程序也比 Spring Boot 具有更快的启动时间。

毋庸置疑,Quarkus Native 应用程序显然是赢家,它是迄今为止启动速度最快的应用程序。

内存占用

现在,让我们检查一下内存的情况。检查每个容器应用程序在启动时需要消耗多少内存,以使自己启动并运行,准备好接收请求。

结论

总之,这就是我们在Linux Ubuntu中看到的结果:

看起来 Quarkus 赢得了这两轮比赛(启动时间和内存足迹),以明显的优势战胜了对手 SpringBoot。

谁才是微服务赢家:Quarkus 与 Spring Boot

 

这可能会让我们感到疑惑……也许是时候考虑一​​些真正的测试、经验,并尝试使用 Quarkus。我们应该看看它在现实生活中的表现如何,它如何适合我们的业务场景,以及最有用的地方。

谁才是微服务赢家:Quarkus 与 Spring Boot

 

但是,我们不要忘记缺点,正如我们在上面看到的,JVM 的某些功能在本机可执行二进制文件中(还/很容易)无法工作。无论如何,也许是时候给 Quarkus 一个证明自己的机会了,特别是如果冷启动问题一直困扰着你。在环境中使用一两个配备 Quarkus 的 Pod (K8s) 怎么样,一段时间后看看它的表现会很有趣,不是吗?



Tags:微服务   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
在容器时代(“Docker 时代”)Java 仍然处于领先地位,但哪个更好?Spring Boot 还是 Quarkus? 谁会最先进的?Spring Boot 或 Quarkus。在容器时代(“ Docker 时代”),无论您是否在使用...【详细内容】
2022-02-11  Tags: 微服务  点击:(0)  评论:(0)  加入收藏
docker部署一般的,微服务的部署方式都是采用java -jar xxx.jar。这样程序就可以正常启动了。但是,随着技术的发展,脚本方式部署只能启动单台服务的启动。因此,微服务容器化部署...【详细内容】
2022-01-24  Tags: 微服务  点击:(19)  评论:(0)  加入收藏
什么是微服务如今随着社交媒体的兴起,互联网的快速发展,应用程序变得越来越复杂,需要处理的任务也越来越多。 过去的单体应用程序已经无法满足日益增进的技术需求。因此人们迫...【详细内容】
2021-12-30  Tags: 微服务  点击:(33)  评论:(0)  加入收藏
▶ 企业级项目结构封装释义 如果你刚毕业,作为Java新手程序员进入一家企业,拿到代码之后,你有什么感觉呢?如果你没有听过多模块、分布式这类的概念,那么多半会傻眼。为什么一个项...【详细内容】
2021-12-20  Tags: 微服务  点击:(37)  评论:(0)  加入收藏
前面谈过很多关于数字化转型,云原生,微服务方面的文章。虽然自己一直做大集团的SOA集成平台咨询规划和建设项目,但是当前传统企业数字化转型,国产化和自主可控,云原生,微服务是不...【详细内容】
2021-12-06  Tags: 微服务  点击:(46)  评论:(0)  加入收藏
微服务看似是完美的解决方案。从理论上来说,微服务提高了开发速度,而且还可以单独扩展应用的某个部分。但实际上,微服务带有一定的隐形成本。我认为,没有亲自动手构建微服务的经历,就无法真正了解其复杂性。...【详细内容】
2021-11-26  Tags: 微服务  点击:(61)  评论:(0)  加入收藏
实施微服务架构,我们一直在遵循一个实践原则:每个微服务要有自己独立的数据库,避免数据库层面的耦合。这种理所当然感觉好像不需要多加思考,就是应该这样做; 图片来源:James Lewi...【详细内容】
2021-10-11  Tags: 微服务  点击:(57)  评论:(0)  加入收藏
在今年的NGINX Sprint 2.0虚拟大会上,NGINX(来自流行的开源web服务器/负载均衡器和反向代理背后的公司F5),发布了NGINX现代应用参考架构(MARA)。该公司在一篇博客文章中说,这将帮...【详细内容】
2021-09-26  Tags: 微服务  点击:(77)  评论:(0)  加入收藏
今天,字节跳动正式宣布开源 CloudWeGo。这是一套以 Go 语言为核心、专注于微服务通信与治理的中间件集合,具有高性能、可扩展、高可靠的特点。项目地址:https://github.com/clo...【详细内容】
2021-09-08  Tags: 微服务  点击:(117)  评论:(0)  加入收藏
1. Spring Boot 与 Spring Cloud Spring Boot 是用于编写微服务的 Java 基础框架。在Spring Cloud 提供了各种构建全栈微服务的功能。构建小型和大型系统都适合。由于控制反...【详细内容】
2021-08-31  Tags: 微服务  点击:(206)  评论:(0)  加入收藏
▌简易百科推荐
在容器时代(“Docker 时代”)Java 仍然处于领先地位,但哪个更好?Spring Boot 还是 Quarkus? 谁会最先进的?Spring Boot 或 Quarkus。在容器时代(“ Docker 时代”),无论您是否在使用...【详细内容】
2022-02-11  MicroStone    Tags:微服务   点击:(0)  评论:(0)  加入收藏
什么时候需要使用架构原则?1:架构设计2:项目验收总结:诸事不决,架构原则 架构设计原则1:体系安全2:成本合理3:稳定可靠4:性能适用5:运维高效 体系安全1:根据系统的合规标准设定目标1.1:...【详细内容】
2022-02-09  花花公子love    Tags:架构   点击:(7)  评论:(0)  加入收藏
手机号码一键登录是最近两三年出现的一种新型应用登录方式,比之前常用的短信验证码登录又方便了不少。登陆时,应用首先向用户展示带有本机号码掩码的授权登录页面,用户点击“同...【详细内容】
2022-02-01  萤火架构    Tags:一键登录   点击:(18)  评论:(0)  加入收藏
DDD这几年越来越火,资料也很多,大部分的资料都偏向于理论介绍,有给出的代码与传统MVC的三层架构差异较大,再加上大量的新概念很容易让初学者望而却步。本文从MVC架构角度来讲解...【详细内容】
2022-01-24  杨同学编程    Tags:架构   点击:(21)  评论:(0)  加入收藏
总览 使用flowable自带的flowable-ui制作流程图 使用springboot开发流程使用的接口完成流程的业务功能一、flowable-ui部署运行flowable-6.6.0 运行 官方demo参考文档:https:...【详细内容】
2022-01-24  实战Java    Tags:SpringBoot   点击:(21)  评论:(0)  加入收藏
今天在实际项目中遇到多线程同步锁记录一下;第一步 新建SynchrogazerConfig.java 文件@Slf4j@Componentpublic class SynchrogazerConfig { Map<String, Object> map = ne...【详细内容】
2022-01-24  率真执着的明月    Tags:SpringBoot   点击:(21)  评论:(0)  加入收藏
本文主要介绍mybatis-plus这款插件,针对springboot用户。包括引入,配置,使用,以及扩展等常用的方面做一个汇总整理,尽量包含大家常用的场景内容。本文项目代码gitee地址: gitee.c...【详细内容】
2022-01-21  Java架构海子    Tags:mybatis-plus   点击:(26)  评论:(0)  加入收藏
一、前言1.1、关于枚举类① 枚举是JDK1.5中的新功能,我们可以使用枚举很好的去描述一些业务场景:一年有四季、人类有男女...② 同样我们在业务层面会有很多,比如状态属性、分...【详细内容】
2022-01-20  晓掌柜丶韶华    Tags:MybatisPlus   点击:(22)  评论:(0)  加入收藏
1Kubernetes 集群架构图 2Openshift or Kubernetes 集群架构图 3常见的 CI/CD 架构图1. Gitlab Webhook + Jenkins SharedLibraries/Kubernetes + SonarScanner Maven Plugi...【详细内容】
2022-01-18  IT人张飞洪    Tags:Kubernetes   点击:(21)  评论:(0)  加入收藏
目前线上很多SAAS系统,但是SAAS系统必须支持多租户,对于多租户有多种实现方式,当然不同的实现方式的成本也是不同的。这里我介绍一种最节省成本的实现方式,通过数据记录增加租户...【详细内容】
2022-01-10  萧声飞扬    Tags:Spring boot   点击:(33)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条