导读:Java 的生态系统为开发者带来了良好的性能和稳定性。以下是我对七款专为现代轻量级应用程序开发而构建的顶级 Java 微框架的详细评测。
Java的微框架通常轻量且极简,强调性能、云原生能力和开发者体验。它们专为构建轻量级Web应用设计,特别适合微服务架构。虽然Spring Boot是这个领域最常见的选择,但不同的框架能满足人们的不同需求。
本文快速浏览了七个因独特功能组合和简洁性而备受推崇的Java微框架。下表便是这些框架的详细评测,包括作为人们重点选择和参考的Spring Boot:
框架 | 受欢迎度 | GitHub 地址 | |
Spring Boot | ~78.2K | 事实上的标准,轻量级 Spring | https://github.com/spring-projects/spring-boot |
~14.8K | 启动速度快,内存占用低 | https://github.com/quarkusio/quarkus | |
Vert.x | ~14.6K | 高并发、非阻塞 | https://github.com/eclipse-vertx/vert.x |
~13.9K | 协程,灵活性 | https://github.com/ktorio/ktor | |
Dropwizard | ~8.4K | 稳定性,“包含电池” | https://github.com/dropwizard/dropwizard |
~8K | 极其简单,小型 API | https://github.com/javalin/javalin | |
Micronaut | ~6.3K | 无反射,高效 | https://github.com/micronaut-projects/micronaut-core |
Helidon | ~3.7K | Oracle 支持,基于标准 | https://github.com/helidon-io/helidon |
关于性能之说明
本文介绍的多数Java微框架都依赖GraalVM生成原生二进制文件。
这些二进制文件针对目标平台高度优化,意味着快速启动和关闭、良好的内存效率和运行时性能(包括提前编译/AOT)。这些特性对生产环境非常有益,特别是在无服务器环境中,进程通常根据需求变化而启动和停止。
使用GraalVM编译为二进制的设计良好的Java应用程序是性能最高的运行时之一。你可以使用SDKMan安装GraalVM,如使用如下命令:
sdk install java 24.0.2-graalce
现代Java和JVM语言的另一个杀手级特性是虚拟线程。本文讨论的每个框架都与此特性有关,该特性在Java 21中被认为是稳定且可用于生产的。
让我们来详细看看这些框架。
Quarkus是一个现代的云原生框架,具有优秀的开发模式、具有众多功能的可插拔架构,并提供使用GraalVM或Mandrel的简单原生构建。它尤其适合熟悉Spring并希望快速启动和原生编译的开发者。
Quarkus还提供有一个命令行界面(CLI),可以为我们搭建应用程序。安装Quarkus:
sdk install quarkus
然后,我们就可以使用quarkus create
搭建应用。如果在开发模式下启动应用:
quarkus dev
它将能够热部署代码更改,并生成开发控制台。
Quarkus为我们提供了许多扩展,如日志、指标、认证和数据存储。我们可以使用UI管理界面它们,使用CLI添加和删除它们。Quarkus支持命令式和响应式编程风格,它通过Vert.x实现这两种风格。它允许在同一应用程序中同时使用这两种编程风格,它亦直接支持虚拟线程。
Quarkus还提供了一个基于Jakarta EE标准的CDI注入框架,并在构建时解析这些依赖关系,以避免因运行时解析而导致的减速。这提高了原生和JVM构建的性能。
以下,是Quarkus中的一个简单的节点示例:
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;
public class GreetingResource{
public String hello (){
return "Hello from InfoWorld!";
}
}
Vert.x是最早且成熟的Java响应式框架之一。它是一个全面的响应式容器,包含创建高性能响应式管道所需的一切。它特别适合需要为高吞吐量数据流调整性能的项目。
与其说是一个框架,不如说Vert.x是一组精心设计的工具,用于组合响应式流。如果你寻求最大灵活性,它是一个优势。包括Quarkus在内的各种工具和框架都建立在Vert.x之上。无论你将其用作工具包还是框架,Vert.x都异常强大且适用范围广。
Vert.x技术建立在事件循环架构上,旨在最小化空闲CPU资源。在此架构之上,Vert.x提供了各种处理异步编程的方法。它还支持RxJava,提供大量操作符和复杂的响应式构造。
尽管它使用事件循环,但Vert.x并不限于单线程,因此开发者既可以得到异步处理,又可以得到多线程。这被称为多反应器,通常为你提供每个CPU核心一个事件线程(相对于Node等有巨大优势)。此外,你可以微调应用程序创建其处理程序类(称为verticles)的多个实例的方式,以便在单个节点内扩展。
Vert.x也为Kotlin语言构建,并允许开发者原生使用Kotlin协程进行异步事件处理。Vert.x支持的其他语言包括Groovy、Ruby、Java等,甚至通过websockets的客户端JavaScript。
以下,是Vert.x节点的一个代码示例:
import io.vertx.core.AbstractVerticle;
import io.vertx.core.Promise;
public class MainVerticle extends AbstractVerticle{
public void start (Promise
startPromise)
throws
Exception {
vertx.createHttpServer().requestHandler(req -> {
req.response()
.putHeader(
"content-type",
"text/plain"
)
.end(
"Hello from Vert.x!"
);
}).listen(8888, http -> {
if(http.succeeded()) {
startPromise.complete();
System.out.println("HTTP server started on port 8888");
}else{
startPromise.fail(http.cause());
}
});
}
Vert.x还为许多流行数据库(例如MongoDB)提供了设计良好且高性能的连接器,以及一个与这些数据存储集成的授权和认证组件。与Spring Initializr类似,Vert.x为你提供了一个基于Web的工具来构建新应用。
如果需要消费、连接和生成实时数据流,Vert.x是一个很好的选择。它是Java最先进和最成熟的响应式平台之一。
这个Ktor是由JetBrains专门为Kotlin语言构建的独特框架。
你可能知道Kotlin是一种现代编程语言,提供了可以完全访问JVM的强大功能。Ktor提供了一系列可组合的功能,旨在进行Web开发,并利用Kotlin协程进行异步编程。它提供了在Kotlin中构建Web应用程序的官方机制。
Ktor CLI包括一个功能齐全的创建向导,你可以使用它启动新应用程序(ktor new
):
Ktor是一个模块化框架,支持称为"功能"的插件。选项包括DI(依赖注入)引擎(koin
)和其他必要的东西,如监控、管理、数据存储连接器和安全性。这些都统一在Ktor的框架之下。
Ktor为开发者们提供了很大的技术能力,包括用于生成HTML的Kotlin DSL——这是一种非常符合习惯且简单的生成数据驱动标记的方法。Ktor最强大的可能是它隐式使用Kotlin的协程,使非阻塞异步操作看起来是同步的;例如,像这样的东西看起来是阻塞的(在client.get()
调用上),但在底层是完全异步的。
请大家来看下列代码:
import io.ktor.client.*
//... other imports
routing {
get ("/") {
try{
// Implicit coroutine use:
val book = client.get("https://anapioficeandfire.com/api/books/1").body
() call.respond(book)
}
catch(e: Exception) {
call.respondText("Error fetching book:${e.message}")
}
}
}
}
Dropwizard最引人注目的功能之一是其基于Metrics的内置操作指标,Metrics是由Dropwizard团队构建的库。Metrics是一个功能齐全的监控工具,与您的应用程序集成。它还集成了常见的库依赖项和后端,如Graphite。
Dropwizard基本上是一个粘合框架,将许多其他项目捆绑在一个易于使用的包中。它让您智能地使用这些项目,而不必自己编排它们:
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;
public class HelloResource {
public String sayHello(){
return "Hello World!";
}
}
Javalin是为那些想要极致简单性和没有"魔法"的开发者准备的微框架。
Javalin是SparkJava的代码继承者,SparkJava是JVM最早的开放源代码微框架之一。它专为简单性和灵活性而设计。与许多现代框架不同,Javalin力求不出现意见,更像一个库而不是框架。
因为Javalin专注于避免隐藏依赖(即"魔法")并在代码中明确描述一切,所以它不提供代码扫描功能。Javalin服务器往往非常简洁。与Dropwizard一样,Javalin嵌入了Jetty服务器,为您提供了一个以可靠性和性能著称的熟悉HTTP平台:
import io.javalin.Javalin
fun main(){
val app = Javalin.create( /*config*/ )
.get("/") {
ctx ->ctx.result(
"Hello World"
)
}
.start(7070)
}
import io.javalin.Javalin;
public class App {
public static void main(String[] args)
{
var app = Javalin.create()
.get(
"/"
, ctx -> ctx.result(
"Hello World"
))
.start(7070);
}
}
请注意,这是流畅的方法链,并且是干净的代码,允许我们一起描述服务器定义和节点。
Javalin避免了膨胀和任何不必要的依赖语法。如果你正在寻找一个极简的框架来完成工作,Javalin可能是适合你的框架。
当启动的时间至关重要时,或者如果您想要一个多语言、全栈框架来构建微服务和无服务器应用程序,Micronaut是一个很好的选择。
它为你提供了一个AOT编译器,提供性能和无反射的依赖注入。它可以在JVM中运行,也可以使用GraalVM编译为原生映像。
Micronaut IoC(控制反转)容器的工作方式意味着所有依赖项都在编译期间解析。这意味着快速启动时间,这对微服务至关重要。
Micronaut的设计还意味着依赖注入的内存使用更低。Micronaut是多语言的,支持Java、Groovy和Kotlin,计划支持Scala语言。
Micronuat是为云设计的。它具有与Kubernetes等服务发现提供程序和Jaeger等跟踪的自动集成。这使您可以避免硬编码,并通过配置设计具有自动发现和跟踪的微服务。它还支持像Consul这样的分布式配置。
import io.micronaut.http.annotation.Controller;
import io.micronaut.http.annotation.Get;
public class HelloController {
public String hello (String name) {
return "Hello, " + name;
}
}
从名字上来看,Micronaut是微服务的理想选择,并且确实能让你在开发它们时尽可能轻松。它大概是Java最精细调整的微服务框架。
如果你想坚持Java标准,为企业做好准备,Helidon值得考虑。Helidon既是本文介绍的最新的框架,也是Oracle的官方项目。
它从头开始设计用于虚拟线程和构建时依赖注入(类似于Micronaut)。它还最近添加了针对AI的功能。
Helidon有两种变体:
Helidon SE类似于Javalin,而Helidon MP在哲学和功能集上类似于Quarkus。采用虚拟线程意味着它摒弃了复杂的并发模型,使理解和管理应用程序节点变得更加容易。
以下是Helidon SE中的一个节点示例:
import io.helidon.webserver.WebServer;
import io.helidon.webserver.http.HttpRouting;
public class Main {
public static void main (String[] args){
HttpRouting routing = HttpRouting.builder()
.get("/hello", (req, res) -> res.send(
"Hello from InfoWorld!"
))
.build();
WebServer.builder()
.routing(routing)
.port(8080)
.build()
.start();
}
}
Helidon的杀手级功能便是它是Oracle标准,并为开发者提供模型选择,无论是想使用SE,还是更基础的DIY,还是更喜欢使用MP的自我认定,它都是一个全功能的框架。
Java为构建现代云中提供了广泛的选择,从简单的API到复杂的微服务集群、无服务器部署和全栈应用程序。
本文讨论的每个Java微框架都相当可靠,所以你不必被选择所压倒。你可以通过确定一两个似乎满足需求的框架开始,然后深入了解代码,选择感觉最好的那个。
这些框架的优点是它们都优先考虑开发者体验,由你决定哪种开发者体验最适合自己。
作者:洛逸
本篇文章为 @ 场长 创作并授权 21CTO 发布,未经许可,请勿转载。
内容授权事宜请您联系 webmaster@21cto.com或关注 21CTO 公众号。
该文观点仅代表作者本人,21CTO 平台仅提供信息存储空间服务。
请扫描二维码,使用微信支付哦。