对服务器端 Java 认识的改变
2017 年,Java 服务器端出现了一个认知问题。随着向微服务和轻量级容器化运行时的转变,开发人员开始注意到传统 Java 应用程序的膨胀,它们被打包并部署到 Servlet 容器的共享 Java 虚拟机 (JVM) 上。Serverless 的出现进一步加剧了这种认知。
正是在这段时间,Object Computing 的一个团队开始重新思考如何从头开始设计 Java 框架。于是 Micronaut 框架诞生了,这是一个采用了不同做法的 Java 框架,它通过使用 Java 注释将框架的组装计算工作所转移到了编译阶段。这完全消除了传统 Java 框架使用的反射、运行时生成代理和复杂的动态类加载。
2018 年 4 月,Micronaut 框架首次公开发布,引发了 Java 社区巨大的思维变化,改变了人们对 Java“缓慢而臃肿”的看法。许多较新的项目也采取了类似的做法:将更多的逻辑转移到应用程序的构建和编译阶段,以此来优化应用程序的启动性能和消除反射。
构建编译时的好处很明显:在编译时计算更多的东西,那么在运行时就可以以最优的方式执行。消除了反射、动态类加载和运行时生成代理,为我们提供了进一步的下游优化机会,包括 JIT 和 (关键的是)GraalVM 的原生镜像工具。因为采用了这种方法,原生镜像不需要额外的配置信息就可以对 Micronaut 框架应用程序进行静态分析。
由于 Micronaut 框架和 GraalVM 之间存在这种协同作用,Micronaut 框架联合创始人 Graeme Rocher 加入了 Oracle Labs。Oracle Labs 不仅有 GraalVM,也为正在进行的 Micronaut 框架的开发做出了重大贡献。
Micronaut 框架介绍
人们对 Micronaut 框架的一个常见误解是,它是专为微服务设计的。事实上,Micronaut 框架也为一系列应用程序类型提供了一种极限模块化的架构!
Micronaut 框架实现了 JSR-330 依赖注入规范,并提供了许多附加的内置特性,是一个绝佳的基于注解编程模型的通用框架。它的特性包括:
-
配置注入;
-
AOP 编程概念,如拦截器;
-
内置了对云原生应用程序基本概念的支持,如验证、缓存、弹性重试、作业调度等。Micronaut 基于 Netty I/O 工具包构建了一个 HTTP 服务器和 HTTP 客户端。
用户已经用 Micronaut 框架来构建无服务器应用程序、命令行应用程序,甚至是 JavaFX 应用程序。
Micronaut 框架为广泛的模块生态系统提供了基础,Micronaut 可以帮助它们解决一系列问题。正是由于这种灵活性,Micronaut 框架在开发者当中得到了极大的普及。以下 Micronaut 的架构图:
基础层基于 Java Annotation Processing (APT),实现了编译时依赖注入,支持各种模块的构建,包括基于 Netty 的 HTTP 服务器。但它也涵盖了其他领域,如数据访问、安全性和 JSON 序列化。
为什么要用 Micronaut 框架?
Micronaut 框架的目标是完全消除框架中使用的 Java 反射、动态类加载和运行时生成的代理和字节码等特性,以此来提供传统 Java 框架的轻量级替代方案。
消除传统框架对这些特性的依赖对提高性能、内存消耗、安全性、健壮性、调试和测试的便捷性有着深远的影响。与其他解决方案不同的是,Micronaut 框架应用程序也可以在 JVM 中快速启动!
因为启动速度得到了极大改进,就没有必要再区分集成测试和单元测试代码,这极大缩短了从编码到测试之间的时间。在过去,我们常常因为应用程序启动太慢不得不减少集成测试。Micronaut 框架消除了这种情况,所以框架中没有包含大量 HTTP 层的模拟工具。其他的许多框架之所以提供大量的模拟工具,是为了降低启动应用程序的成本。
消除反射减少了堆栈跟踪信息的数量,而在传统框架中,堆栈跟踪信息通常非常繁杂。
Micronaut 框架还提供了将代码转换成构建时编译的机制和 API。Micronaut 框架直接与 Java 编译器集成,当注解使用不当时,它会生成编译错误,从而提高代码的类型安全性和整体开发者体验。
Micronaut 框架入门
本节将介绍如何使用 Micronaut 框架来构建云原生 Java 微服务。
使用 Micronaut 框架有几种不同的方法。你至少需要 Java SE 8 或更高版本的 JDK。如果要使用原生镜像特性,你需要 Java 11 或更高版本的 GraalVM JDK。
要创建一个 Micronaut 应用程序,你可以使用已经集成到 IDEÿ