+8613426109659
webmaster@21cto.com

Java微框架之最佳学习指南

编程语言 0 131 3天前
图片


导读:Java 的生态系统为开发者带来了良好的性能和稳定性。以下是我对七款专为现代轻量级应用程序开发而构建的顶级 Java 微框架的详细评测。

Java的微框架通常轻量且极简,强调性能、云原生能力和开发者体验。它们专为构建轻量级Web应用设计,特别适合微服务架构。虽然Spring Boot是这个领域最常见的选择,但不同的框架能满足人们的不同需求。

本文快速浏览了七个因独特功能组合和简洁性而备受推崇的Java微框架。下表便是这些框架的详细评测,包括作为人们重点选择和参考的Spring Boot:

框架受欢迎度
优势
GitHub 地址
Spring Boot~78.2K事实上的标准,轻量级 Springhttps://github.com/spring-projects/spring-boot
Quarkusio
~14.8K启动速度快,内存占用低https://github.com/quarkusio/quarkus
Vert.x~14.6K高并发、非阻塞https://github.com/eclipse-vertx/vert.x
Ktorio
~13.9K协程,灵活性https://github.com/ktorio/ktor
Dropwizard~8.4K稳定性,“包含电池”https://github.com/dropwizard/dropwizard
Javalin
~8K极其简单,小型 APIhttps://github.com/javalin/javalin
Micronaut~6.3K无反射,高效https://github.com/micronaut-projects/micronaut-core
Helidon~3.7KOracle 支持,基于标准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


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;
@Path("/hello")
public class GreetingResource{@GET @Produces(MediaType.TEXT_PLAIN)public String hello (){return "Hello from InfoWorld!";  }}


Quarkus通过支持开发者,并引入额外功能来达到最佳平衡。如果你想要一个简单但多功能且注重开发者体验的框架,Quarkus是一个很值得的选择。


Vert.x


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{
@Override 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 提供了一个复杂的事件总线,用于在微服务应用程序的节点内部和之间通信。将事件总线视为Vert.x节点的轻量级分布式消息系统。如果你需要升级到持久消息代理,Vert.x本身支持包括RabbitMQ在内的多种集成。


Vert.x还为许多流行数据库(例如MongoDB)提供了设计良好且高性能的连接器,以及一个与这些数据存储集成的授权和认证组件。与Spring Initializr类似,Vert.x为你提供了一个基于Web的工具来构建新应用。

如果需要消费、连接和生成实时数据流,Vert.x是一个很好的选择。它是Java最先进和最成熟的响应式平台之一。

Ktor


这个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 importsrouting { 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}")    	        }  	}     }}


Ktor是一套非常全面的工具,用于构建各种服务器端Kotlin功能。尽管它最出名的是将协程引入Web服务器,但它可以处理你抛给它的任何东西。Ktor特别适合寻求功能齐全的Web应用程序框架的Kotlin开发人员。


Dropwizard


Dropwizard是一个成熟的轻量级框架,面向云环境中的现代RESTful服务。它将Jetty服务器嵌入您的应用程序中以实现独立运行,并将Jackson用于JSON,将Jersey用于端点定义。除了这个基本设置,您可以添加组件来处理持久性和其他常见的应用程序需求。


Dropwizard最引人注目的功能之一是其基于Metrics的内置操作指标,Metrics是由Dropwizard团队构建的库。Metrics是一个功能齐全的监控工具,与您的应用程序集成。它还集成了常见的库依赖项和后端,如Graphite。

Dropwizard基本上是一个粘合框架,将许多其他项目捆绑在一个易于使用的包中。它让您智能地使用这些项目,而不必自己编排它们:


以下,是Dropwizard中的节点映射:
import jakarta.ws.rs.GET;import jakarta.ws.rs.Path;import jakarta.ws.rs.Produces;import jakarta.ws.rs.core.MediaType;@Path("/hello")@Produces(MediaType.TEXT_PLAIN)public class HelloResource {@GET public String sayHello(){return "Hello World!";  	}}

Dropwizard是在一个轻量级、统一的框架中汇集了一系列优秀的工具,这些工具已为云做好完全准备。它还非常注重稳定性和监控,因此它是这些优先事项的完美选择。


Javalin


Javalin是为那些想要极致简单性和没有"魔法"的开发者准备的微框架。

Javalin是SparkJava的代码继承者,SparkJava是JVM最早的开放源代码微框架之一。它专为简单性和灵活性而设计。与许多现代框架不同,Javalin力求不出现意见,更像一个库而不是框架。

因为Javalin专注于避免隐藏依赖(即"魔法")并在代码中明确描述一切,所以它不提供代码扫描功能。Javalin服务器往往非常简洁。与Dropwizard一样,Javalin嵌入了Jetty服务器,为您提供了一个以可靠性和性能著称的熟悉HTTP平台:


它也是一个支持Java和Kotlin的多语言框架。以下是一个用Kotlin编写的简单Hello World服务器端:
import io.javalin.Javalinfun main(){val app = Javalin.create(	/*config*/ )	.get("/") {	 	ctx ->ctx.result("Hello World"		)	}	.start(7070)}
以下是纯Java版本:
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


当启动的时间至关重要时,或者如果您想要一个多语言、全栈框架来构建微服务和无服务器应用程序,Micronaut是一个很好的选择。

它为你提供了一个AOT编译器,提供性能和无反射的依赖注入。它可以在JVM中运行,也可以使用GraalVM编译为原生映像。

Micronaut IoC(控制反转)容器的工作方式意味着所有依赖项都在编译期间解析。这意味着快速启动时间,这对微服务至关重要。

Micronaut的设计还意味着依赖注入的内存使用更低。Micronaut是多语言的,支持Java、Groovy和Kotlin,计划支持Scala语言。

Micronuat是为云设计的。它具有与Kubernetes等服务发现提供程序和Jaeger等跟踪的自动集成。这使您可以避免硬编码,并通过配置设计具有自动发现和跟踪的微服务。它还支持像Consul这样的分布式配置。


Micronaut具有内置的数据存储连接器和数据访问层支持。它还支持OpenAPI描述符。尽管功能先进,但Micronaut的节点代码却也简单易读:
import io.micronaut.http.annotation.Controller;import io.micronaut.http.annotation.Get;@Controller("/hello")public class HelloController {@Get("/{name}")public String hello (String name) {return "Hello, " + name;  }}

从名字上来看,Micronaut是微服务的理想选择,并且确实能让你在开发它们时尽可能轻松。它大概是Java最精细调整的微服务框架。


Helidon


如果你想坚持Java标准,为企业做好准备,Helidon值得考虑。Helidon既是本文介绍的最新的框架,也是Oracle的官方项目。

它从头开始设计用于虚拟线程和构建时依赖注入(类似于Micronaut)。它还最近添加了针对AI的功能。

Helidon有两种变体:

  • SE(标准版):用于构建函数式编程(FP)微服务的基础工具集合。专注于极小的占用空间和快速启动。从Helidon 4开始,它默认使用虚拟线程。
  • MP(MicroProfile):建立在SE之上,提供增值功能。添加了依赖注入和一些其他Jakarta EE组件,如JAX-RS和JSON-P。


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微框架都相当可靠,所以你不必被选择所压倒。你可以通过确定一两个似乎满足需求的框架开始,然后深入了解代码,选择感觉最好的那个。

这些框架的优点是它们都优先考虑开发者体验,由你决定哪种开发者体验最适合自己。

作者:洛逸

评论

我要赞赏作者

请扫描二维码,使用微信支付哦。