您应该在2020年选择哪种Java微服务框架?
ccwgpt 2024-10-30 01:38 32 浏览 0 评论
探索Micronaut和Quarkus与Spring Boot的关系-它们有多好?
到2020年,Java仍然是构建Web应用程序的最流行的编程语言之一,尽管它必须面对来自Go,Python和TypeScript等新型语言的激烈竞争。
在Java世界内部,Spring框架已成为微服务开发的事实上的标准,通过诸如Spring Boot和Spring Data之类的库,该框架易于使用,并且可以进行高效且大部分情况下轻松进行开发。
但是,近年来,已经引入了新的框架,声称可以缩短Java应用程序的启动时间并减少其内存占用。 由于我目前正在使用Java开发基于微服务的大型应用程序,因此我想检查哪种Java框架最适合这种架构。
因此,我的主要重点是易于开发以及生成的微服务的资源管理。
关于资源管理,Spring(实际上是Java平台的大多数)从未有过最好的声誉,尤其是在涉及单个流程所需的开销方面。 在应用服务器时代,这并不是主要的问题,因为实例数量很少。 但是,随着微服务架构及其大量小型实例的兴起,这已成为越来越多的问题-或正如Christian Lusardi最近所说的那样:
"我发现在Spring Boot上运行的基本Java应用程序至少需要1GB的RAM才能运行,开发中间件应用程序没关系,但是在微服务架构中,这非常糟糕!"
候选人
Spring
响应于早期Java Enterprise的复杂性,Spring于2003年应运而生。 Spring的核心是依赖注入(DI)和面向方面的编程(AOP)框架,后来演变为易于使用的Web应用程序框架。 通过其广泛的文档,广泛的使用和无数的库,Spring使开发人员可以有效地创建和维护应用程序,并提供平坦的学习曲线。
Spring在运行时使用反射执行DI。 因此,当启动spring应用程序时,将在类路径中扫描带注释的类。 基于此,实例化并链接具体对象。
尽管这种方法非常灵活且对开发人员友好,但它会使启动速度变慢,并且非常消耗内存。 此外,由于该机制不支持反射,因此很难迁移到GraalVM。
Micronaut
Micronaut是现代的全栈微服务框架,由Grails框架的创建者于2018年引入。
它提供了构建功能全面的微服务应用程序所需的所有工具。 同时,它旨在提供快速启动并减少内存占用。 通过使用Java注释处理器执行DI,创建面向方面的代理并在编译时(而不是运行时)配置应用程序,可以实现此目标。
Micronaut中的许多API均受Spring和Grails的启发。 这是设计使然,有助于快速吸引新开发人员。 因此,Micronaut提供了诸如Micronaut HTTP,数据,安全性和各种其他技术的连接器之类的模块。 但是,这些库的成熟度仍落后于Spring的同类库。
Quarkus
Quarkus是Red Hat在2019年推出的Kubernetes原生Java框架。它基于MicroProfile,Vert.x,Netty和Hibernate等标准构建。
Quarkus的目标是通过在容器编排平台中允许更快的启动,较低的内存消耗和近乎即时的扩展来使Java成为Kubernetes中的领先平台。 Quarkus通过使用自定义的Maven插件在编译时而不是在构建时执行尽可能多的工作来达到此目的(在Quarkus中,这也称为编译时启动)。
Quarkus正在使用大多数现有的标准技术,但可以扩展。 但是,由于该项目仅在一年前才开始,所以这些扩展的成熟度和兼容性并不总是很清楚。 随着平台的发展,这种情况将来可能会改变。
Helidon MicroProfile
MicroProfile项目始于2016年,当时尚不清楚Oracle是否以及如何继续在Java Enterprise上工作。
与其前身JEE一样,MicroProfile是可以由各种供应商实施的规范。
此后已经提出了多种这样的实现方式,最著名的是Payara Micro和Helidon MP。 Payara是从GlassFish派生的Jakarte EE服务器,而Payara Micro是其MicroProfile实现。 Helidon是Oracle在2018年启动的运行时,提供了自己的MicroProfile规范实现。
由于它们是从JEE衍生而来的,因此MicroProfile规范已经很成熟并且有据可查。 但是,缺少用于现代技术的连接器或替代诸如Spring Data和Spring Security之类的库的方法。
此外,由于同时开始了Jakarta EE(也在Eclipse Foundation中)的开发,MicroProfile的未来尚不清楚。 因此,似乎两个项目将来可能会合并或至少紧密协调。
比较框架
为了比较上述框架,我使用了每个框架都实现了一个简单的应用程序。 该示例应用程序包括一个用于创建,读取,更新和删除对象的REST接口,以及一个将这些对象存储到表中的关系数据库连接器。
如果框架支持访问数据库的不同方法,那么我将尝试为不同的变体实现示例项目。 然后,我比较了这些应用程序的性能。
我使用OpenJDK Docker映像运行了该应用程序。 如果框架支持生成本机GraalVM映像,则我还比较了它们的性能。 另外,请查看我的文章"使用R2DBC,Micronaut和GraalVM进行响应式数据库访问",以获取有关GraalVM的更多信息。 所有这些应用程序的源代码都可以在GitHub上找到。
我在三个关键阶段比较了这些应用程序的性能:
· 实施示例应用程序有多容易? 要实现这些框架,我必须检查文档以及在诸如Stack Overflow之类的平台上搜索信息。
· 编译应用程序需要多长时间? 我已经测量了执行干净构建所需的时间,包括生成Docker映像的时间。 对于GraalVM,这包括生成本机映像的时间。
· 启动应用程序需要多长时间? 在这里,我测量了从运行docker到应用正确响应第一个HTTP请求之间的时间。 另外,我还比较了启动后测量的空闲应用程序的内存占用量。
· 负载:应用程序可以查看多少个请求? 我使用JMeter进行负载测试,并对应用程序进行了测试,其中25%的请求执行数据库写入,而75%的请求仅执行数据库读取。 然后,我再次根据其峰值性能来测量应用程序的内存占用量。
我在具有四个Intel Haswell CPU和15 GB内存且运行Ubuntu 19.01的Google Cloud Platform虚拟机上执行了所有测试。 所有测量均已重复多次,以避免干扰因素。 您可以在GitHub上找到使用的脚本以及原始数据。
结果
易于开发
由于我以前只有使用Spring Boot的知识,所以这是一个不公平的比较。 但是,在检查文档以及可用的信息和示例时,Spring是迄今为止最简单的框架。
Micronaut的文档做得很好,并且具有与Spring和Grail类似的API。 因此,Spring开发人员很容易开始使用它。
我认为,Quarkus的学习曲线较为陡峭,因为与Spring和Micronaut相比,库和API的成熟度较低。 我特别缺少简单的数据库访问权限。
但是,在我看来,Helidon显然是最后一次,因为我为使应用程序运行付出了很多努力。
汇编
对于所有框架,使用OpenJDK时的编译时间都非常相似,并且在6.98秒(使用JDBC的Spring)和10.7秒(Quarkus)之间。
但是,原始GraalVM映像的生成非常耗时,并且花费了231.2秒(使用JDBC的Micronaut)和351.7秒(使用JPA的Micronaut)之间。 这使得本机映像对于开发基本上毫无用处,因为等待四分钟来编译一个简单的应用程序实在太多了。
启动
使用Spring Data的Spring Boot应用程序平均花了8.16秒来启动。 删除JPA和Spring Data可以将其减少到5.8秒。
在这里,Micronaut(使用JPA的时间为5.08秒,使用JDBC的时间为3.8秒)和Quarkus(5.7秒)保持了缩短启动时间的承诺。
只有Helidon MP甚至比Spring慢-平均为8.27秒。
但是,真正的赢家是GraalVM。 本机映像的启动时间在1.39秒(Quarkus)和1.46秒(使用JDBC的Micronaut)之间,比OpenJDK实现要快得多。
引导后直接使用的内存使用情况非常相似。 Spring分配了420 MB内存(使用Spring Data)和261 MB(使用JDBC)。
使用JPA时Micronaut的内存为262 MB,使用JDBC时为178 MB。
197 MB的Quarkus表现更好。 Helidon MP具有414 MB,与Spring Boot类似。
同样在这里,仅使用7 MB(Quarkus)和27 MB(Micronaut使用JPA)的内存,本地GraalVM映像就大大优于OpenJDK实现。
峰值性能
在负载下,Spring Boot表现出色,能够每秒处理342(使用Spring Data)和216(JDBC)请求(r / s),并使用581 MB(Spring Data)和484 MB(JDBC)内存。 Helidon显然是最后一个,仅能以175 r / s的速度分配超过1 GB的内存。
其他框架能够在400 r / s(Quarkus作为本机映像运行)和197 r / s(OpenJDK上的Quarkus)之间提供服务。 各种Micronaut实现介于两者之间,与JDBC相比,JPA和本机映像比OpenJDK略有优势。
在内存使用方面,OpenJDK上的Quarkus表现出色,仅消耗255 MB内存。 这甚至比同一个应用程序作为本机映像运行要少得多,该应用程序平均花费368 MB的内存。
但是,Micronaut却非常浪费。 在OpenJDK中运行的JPA实现平均使用880 MB,比Spring的内存使用量高50%以上。 但是,使用JDBC和本机映像有助于Micronaut将其内存占用空间减少到367.8 MB。
结论
与Spring和MicroProfile之类的现有框架相比,新的Java框架Micronaut和Quarkus保证了更快的启动时间和更低的内存占用。
他们的确兑现了这一诺言-但只有在闲置或负载很小的情况下才可以。 在这里,它们的性能优于Spring,特别是将它们与本地GraalVM图像结合使用时。 但是,在负载下,它们没有提供太多优势,即使当作为本机图像运行时也是如此。
到目前为止,尽管Spring仍然提供最佳的开发人员体验,但我认为它仍然是最适合微服务应用程序的Java框架-即使考虑到启动时的性能也很差。
让我感到惊讶的是使用Hibernate / JPA / Spring Data的巨额成本。 即使对于这个非常简单的应用程序,在内存(以及r / s)方面的开销也是巨大的。 在这里,我特别喜欢Micronaut Data的解决方案,该解决方案无需JPA即可自动生成存储库代码。 这确实可以添加到Spring Data中。
事实证明,原始GraalVM映像在启动时具有令人难以置信的快速性和内存效率,但是在负载下,它们并没有提供明显的优势。 由于本机GraalVM的生成会带来一些额外的困难,并且编译时间会急剧增加,因此该技术目前仅在需要快速启动的情况下才有用-例如,在无服务器架构中或非常快速地扩展。 在所有其他情况下,与负载下的类似性能相比,成本仍然太高。
(本文翻译自Matthias Graf的文章《Which Java Microservice Framework Should You Choose in 2020?》,参考:https://medium.com/better-programming/which-java-microservice-framework-should-you-choose-in-2020-4e306a478e58)
相关推荐
- MFC、Qt、WPF?该用哪个?(mfc和wpf区别)
-
MFC、Qt和WPF都是流行的框架和工具,用于开发图形用户界面(GUI)应用程序。选择哪个框架取决于你的具体需求和偏好。MFC(MicrosoftFoundationClass)是微软提供的框架,...
- 一款WPF开发的通讯调试神器(支持Modbus RTU、MQTT调试)
-
我们致力于探索、分享和推荐最新的实用技术栈、开源项目、框架和实用工具。每天都有新鲜的开源资讯等待你的发现!项目介绍Wu.CommTool是一个基于C#、WPF、Prism、MaterialDesign...
- 关于面试资深C#、WPF开发工程师的面试流程和问题
-
一、开场(2-3分钟)1.欢迎应聘者,简单介绍公司和面试流程。2.询问应聘者是否对公司或岗位有初步的问题。二、项目经验与技术应用(10-20分钟)1.让应聘者详细介绍几个他参与过的C#、...
- C# WPF MVVM模式Prism框架下事件发布与订阅
-
01—前言处理同模块不同窗体之间的通信和不同模块之间不同窗体的通信,Prism提供了一种事件机制,可以在应用程序中低耦合的模块之间进行通信,该机制基于事件聚合器服务,允许发布者和订阅者之间通过事件进行...
- WPF 机械类组件动画制作流程简述(wps上怎么画机械结构简图)
-
WPF机械类组件动画制作流程简述独立观察员2025年3月4日一、创建组件创建组件用户控件,将组件的各部分“零件”(图片)拼装在一起,形成组件的默认状态:二、给运动部分加上Rend...
- C#上位机WinForm和WPF选哪个?工控老油条的"血泪史"
-
作为一个从互联网卷进工控坑的"跨界难民",在这会摸鱼的时间咱就扯一下上位机开发选框架这档子破事。当年我抱着WPF的酷炫动画一头扎进车间,结果被产线老师傅一句"你这花里胡哨的玩意...
- 【一文扫盲】WPF、Winform、Electron有什么区别?
-
近年来,随着软件开发的不断发展,开发人员面临着选择适合他们项目的各种框架和工具的挑战。在桌面应用程序开发领域,WPF、Winform和Electron是三个备受关注的技术。本文将介绍这三者的区别,帮助...
- 一个开源、免费、强大且美观的WPF控件库
-
我们致力于探索、分享和推荐最新的实用技术栈、开源项目、框架和实用工具。每天都有新鲜的开源资讯等待你的发现!项目介绍HandyControl是一套基于WPF(WindowsPresentationF...
- WPF 根据系统主题自动切换浅色与深色模式
-
WPF根据系统主题自动切换浅色与深色模式控件名:Resources作者:WPFDevelopersOrg-驚鏵原文链接[1]:https://github.com/WPFDevelopers...
- WPF与WinForm的本质区别(wpf与maui)
-
在Windows应用程序开发中,WinForm和WPF是两种主要的技术框架。它们各自有不同的设计理念、渲染机制和开发模式。本文将详细探讨WPF与WinForm的本质区别,并通过示例进行说明。渲染机制W...
- Win10/Win11效率神器再进化:微软发布PowerToys 0.90.0版本
-
IT之家4月1日消息,微软今天(4月1日)更新PowerToys,在最新发布的0.90.0版本中,修复多个BUG之外,引入多项功能更新,为Windows10、Windows...
- 一款非常漂亮的WPF管理系统(wpf架构及特性)
-
我们致力于探索、分享和推荐最新的实用技术栈、开源项目、框架和实用工具。每天都有新鲜的开源资讯等待你的发现!WPFManager项目介绍该项目是一款WPF开发的管理系统,数据库采用的MSSqlserv...
- WPF 实现描点导航(wpf按钮的点击事件)
-
WPF实现描点导航控件名:NavScrollPanel作者:WPFDevelopersOrg-驚鏵原文链接[1]:https://github.com/WPFDevelopersOrg/WPF...
- 微软更新基于Win11的Validation OS 2504:增强 .NET与WPF
-
IT之家5月1日消息,科技媒体NeoWin今天(5月1日)发布博文,报道称微软公司更新基于Windows11的ValidationOS,增强支持.NET和WPF,并优...
- WPF的技术架构与优势(wpf的前景)
-
WindowsPresentationFoundation(WPF)是一个现代化的用户界面框架,专为构建Windows应用程序而设计。它通过分层的技术架构和丰富的功能集,提供了全面的应用程...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- MVC框架 (46)
- spring框架 (46)
- 框架图 (58)
- bootstrap框架 (43)
- flask框架 (53)
- quartz框架 (51)
- abp框架 (47)
- jpa框架 (47)
- laravel框架 (46)
- express框架 (43)
- springmvc框架 (49)
- 分布式事务框架 (65)
- scrapy框架 (52)
- java框架spring (43)
- grpc框架 (55)
- orm框架有哪些 (43)
- ppt框架 (48)
- 内联框架 (52)
- winform框架 (46)
- gui框架 (44)
- cad怎么画框架 (58)
- ps怎么画框架 (47)
- ssm框架实现登录注册 (49)
- oracle字符串长度 (48)
- oracle提交事务 (47)