Spring Native是Spring推出微服务体系Spring Cloud之后的又一大举动,从名字可以猜出,Spring Native是一门面向云原生的技术。如果你还对这个概念不太理解,可以多看一点东西,比如Oracle的GraalVM、红帽的quarkus等。
现在 我们跟着官方示例 Spring Native Docs 一起来跑一下最简单的SN程序。
官方提供了两种方式来构建本地镜像,第一种是基于Docker容器的,我试了好几天也没成功,执行到mvn spring-boot:build-image
就失败了,说有“No valid dependencies”。所以这里演示第二种,直接生成可执行文件,这种我成功了。
前奏
使用第二种方法不需要Docker,所以可以关掉了,但是需要调大内存(第一种应该也需要)。
1. 提升可用内存
因为我用的是WSL,所以就是提高它的内存。打开C盘下用户目录的.wslconfig
(没有就创建一个)
将其中的memory改成16G,这是我电脑的全部内存大小。如果你电脑内存不够16G,是多少全分给WSL;如果超过了16G,写16G也够,随你。
2. 设置代理
这个过程会依赖GITHUB等一些网站,如果不能外窥
,就会总是失败。我尝试了各种网上的代理方法,就算配置成功也不能成功通信,最后还是使用了付费软件。
如果你有自己的SOCKS服务器那说明你会成功的。如果没有,我这边用的是大熊猫,你可以试试,不算太贵,还算稳定,主要是不限流量
找到Linux版本下载下来是一个appimage文件,执行它就打开了登录窗口。还好现在WSL支持图形界面了,不然还是用不了。
准备
接下来按照官方指导,安装GraalVM并下载代码。
1. 安装SKDMAN
在WSL中执行curl -s "https://get.sdkman.io" | bash
即可(这一步不需要能够外窥)。
执行成功后,可以执行sdk list java
看看正常不。
2. 安装GraalVM
官方安装的版本是11,我们这里使用17.
哦对了,SpringNative 0.11虽然支持Java8,但是后续正式版估计只支持17+,所以这里我也用17。没尝试Java8,有兴趣可以自己试一下。正常GraalVM是不支持java8的,可能需要协调
执行 sdk install java 21.3.0.r17-grl
,这个过程需要外窥,所以打开代理。我也折腾了半天才提示成功。
成功后执行sdk use java 21.3.0.r17-grl
(可以通过tab补全),然后重启命令行才行,不用重启WSL。这个也折腾了好久,后来看到github上有人报issue才解决。
可以通过sdk current
查看结果:
另外需要将本地镜像扩展native-image
引入JDK,执行gu install native-image
。如果说gu
这个命令找不到,可以去GraalVM的bin目录寻找,在WSL的~/.sdkman/candidates/java/21.3.0.r17-grl/bin
下面,不过它是一个链接:
3. 配置maven依赖
根据 Sample Project Setup 修改pom.xml
。这一整节的内容都要完整修改(除了Test部分可以不改)。
构建
在complete目录执行 mvn -Pnative -DskipTests package
即可,这个过程有点长,而且非常占用内存,大约7个G。打包结束后会立即释放内存的,相当于给你电脑进行了一次清理:)
执行
在target目录下已经打好可执行文件了:
运行这个文件即可。由于是原生应用,启动应该贼快,这也是构建原生应用的目的之一。然后访问 localhost:8080/greeting
最后
目前云原生概念和技术都在高速发展,Java领域的就主要集中在Graal上面,SN和quarkus也都基于GraalVM。可以继续钻研。