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 原生编译的生态型框架了。且是,国产的。

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

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


相關推薦

2023-11-03

trino-proxy (Solon Native 里程碑意义!)。让我们对 Java 原生编译又起了新的希冀。总体来说: 适配调整完后,代码变化不太大 整个过程是很麻烦的。因为社区版不能调试,只能不断试(发现缺什么,就补什么配置) Sol

2023-05-04

an demo(...) 对注入的检测及非必须注入的支持 增加 okhttp 原生编译支持配置 增加 solon.scheduling.quartz 原生编译支持配置 增加 water-solon-cloud-plugin 原生编译支持配置 增加 solon.aot 功能总体上实现(细节优需优化) 增加 VarGater:

2024-05-08

s 插件(支持 ?a.b=1 prop 风格的参数) 添加 solon.boot.jetty 原生编译支持 添加 solon.boot.undertow 原生编译支持 添加 solon 对 classpath*: 表达式支持(兼容旧的习惯) 添加 solon Utils:pid 方法(方便获取进程号) 添加 solon.dat

2023-06-07

Doc 调整 mybatis-solon-plugin 插件,增加 aot 处理适配(支持原生编译了) 调整 mybaits-solon-plugin 插件,添加 configuration.mapperVerifyEnabled 配置(控制是否启用 mapper 校验) 调整 mybatis 适配增加 isMapper 检测接口 调整 开放 bean 内部

2023-10-26

Solon::cfg() 多配置加载的校验机制 优化 solon.logging.logback 原生编译元信息配置 优化 运行时退出勾子的处理,非 aot 情况下强制退出 调整 sockted.session::sendHeartbeatAuto 更名为 startHeartbeatAuto (内部接口) 调整 @Init 的弃用提示(

2023-11-18

2021年起头的二级项目) Solon 估计是国内唯搞 AOT 和 Java 原生编译的。或许,这块的友商只能是 Micronaut、Quarkus 和 Spring Native。 (2)99% 换血重构了: Socket.D 通讯应用协议 (它是 Solon 的二级项目,已孵化两年) 它是一

2024-03-21

验: 服务包更小,CI/DI 更快:打包缩到 1/2 ~ 1/10 云原生更友好(镜像拉取快,容器就绪快):打包缩到 1/2 ~ 1/10,启动快 5 ~ 10 倍 更自由的运行时兼容选择: 同时支持 java8、java11、java17、java21 的运行时 入门探索视

2024-10-31

ring、Solon、slf4j 等框架都有用到,不同的是有的使用 Java 原生的实现,有的框架则自己实现了一套 SPI 机制. 二、Spring SPI Spring 中的 SPI 相比于 JDK 原生的,它的功能更强大些,它可以替换的类型不仅仅局限于接口/抽象类,它可

2023-09-08

就干了这个 增加响应式支持。//v2.3.x 时完成了 增加AOT编译便利支持(用于打包 graalvm native image)。//v2.3.x 时完成了。特别感谢“馒头虫”、“读钓” 最近的 v2.5 中段版本更新,做了两个大胆了尝试: 启用新的上下文类

2024-10-09

真检查; 移除的事件,要认真检查; 弃用接口移除等编译时会出错提醒,问题不大。 新增或重构插件有: solon-data-sqlutils(编译大小为 10Kb 的小工具) solon-web-webservices solon-net-stomp nami-channel-http(用于替代 nami-channe

2023-09-22

发 30 岁就要被干掉? 本次更新的一个重点:完成 JDK21 编译测试和功能单元测试。 JDK 21 虚拟线程? 在IO密集型项目中,效果很猛!有一种:天哪天哪天哪。。。的感觉 @SolonMain public class App { public static void main(String[] args) {

2023-01-17

学家,完成了 Java 的原始设计,并实现了 Java 最初版本的编译器和虚拟机,也是公认的 “Java 之父”。 Gosling 现在是 AWS 的工程师,在 12 月初的 reClojure 2022 线上会议中发表了主题演讲。他分享了在技术行业工作数十年的

2022-05-26

相对于 Spring Boot 和 Spring Cloud 的项目 启动快 5 ~ 10 倍 qps 高 2~ 3 倍 运行时内存节省 1/3 ~ 1/2 打包可以缩小到 1/2 ~ 1/10(比如,90Mb 的变成了 9Mb) 基于 app.name 进行注册发现 与 k8s svc 相互对应 支持 Service Mesh 架构部署

2024-09-25

”。七年时间,我们不断变强!越来越强!还会更强! Solon 框架! Java “新式”应用开发框架。开放原子开源基金会,孵化项目。从零开始构建(非 java-ee 架构),有灵活的接口规范与开放生态。 追求: 更快、更小、更简