Java 原生编译的 Solon 回忆录

最近和@雨韵诗泽@读钓两个小伙伴一起(主要是他们两在出力),适配了 Solon Native 的第一个开源项目:dromara/neutrino-proxy (里程碑案例啊!有点修行大成的味道了!)。总体来说:

  • 适配调整完后,代码变化不太大
  • 整个过程是很麻烦的。因为 graalvm native image 社区版不能调试,只能不断试(发现缺什么,就补什么配置)

1、缘起

2021 年的深秋,有个叫 @馒头虫 的男人。跑过来讲,他有个项目需求是(给一个美国大厂做的):存放空间只有 100M,内存只有 100M,在硬件里运行一个管理界面系统。他研究了 spring native,因为它的基础就太大没过;研究了 go,做复杂的界面系统不好预期没过。所以选择尝试 solon。

于是他种下了一颗 solon native 的种子。开始浇水、施肥。前后一两个月的时间,真的也开花了(最后好像只有 53m 大小)。这365万字省去,他怎么不哭呢?

这个男人总结出了三条经验:

  • 所有的反射需要提前登记(放到特定的配置文件里),并通过配置获取反射导引(比如一个类有哪些字段,哪些方法)
  • 所有的资源文件获取需要提前登记(放到特定的配置文件里)
  • 所有的动态编译、类字节码,不能用

说起来,Solon 框架 真的是好啊(按那男人的讲法:小是真的小,快是真的快):

  • 启动快 5 ~ 10 倍;
  • qps 高 2~ 3 倍;
  • 运行时内存节省 1/3 ~ 1/2;
  • 打包可以缩到 1/2 ~ 1/10;

2、认识 APT

后面很长的时间,我没再碰它(主要是无知,无从下手。懵!)。偶然的一天,路过 mybatis-plus 4.x 项目仓库,看到 APT 这几个字眼。我对 java 确实是无知,百度后才知道神器 lombok 就是基于 APT 实现的。然后,我想起了那个男人总结的三条经验:

  • 所有的反射需要提前登记
  • 所有的资源文件获取需要提前登记
  • 所有的动态编译、类字节码,不能用

是不是可以借助 APT,去提前生成类的代理代码,去完成资源文件、反射的登记?我估计是行的。

2023年的初春,花了一周时间,把类的代理用 APT 在编译时生成了。开心是开心的。但是,怎样获取需要代理的类,成了一个不解的题。路很长。然后,暂时没有然后了!

3、认识 AOT

好多年前就听过 AOT,大概知道它是干嘛的。但是,还是一脸懵。

2023年的春后,有个叫 @李总 的男人。他说,我有个项目想要用 solon 的原生编译,而且可以叫个人帮忙搞。最后出现的男人叫 @读钓,不知道是 @李总 忽悠过来的,还是我把他忽悠过来的(后来,据他说是自己跑来的)。他说,我们应该A,B,C...这么这么搞!

还有个加强版的 AOT。原来如此,原来如此:

  • 在编译后 -> 运行项目并获取运行中的信息 -> 然后完成各种预编译和登记 -> 再进行原生编译
  • 一气呵成

这个男人从春天搞到了夏天。成了!(当中略过365万字...),一直搞,不知道有没有洗过澡, 有没有换过衣服。

4、我们发布第一个 Solon Native 版本

2023年的夏天,有个新男人来。说是要用 Solon Native。我心里其实没底,原生这东西太难用了。必须得忍住不哭才行。后来他招乎也没打,跑了。

真的是太难用了:

  • 目前没有哪个框架是开箱即用的(Spring Native 和 Quarkus 也一样)
  • 框架不一定把生态内的所有包都适配好了
  • 第三方的包,框架没法照顾到。只能自己试着做些补充登记(没法调试,只能尝试或实验)
  • 随便升级某个第三方包,就可能不兼容了(需要重新适配)

5、你信轮回?

2023年的深秋,又是一个深秋。男人 @雨韵诗泽,说想把他的 dromara/neutrino-proxy 开源项目搞成原生编译的。我说,那得忍住不哭才行。他说,他不会哭(其实,他动得不多。哈哈)。@读钓又开始忙了。

说起来,@读钓 是从春天干到了秋天。终于成了:《Solon v2.5.12 发布,Java 原生编译再起》。我们也是正经的支持 Java 原生编译的生态型框架了。且是,国产的。

开源,让很多人的愿望和努力汇聚一处,也记录了共同的回忆。

人生路,且短且长,只怪情深缘浅,你信轮回?

相关推荐
天天扭码18 分钟前
五天SpringCloud计划——DAY2之单体架构和微服务架构的选择和转换原则
java·spring cloud·微服务·架构
程序猿进阶19 分钟前
堆外内存泄露排查经历
java·jvm·后端·面试·性能优化·oom·内存泄露
FIN技术铺23 分钟前
Spring Boot框架Starter组件整理
java·spring boot·后端
小曲程序31 分钟前
vue3 封装request请求
java·前端·typescript·vue
陈王卜1 小时前
django+boostrap实现发布博客权限控制
java·前端·django
小码的头发丝、1 小时前
Spring Boot 注解
java·spring boot
java亮小白19971 小时前
Spring循环依赖如何解决的?
java·后端·spring
飞滕人生TYF1 小时前
java Queue 详解
java·队列
武子康1 小时前
大数据-230 离线数仓 - ODS层的构建 Hive处理 UDF 与 SerDe 处理 与 当前总结
java·大数据·数据仓库·hive·hadoop·sql·hdfs
武子康1 小时前
大数据-231 离线数仓 - DWS 层、ADS 层的创建 Hive 执行脚本
java·大数据·数据仓库·hive·hadoop·mysql