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。可以继续钻研。

尝试官方的第一个SpringNative 0.11程序(WSL2)的更多相关文章

  1. solaris X86-64下一个ORACLE战斗11.2.0.3.8在一波折叠补丁

    solaris X86-64下一个ORACLE战斗11.2.0.3.8补丁: 正确的步骤: 1.BUG6880880 .OPATCH补丁 2.BUG16902043.11.2.0.3.8补丁 情感是练 ...

  2. Kafka 0.11.0.0 实现 producer的Exactly-once 语义(官方DEMO)

    <dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka-clients&l ...

  3. Tomcat8.0.11优化相关

    Tomcat 8.0.X: 要了解tomcat的优化,我们先看看Tomcat的官方定义:The Apache Tomcat® software is an open source implementa ...

  4. Redis-4.0.11集群配置

    版本:redis-3.0.5 redis-3.2.0  redis-3.2.9  redis-4.0.11 参考:http://redis.io/topics/cluster-tutorial. 集群 ...

  5. Mysql8.0.11简介,新特性

    MySQL 8.0 正式版 8.0.11 已发布,官方表示 MySQL 8 要比 MySQL 5.7 快 2 倍,还带来了大量的改进和更快的性能! 注意:从 MySQL 5.7 升级到 MySQL 8 ...

  6. MySQL-mysql 8.0.11安装教程 windows

    网上的教程有很多,基本上大同小异.但是安装软件有时就可能因为一个细节安装失败.我也是综合了很多个教程才安装好的,所以本教程可能也不是普遍适合的. 安装环境:win7 1.下载zip安装包: MySQL ...

  7. 微信小程序0.11.122100版本新功能解析

    微信小程序0.11.122100版本新功能解析   新版本就不再吐槽了,整的自己跟个愤青似的.人老了,喷不动了,把机会留给年轻人吧.下午随着新版本开放,微信居然破天荒的开放了开发者论坛.我很是担心官方 ...

  8. Kafka 0.11.0.0 实现 producer的Exactly-once 语义(中文)

    很高兴地告诉大家,具备新的里程碑意义的功能的Kafka 0.11.x版本(对应 Confluent Platform 3.3)已经release,该版本引入了exactly-once语义,本文阐述的内 ...

  9. MySQL 8.0.11安装配置

    官网地址:https://dev.mysql.com/downloads/mysql/ 我这里是RHEL6.5的系统,因此选择RedHat 6 x86,64bit操作系统---下载第一个RPM Bun ...

  10. MySQL8.0.11 组复制配置

     my.cnf [mysql] prompt='node2 [\h] {\u} (\d) > ' # [client] user = sa password = cc.123 port = 22 ...

随机推荐

  1. blazor优雅的方式导入组件相关的js脚本

    基本的组件导入方式为: 1 await JsRuntime.InvokeVoidAsync("import", $"XXXXX.js"); 优雅的组件导入方式: ...

  2. Swift中的nil

    Swift中的nil和OC中的nil不一样.OC中的nil表示不存在的对象,你无法给NSInteger类型的变量赋值nil,但是Swift中的nil表示不存在,可以给任何Optional的变量或者常量 ...

  3. SQL Server 数据库分析操作程序时SQL语句等待或执行时间较长(死锁)

    大型程序,总会遇到程序操作端卡顿或者直接遇到死锁,死锁是数据库设计的缺陷,虽不能完全避免死锁的出现,但一旦出现死锁我们要进行及时分析死锁语句,找出原因,进行SQL语句或程序的优化,避免再次出现同样的问 ...

  4. StarCoder2-Instruct: 完全透明和可自我对齐的代码生成

    指令微调 是一种技术,它能让大语言模型 (LLMs) 更好地理解和遵循人类的指令.但是,在编程任务中,大多数模型的微调都是基于人类编写的指令 (这需要很高的成本) 或者是由大型专有 LLMs 生成的指 ...

  5. kubernetes之python调用

    安装 sudo pip3 install kubernetes 认证 首先引入SDK支持库.然后将 ~/.kube 的config文件的内容复制到本地目录,保存为文件kubeconfig.yaml,然 ...

  6. centos7下xfs文件系统的备份和恢复:完全备份,增量备份,差异备份

    目录 一.关于xfs文件系统 二.xfsdump的备份级别和注意事项 三.完全备份整个目录/分区,然后恢复数据 四.完全备份分区中某个目录,然后恢复某个文件/文件夹 五.增量备份 一.关于xfs文件系 ...

  7. vue4 项目的创建

    1,安装vue cli 脚手架,是全局安装npm install -g @vue/cli 可以在输出信息中看到安装位置,例如:C:\Users\xiaochangjian\AppData\Roamin ...

  8. OC的引用计数

    一.引用计数 引用计数是Objetive-C语言的内存管理机制,用于管理OC对象(通常指包含isa指针的结构体)的内存. 一个对象的引用计数为大于0的计数,表示这个对象被持有,不能被释放,当引用计数为 ...

  9. Unity 3D 的NEW (堆内存)

    用容器装 在AWEKE NEW 运行时NEW 会导致分配内存时界面卡住, new class 的时候 才刷新程序帧 AWEKE 是程序启动时还没走完第一帧的开头执行 AWEKE 里面的代码 常量也在A ...

  10. log4net info 方法 根据不同业务创建不同的文件名

    log4net info 方法 根据不同业务创建不同的文件名 <configuration> <!-- ... 其他配置 ... --> <configSections& ...