springboot-native编译实践
springboot-native编译实践前言编译JDK9之后获取纳秒的问题参考资料前言在云原生时代,java似乎显得很臃肿,动辄几百兆的JDK和较慢的启动速度限制了在云上的拓展能力,而且java流行的重要特性“一次编写,到处运行”也在随着容器化的技术而变得不那么重要;很明显java也随之与时俱进,积极朝着云原生的方向改进。比如JDK16支持musl libc可以在AlpineLinux安装,减小
springboot-native编译实践
前言
在云原生时代,java似乎显得很臃肿,动辄几百兆的JDK和较慢的启动速度限制了在云上的拓展能力,而且java流行的重要特性“一次编写,到处运行”也在随着容器化的技术而变得不那么重要;很明显java也随之与时俱进,积极朝着云原生的方向改进。比如JDK16支持musl libc可以在AlpineLinux安装,减小镜像的体积。最重要的更新当属于GraalVM,可以直接将java代码编译成本地的机器码,运行时不需要JAVA环境,可以大大缩小镜像的体积,也可以减小java程序的启动时间。
当前新一代的面向云原生的java框架Quarkus已经发布了多个版本,自然Sping框架也不能落后,发布了beat版本,具体链接https://spring.io/blog/2021/03/11/announcing-spring-native-beta。
Windows下编译
在spring官网下载Spring Native的demo了,导入idea中。按照官方的教程https://docs.spring.io/spring-native/docs/current/reference/htmlsingle/#overview操作。
环境准备
- maven版本要3.5以上。
- 下载对应的GraalVM版本。这里选择windows的版本。
- 下载vs社区版。
- 工作负载只需要选择C++的桌面应用
- 语言包选择英文,这一点尤为重要,否则后面会报错。
- 安装完成后,还需要配置一些环境变量,具体参考https://blog.csdn.net/q412086027/article/details/113878426。
使用官网下载的demo,简单写一个Restful接口。
package com.example.nativedemo.controller;
/**
* @author xiaolong7713
*/
@Slf4j
@RequestMapping("/student")
@RestController
public class DemoController {
@GetMapping("")
public List<Student> info() {
return List.of(Student.builder().name("张三").age("18").build());
}
@Data
@Builder
static class Student {
private String name;
private String age;
}
}
需要先执行spring-aot:generate
生成spring-aot的辅助框架,其次才能运行Main程序(Quarkus不需要提前生成框架,通过命令直接运行了程序,似乎调试又变得麻烦了)。
启动时间约为2秒左右。
打包成本地代码,mvn -Pnative-image package,最后在target目录会有个exe的文件
点击可以直接运行。
启动很快,毫秒级的。测试接口也正常返回。
Linux下编译
linux下编译的环境准备
- maven版本要3.5以上,需要配置环境变量。
- 下载对应的GraalVM版本。这里选择linux版本,同样需要配置环境变量。
- 安装
yum install zlib-devel
,否则会出现/usr/bin/ld: cannot find -lz 解决错误。
linux版本为VMware虚拟机,CentOS Linux release 7.8.2003 (Core),配置为4核-4G。
在源码目录下执行,mvn -Pnative-image package,最后在target目录会有个全路径的文件,可运行
运行./com.example.nativedemo.nativedemoapplication
启动时间更快,基本上是立即响应。调用接口返回正常。
打包成docker镜像
springboot-native也提供了打包成镜像的方式,按照教程上操作了没有成功,文档上写的比较简洁,出错了不好排查问题。对此Quarkus提供的demo里包含了打包成镜像的dockerfile文件,更加友好。当然springboo-native打包成镜像,可以自己对照着Linux的编译方式准备一套编译环境,再构建镜像。
后续
下一次继续研究集成数据库和其他中间件的使用,按照官网介绍的一些基于字节码操作的工具应该是不能使用的,也一起测试下。
参考资料
- https://quarkus.io/get-started/
- https://spring.io/blog/2021/03/11/announcing-spring-native-beta
- https://www.infoq.cn/article/RQfWw2R2ZpYQiOlc1WBE
- https://www.infoq.cn/article/fZjvu3iHc96Lm3puRlmk?utm_source=infoq&utm_medium=con&utm_campaign=talc&utm_term=quarkus
- https://blog.csdn.net/q412086027/article/details/113878426
- https://docs.spring.io/spring-native/docs/current/reference/htmlsingle/#overview
- https://www.cnblogs.com/dehai/p/14258391.html
更多推荐
所有评论(0)