70

Micronaut for Spring 支持 Spring Boot 应用以 Micronaut 形式运行

 5 years ago
source link: https://www.infoq.cn/article/WDj9keWydbYI_C9SZTEC?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Micronaut 1.0.1 小版本发布的同时,Object Computing, Inc.(OCI)还发布了 Micronaut for Spring 1.0 M1 。在 发布说明 中这样写到:

Micronaut for Spring 添加了对 Spring 基于注解的编程模型的支持,这种模型已经有很长时间的历史了,这样所构建的 Micronaut 应用和库能够与 Micronaut 和 Spring 协作。

Micronaut for Spring 采用预先编译的方式,能够实现如下功能:将 Spring 组件集成到 Micronaut 应用中;将 Spring 应用运行为 Micronaut 应用;将 Micronaut bean 暴露给 Spring 应用。

Jonathan Giles 是微软的软件工程师,最近 讨论了开发人员为何应该考虑迁移至 Micronaut

在 Spring Boot 和 MicroProfile 中开发人员认为理所应当的事情,Micronaut 却采用了一种与众不同的方式来实现。Micronaut 没有像 Spring Boot 和 MicroProfile 那样进行运行时的注解处理,而是使用了编译时的注解处理器,除了你自己的代码以外,这些处理器会编译生成额外的类。这意味着启动时间会大幅减低,因为它减少了扫描项目 classpath 所需要的开销。实际上,Micronaut 会尽可能避免使用反射,只有在绝对必要的时候才会使用。

Micronaut 之前被称为 Particle 项目,它是一个全栈的基于 JVM 的框架,用于创建基于微服务的、云原生的、serverless 应用,可以使用 Java、Groovy 和 Kotlin 编写。 Graeme Rocher 是 OCI 的首席软件工程师、Grails 和 Micronaut 产品的负责人,他在 2018 年 3 月的 Greach 会议上首次介绍了 Micronaut在实现 1.0 版本的过程中 ,Micronaut 经历了三个候选版本,这些版本之间的间隔时间都不超过三周,在此之后的 2018 年 10 月底, 1.0 的正式版本发布

样例应用

Micronaut for Spring 仓库 中包含了一个 样例应用 ,该样例阐述了如何使用 Micronaut for Spring,同时包含了将应用转换为 GraalVM 原生镜像的工具。

Application.java文件如下所示,在源码层面它来源于一个 Spring Boot 应用,但是可以作为 Micronaut 应用运行:

复制代码

@SpringBootApplicationpublicclassApplication{publicstaticvoidmain(String... args) { Micronaut.run(Application.class);// SpringApplication.run(Application.class); }

Spring Boot 应用和 Micronaut 应用的唯一差异在第 5 行。第 6 行在这里注释掉了,只是用来进行对比,如果是 Spring Boot 应用的话,就会使用这一行的代码了。

命令:

复制代码

./gradlewbootRun

将会构建和初始 Micronaut 服务器,如果执行下面的命令:

复制代码

curl -X GEThttp://localhost:8080/greeting?name=Mike

将会返回:

复制代码

{"id":1,"content":"Hola, Mike!"}

GraalVM

现在,我们可以在 GraalVM 上运行 Spring 应用,它已经完全兼容 Spring 基于注解的编程模型。通过 Micronaut for Spring,样例应用可以转换为 GraalVM 原生镜像。

如下的两条命令会开始这样的转换过程:

复制代码

./gradlew assemblejava -cp build/libs/greeting-service-all.jario.micronaut.graal.reflect.GraalClassLoadingAnalyzer

Micronaut 的 GraalClassLoadingAnalyzer 类会用来分析 Micronaut 应用的类加载需求。

GraalVM Java 分发版本包括了 native-image 工具,它能够构建应用的原生镜像。在调用 native-image 的时候,有很多可配置参数,如下面的列表所示:

复制代码

native-image --no-server \ --allow-incomplete-classpath \ --class-path build/libs/greeting-service-all.jar \ -H:ReflectionConfigurationFiles=build/reflect.json \ -H:EnableURLProtocols=http \ -H:Name=greeting-service \ -H:Class=greeting.example.Application \

在样例应用中,包含了一个便利的 shell 脚本 build-native-image.sh ,借助该脚本,能够自动化这个过程。生成的原生镜像可执行文件 greeting-service 可以通过如下的方式进行调用以启动服务器:

复制代码

./greeting-service

原生镜像应用就是为了快速启动而设计的,它的初始化时间只有 42 毫秒:

IneAbai.png!web


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK