尝试使用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
广告
将在 10 秒后关闭
bannerAds