quarkus初探(1)--环境配置
基本概念
quarkus是啥
Quarkus是一个集成了k8s的开源云原生框架,用于创建适配GraalVM和OPenJDK HotSpot的k8s原生引用。这里出现了两个新的名词:GraalVM和Open JDK HotSpot,让我们先看一下这两个东西:
HotSpot
一句话概括:指HotSpot VM,是Sun JDK和OpenJDK中自带的虚拟机,其因为使用了热点代码探测技术,所以起了这个名字。
详细介绍
提起HotSpot VM,相信所有Java程序员都知道,它是Sun JDK和OpenJDK中所带的虚拟机,也是目前使用范围最广的Java虚拟机。 但不一定所有人都知道的是,这个目前看起来“血统纯正”的虚拟机在最初并非由Sun公司开发,而是由一家名为“Longview Technologies”的小公司设计的; 甚至这个虚拟机最初并非是为Java语言而开发的,它来源于Strongtalk VM, 而这款虚拟机中相当多的技术又是来源于一款支持Self语言实现“达到C语言50%以上的执行效率”的目标而设计的虚拟机, Sun公司注意到了这款虚拟机在JIT编译上有许多优秀的理念和实际效果,在1997年收购了Longview Technologies公司,从而获得了HotSpot VM。
HotSpot VM既继承了Sun之前两款商用虚拟机的优点(如前面提到的准确式内存管理),也有许多自己新的技术优势, 如它名称中的HotSpot指的就是它的热点代码探测技术(其实两个VM基本上是同时期的独立产品,HotSpot还稍早一些,HotSpot一开始就是准确式GC, 而Exact VM之中也有与HotSpot几乎一样的热点探测。 为了Exact VM和HotSpot VM哪个成为Sun主要支持的VM产品,在Sun公司内部还有过争论,HotSpot打败Exact并不能算技术上的胜利), HotSpot VM的热点代码探测能力可以通过执行计数器找出最具有编译价值的代码,然后通知JIT编译器以方法为单位进行编译。 如果一个方法被频繁调用,或方法中有效循环次数很多,将会分别触发标准编译和OSR(栈上替换)编译动作。 通过编译器与解释器恰当地协同工作,可以在最优化的程序响应时间与最佳执行性能中取得平衡,而且无须等待本地代码输出才能执行程序, 即时编译的时间压力也相对减小,这样有助于引入更多的代码优化技术,输出质量更高的本地代码。
在2006年的JavaOne大会上,Sun公司宣布最终会把Java开源,并在随后的一年,陆续将JDK的各个部分(其中当然也包括了HotSpot VM)在GPL协议下公开了源码, 并在此基础上建立了OpenJDK。这样,HotSpot VM便成为了Sun JDK和OpenJDK两个实现极度接近的JDK项目的共同虚拟机。
在2008年和2009年,Oracle公司分别收购了BEA公司和Sun公司,这样Oracle就同时拥有了两款优秀的Java虚拟机:JRockit VM和HotSpot VM。 Oracle公司宣布在不久的将来(大约应在发布JDK 8的时候)会完成这两款虚拟机的整合工作,使之优势互补。 整合的方式大致上是在HotSpot的基础上,移植JRockit的优秀特性,譬如使用JRockit的垃圾回收器与MissionControl服务, 使用HotSpot的JIT编译器与混合的运行时系统。
GraalVM
一句话概括:一个在HotSpot虚拟机基础上增强而成的跨语言全栈虚拟机,可以作为“任何语言”的运行平台使用,原理是将这些语言的源代码或源代码编译后的中间格式通过解释器转换为能被Graal VM接受的中间表示,之后统一优化。经过优化的语言能同时在这个虚拟机里跑,以此减少不同语言的沟通开销。
GraalVM详细介绍
Graal VM在2018年4月由Oracle Lab发布,被官方称为“Universal VM”和“Polyglot VM”,这是一个在HotSpot虚拟机基础上增强而成的跨语言全栈虚拟机,可以作为“任何语言”的运行平台使用,这里“任何语言”包括了Java、Scala、Groovy、Kotlin等基于Java虚拟机之上的语言,还包括了C、C++、Rust等基于LLVM的语言,同时支持其他像JavaScript、Ruby、Python和R语言等等。Graal VM可以无额外开销地混合使用这些编程语言,支持不同语言中混用对方的接口和对象,也能够支持这些语言使用已经编写好的本地库文件。
Graal VM的基本工作原理是将这些语言的源代码(例如JavaScript)或源代码编译后的中间格式(例如LLVM字节码)通过解释器转换为能被Graal VM接受的中间表示(IR),譬如设计一个解释器专门对LLVM输出的字节码进行转换来支持C和C++语言,这个过程称为“程序特化”(Specialized,也常称为Partial Evaluation)。Graal VM提供了Truffle工具集来快速构建面向一种新语言的解释器,并用它构建了一个称为Sulong的高性能LLVM字节码解释器。
以更严格的角度来看,Graal VM才是真正意义上与物理计算机相对应的高级语言虚拟机,理由是它与物理硬件的指令集一样,做到了只与机器特性相关而不与某种高级语言特性相关。Oracle Labs的研究总监Thomas Wuerthinger在接受InfoQ采访时谈到:“随着Graal VM 1.0的发布,我们已经证明了拥有高性能的多语言虚拟机是可能的,并且实现这个目标的最佳方式不是通过类似Java虚拟机和微软CLR那样带有语言特性的字节码”。对于一些本来就不以速度见长的语言运行环境,由于Graal VM本身能够对输入的中间表示进行自动优化,在运行时还能进行即时编译优化,往往使用Graal VM实现能够获得比原生编译器更优秀的执行效率,譬如Graal.js要优于Node.js、Graal.Python要优于CPtyhon,TruffleRuby要优于Ruby MRI,FastR要优于R语言等等。
针对Java而言,Graal VM本来就是在HotSpot基础上诞生的,天生就可作为一套完整的符合Java SE 8标准Java虚拟机来使用。它和标准的HotSpot差异主要在即时编译器上,其执行效率、编译质量目前与标准版的HotSpot相比也是互有胜负。但现在Oracle Labs和美国大学里面的研究院所做的最新即时编译技术的研究全部都迁移至基于Graal VM之上进行了,其发展潜力令人期待。如果Java语言或者HotSpot虚拟机真的有被取代的一天,那从现在看来Graal VM是希望最大的一个候选项,这场革命很可能会在Java使用者没有明显感觉的情况下悄然而来,Java世界所有的软件生态都没有发生丝毫变化,但天下第一的位置已经悄然更迭。
Quarkus是在k8s上运行的,其可以部署一个经过优化的k8s应用,并能快速启动和运行新的k8s实例。
工作流程
graph LR A[搭建脚手架] B[启动开发模式] C[编码] D[测试] E[打包] F[部署] A --> B --> C --> D --> E --> F搭建脚手架
我使用的是vscode,可以先安装Quarkus
的插件,之后按F1
,找到Quarkus: build a Quarkus project
就能完成脚手架的创建。
其中主要的核心部分有4个:
src\main\docker
src\main\java\org\acme
JAX-RS(Java API for RESTful Web Services)资源src\test\java\org\acme
针对JAX-RS的测试src\main\resources
静态资源
而docker文件夹内的内容一般不需要我们去修改,其中的文件含义如下:
- Dockerfile.jvm 构建以 JVM 模式运行 Quarkus 应用程序的容器
- Dockerfile.legacy-jar 构建以 JVM 模式运行 Quarkus 应用程序的容器
- Dockerfile.multigrade 一站式构建native的应用程序镜像
- Dockerfile.native 构建一个容器,该容器在本机(无 JVM)模式下运行 Quarkus 应用程序
- Dockerfile.native-distroless 构建以原生(无 JVM)模式运行 Quarkus 应用程序的 distroless 容器
运行
问使用的是gradle作为项目的依赖管理工具,所以接下来的命令会使用gradlew
。对于maven
项目,可以使用mvnw
,不过命令格式会不同,可以查阅命令行中自带的帮助。
./gradlew quarkusDev // 开启热加载
部署的过程中会给出部署的端口,我的端口是8080,打开localhost:8080
就能看到如下页面,说明部署就成功了
附录
[1] GraalVM:微服务时代的Java https://zhuanlan.zhihu.com/p/137836206