尝试使用Micronaut for Spring将Spring Boot应用程序转化为native-image
首先
我想尽可能地加速Spring Boot的启动速度,所以我试了试使用Micronaut for Spring,以下是我的结果。如果有任何错误,请指出,谢谢。
结果 (jié guǒ)
现在对于将Spring Boot应用程序进行native-image化来说还为时过早,但是我能看到未来可能会实现的梦想。
这些资源全部来自于下述存储库的micronaut-maven分支。而micronaut-gradle则是专为gradle而设。
https://github.com/h-r-k-matsumoto/spring-boot-sample
进行了调查
Spring Framework 5.1:支持Graal原生映像
在5.1版本的wiki中,Spring Framework如下所述。
支持Graal本地镜像的限制(反射、参数名称)。
也许我以为即使什么都不做也能创建原生图像?但实际上不行。
根据https://jira.spring.io/browse/SPR-16991 上所述,可能需要在GraalVM上进行相应的处理,然后再进行Spring Framework方面的支持。
然而,如果将DI的设置写入app.json之类的文件,或许可以工作。
Micronaut适用于Spring
请提供以下内容的中文版本:
https://github.com/micronaut-projects/micronaut-spring
https://micronaut-projects.github.io/micronaut-spring/latest/guide/index.html
简单来说,就是可以将Spring应用程序作为Micronaut应用程序来运行!
哦?这是否意味着可以顺利进行从Spring Boot迁移到Micronaut的考虑呢!?
我尝试了一下。
使用Micronaut for Spring来修改现有的Spring Boot应用程序。
我使用了之前创建的一个简单的Spring Boot应用程序。
修改
添加依赖关系。
需添加与Micronaut、Micronaut-for-Spring和GraalVM相关的库。
详情请查看以下链接:
https://github.com/h-r-k-matsumoto/spring-boot-sample/blob/micronaut-maven/pom.xml#L46-L105
改变fatJar的制作方式
使用spring-boot-maven-plugin创建的fatJar不被支持。
事实上,它只能以org.springframework.boot.loader.JarLauncher的格式进行加载,因此需要将其转换为通常的jar格式。
使用maven-shade-plugin,将所有的类打包成简单的jar格式。
之所以进行排除,是因为像在gradle中的compileOnly一样,不存在compileOnly,因此在将依赖添加到编译时排除掉,并将其打包进jar中。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<artifactSet>
<excludes>
<exclude>com.oracle.substratevm:*</exclude>
<exclude>org.graalvm.truffle:*</exclude>
<exclude>org.graalvm.sdk:*</exclude>
<exclude>org.graalvm.compiler:*</exclude>
</excludes>
</artifactSet>
</configuration>
</execution>
</executions>
</plugin>
添加 AnnotationProcessor
启用在编译时自主解析注解的扩展功能。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<compilerArgs>
<arg>-parameters</arg>
</compilerArgs>
<annotationProcessorPaths>
<path>
<groupId>io.micronaut</groupId>
<artifactId>micronaut-inject-java</artifactId>
<version>${micronaut.version}</version>
</path>
<path>
<groupId>io.micronaut.spring</groupId>
<artifactId>micronaut-spring-boot-annotation</artifactId>
<version>${micronaut.spring.version}</version>
</path>
<path>
<groupId>io.micronaut.spring</groupId>
<artifactId>micronaut-spring-web-annotation</artifactId>
<version>${micronaut.spring.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
启动应用程序
需要将应用程序的启动方法从org.springframework.boot.SpringApplication#run更改为Micronaut#run,如下所示。
Micronaut.run(SpringBootSampleApplication.class, args);
在Substrate VM(AOT)中的每个设置
这里是关于如何原生编译的定义,但并没有详细查看。
这些是有关netty和日志记录相关的设置,暂时只是从示例中复制粘贴过来的。
建立和运行
请使用以下命令构建docker镜像。
$ docker build . -t spring-boot-sample:native-maven
进行。
$ docker run -it --rm -p 8080:8080 spring-boot-sample:native-maven
15:28:54.834 [main] INFO io.micronaut.runtime.Micronaut - Startup completed in 23ms. Server Running: http://34f44eb544a3:8080
我会确认它是否在运动。
$ curl localhost:8080/sample/hello
hello.% $
结果 – jié guǒ
获得的东西 (huò dé de
- native-imageによる高速 (~30ms) な起動。
丧失的东西
actuator が動かない。Micronaut.run に変えて application.yamlから設定を読み込んでくれていない。よってhealth checkができずにkubernetesで動かせなかった。いや、path変えればいいんだけども。。。
spring.profiles.active など実行時のプロファイル切り替えができない。
补充事项
以下是支持的注释和不支持的注释。例如,似乎不支持@JsonComponent等注释。
希望未来吧!如果能够将其转换为Micronaut的源代码,那就太高兴了。
请参考
-
- https://github.com/micronaut-projects/micronaut-spring
- https://github.com/micronaut-projects/micronaut-spring/tree/graal-native-image/examples/greeting-service