本文最后更新于 10 个月前,文中所描述的信息可能已发生改变。
Quarkus 是一个专为 GraalVM 和 OpenJDK HotSpot 量身打造的全栈、Kubernetes 原生 Java 框架。它旨在通过优化 Java 应用程序的内存占用和启动时间,使其更适合云原生环境和容器化部署。
Quarkus 的核心特性
- 快速启动时间:Quarkus 通过静态分析和编译时优化,大幅减少了应用程序的启动时间,使其非常适合无服务器计算和容器化环境。
- 低内存占用:Quarkus 优化了内存使用,使得 Java 应用程序在资源受限的环境中也能高效运行。
- GraalVM 原生映像支持:Quarkus 可以将应用 程序编译为 GraalVM 原生映像,进一步提升启动速度和降低内存占用。
- 开发者友好:Quarkus 提供了热重载功能,使开发者能够在代码更改后立即看到效果,极大地提高了开发效率
- 丰富的扩展生态系统:Quarkus 提供了大量的扩展,支持各种流行的库和框架,如 Hibernate, RESTEasy, Vert.x, Kafka 等,方便开发者集成所需功能。
- 响应式编程支持:Quarkus 支持响应式编程模型,允许开发者构建高度可伸缩和高性能的应用程序。
云原生
指构建和运行应用以充分利用通过云技术交付模式交付的分布式计算。云原生应用旨在充分利用云技术平台特有的可扩展性、弹性和灵活性优势。
GraalVM(格劳尔虚拟机)
是一种通用的虚拟机,它支持多种编程语言,包括Java、JavaScript、Python、Ruby、R、WebAssembly等。GraalVM的目标是提供高性能、低内存消耗的运行环境,以支持各种语言和应用的混合使用。 多语言支持: GraalVM 不仅支持Java,还支持众多其他编程语言。这意味着你可以在同一个运行时环境中运行不同语言的代码,并且它们可以互相调用。
高性能: GraalVM 的即时编译器(JIT)具有出色的性能,使得它成为一种在各种应用中提供高吞吐量和低延迟的虚拟机。
原生图像构建: GraalVM 支持将Java应用程序编译成本地机器码,从而减少了启动时间和内存占用。这对于云原生和微服务应用程序特别有用。
JavaScript支持: GraalVM 包括JavaScript引擎,使得你可以在Java应用中嵌入JavaScript代码,或者使用JavaScript编写服务器端应用。
WebAssembly支持: GraalVM 支持WebAssembly,这是一种用于在浏览器和服务器上运行低级代码的技术。这意味着你可以在GraalVM中运行WebAssembly模块。
扩展性: GraalVM 的架构支持轻松扩展,允许添加新的语言运行时或优化编译器。
开源社区: GraalVM 是一个开源项目,拥有活跃的社区支持,你可以在GitHub上找到它的源代码和相关资源。
适用场景: GraalVM 在云计算、服务器端应用、嵌入式系统和数据科学等领域都有广泛的应用。
GraalVM 是一种强大的多语言虚拟机,可以在各种场景中提供高性能和灵活性。
指令式与响应式
线程的问题
- 在传统的指令式方法中,框架分配一个线程来处理请求。因此,请求的整个处理都运行在这个工作线程上。这个模型的扩展性不太好。事实上,要处理多个并发请求,你需要多个线程。因此,应用程序的并发性受到线程数量的限制。此外,只要您的代码与远程服务交互,这些线程就会被阻塞。因此,这会导致资源的低效使用,因为您可能需要更多的线程,而每个线程在映射到OS线程时,在内存和CPU方面都有成本。
- 响应式模型依赖于非阻塞 I/O和不同的执行模型。非阻塞I/O提供了一种处理并发I/O的有效方法。最小数量的线程称为I/O线程,可以处理许多并发I/O。使用这样的模型,请求处理不会委托给工作线程,而是直接使用这些I/O线程。它节省了内存和CPU,因为不需要创建工作线程来处理请求。它还改善了并发性,因为它消除了对线程数量的限制。最后,它还改善了响应时间,因为它减少了线程开关的数量。
NOTE:
自JDK 19起,Java引入了虚拟线程(Virtual Threads),这是一种轻量级的线程实现,旨在简化并发编程。虚拟线程与传统的操作系统线程不同,它们由JVM管理,而不是直接映射到操作系统线程,M:N的关系,类似于GO的Goroutine,线程开销更小、更轻量。 这使得创建和管理大量并发任务变得更加高效和简单。 响应式编程由于其非阻塞和事件驱动的特性,仍然在某些高并发场景下具有优势,尤其是在处理大量I/O操作时(实际开发中也没使用,哈哈)。 然而,虚拟线程的引入使得传统的阻塞式编程模型在许多情况下变得更加可行和高效。 因此,选择使用响应式编程还是虚拟线程,取决于具体的应用需求和场景。(大概率未来会越来越少使用响应式编程,但目前各种库貌似也还尚未支持VT)