前提说明:
Ok,大家好,今天呢,我们的分享主题是“如何打造一个基于Quarkus的云原生微服务架构”,无论你之前是否了解或者熟悉Quarkus,希望通过今天的技术分享可以让你认识和知道Quarkus。
进入前奏:
好了,我们废话不多说,进入主题,我觉得要是谈到Quarkus,那么我们肯定需要先分析一下,目前Java和云原生服务的关系以及在行业中它们的风向、行情。
Java和云原生在行业的行情和风向
从Java角度而言:
虽然伴随着时间的流逝和技术的日新月异,Java的地位慢慢这有所下滑,但是“瑕不掩瑜”,Java陪伴我走过了很多的美好的时光,而且它仍然是我们非常瞩目的编程语言!但不得不说,对于微服务层面而言,Java无论是RPC、序列化、传输协议、技术体系都有着其他语言无法比拟的实力,但是我们渐渐发现,微服务2.0以及云原生的到来,让Java可能有点应对不及,因为在Java的领域内,主要依靠两个核心来源进行技术推动,一、就是依靠Spring技术生态圈;二、就是Oracle官方进行推动。而Oracle官方也推出了几个微服务框架和技术框架,比如说,Helidon 是由 Oracle 在 2018 年 9 月份推出的轻量级微服务框架、Micronaut,但是不都是很理想,还是有主流的Spring家族所掌控着。而Spring的技术重心还未完全转移到云原生上面。
从云原生角度而言:
我们都知道Kubernetes已经是我们目前技术领域、运维部署领域、容器化领域的行业标准,而且更是在云原生领域大方光彩!那么如何让Java应用更加完美的转化到Kubernetes层面就是一个很大的难题啊!
别担心,Quarkus帮助我们解决了这个难题!
进入正题:
首先我们将Quarkus云原生框架的实践流程分为6个部分,我们称之为“夸克斯实践6步!”,它们都有什么呢。
进入Quarkus的基本概念:
首先Quarkus,我们也可以叫它的中文名称“夸克斯”,相信大家也知道阿里也有一款浏览器叫“夸克”,有点相似,差一个s,大家别记混了,它是RedHat公司开源的一款Java云原生服务框架,到这里,说一句题外话?kubernetes很牛!它们两大“东家”,一个就是众所周知的谷歌,另一个就是RedHat公司,它是RedHat公司亲自操刀开发的!这能不强大吗!
Quarkus的特点有哪些:
我们来说说看它的特点都有那些!
专门用于创建适配于GraalVM和OpenJDK HotSpot的云原生框架。这说明它可以并肩与两种虚拟机的存在!对HotSpot虚拟机而言(无论是Oracle JDK还是OpenJDK我们都不陌生!),我们就不多说了,这里特别说一下GraalVM虚拟机,它是一个新时代的虚拟机(特别是它有一个强大的编译器),可谓是Quarkus性能优化的灵魂所在!
专门用于针对容器优化Java应用程序,并使其成为无服务器架构(甚至面向与Faas化,这也是GraalVM的功劳之一)、云上服务、还有就是我们重点关注的Kubernetes模式下的云原生服务!
主要的目的就是为了集成Kubernetes(特别是Kubernetes集群)而生的,非常的具有针对性和专业性!
Quarkus的优点
我们在看看Quarkus的优点吧!
(JVM的升级)首先我们在回到GraalVM这个概念上来,刚刚说到了GraalVM的编译器功能,那么我们就知道,它是可以通过借助GraalVM的编译器实现内联机制,逃逸分析以及独特的优化技术,可以提升2至5倍的性能。此外特意多说一下,GraalVM就是为了代替JVM原有的C2编译器,才诞生的,C2编译器是Ciff click 大神的精心之作,但是过于庞大和复杂,甚至到大神自己都不想维护了!所以JVM优化的瓶颈已经慢慢停留在了C2编译器,这对Java的发展是非常不利的!,所以才有了GraalVM,并且也是Java实现的,有兴趣的小伙伴们,可以好好研究啊!
(Spring层面的升级)我们都知道Spring框架不是性能为优先,而是扩展性闻名于世,而Quarkus的扩展能力并不比spring差!和Spring一样,完全可以集成Eclipse MicroProfile、Hibernate、Apache Camel和Eclipse Vert.x等开源库、甚至还可以将SpringBoot迁移到Quarkus生态,这是不是非常方便呢!解决了很多公司或者开发团队的迁移复杂的后顾之忧!
(云原生的升级),之前我们开发Java项目而言,如果想做成Docker镜像或者Kubernetes镜像,那么只能依靠于额外的第三发插件或者开发库,导致我们的项目过于臃肿了,而且Spring对Docker或者K8s的支持也不太尽人意,但是有了Quarkus后,就可以与Docker和Kubernetes轻松集成,不依靠额外插件,它可以打造Docker资源(包含JVM模式Dockerfile、云原生模式的Dockerfile)、kubernete资源甚至是OpenShift资源。
(服务启动性能提升)这个可是重头戏,在Quarkus服务中不只是单纯拥有JVM这一种运行模式。对于相同的应用程序代码,在原生模式下,服务启动速度非常快(大约可以缩短3倍的时间,可以减少我们很多的等待时间)、而且大多数的Spring项目会占用资源空间非常多,常常会造成很多OOM或者FGC,我相信大家都遇到过哈,之前的我们只能通过补救的方案,要不就是Spring的瘦身化,或者去提升JVM GC的能力,快速回收,无论是采用回收算法、还是机器的配置来解决这个问题,个人认为都只是补救的方面。但是有了Quarkus服务后,它解决了Spring项目占用庞大内存的问题,因为它本身很小且内存消耗低(特别是在原生模式下,底层水很深!),可以大大提高性能和资源使用率,这是不是说明我们以后可以很可能跟“OOM”说拜拜了?这里打上一个问号。
补充一点:借了GraalVM的光,Quarkus也解决了Java体系在跨语言层面来讲的很多问题,比如说,它可以支持更多种类的语言接入到Java的生态中(比如说,组合Java、JavaScript、Ruby 和 R 语言 )形成多语言微服务生态,岂不美哉!
Quarkus的基本开发流程
我们简称为“夸克斯开发6部”,让我们来看看它们都是什么?
「搭建脚手架」第一步就是快速搭建属于Quarkus的应用云原生框架(这为构建应用服务奠定基础)
「开发者模式」这个阶段代表两个含义:
1:就是代表着我们需要进入开发状态了,当然这个是开玩笑的!
2:重点要说的就是,Quarkus微服务应用的(开发模式)实现实时热部署能力(改动实时生效),就有点类似于SpringBoot的devTools或者spring loader、甚至收费的JRebel,这种情况需要额外引入包或者插件才可以,而我们Quarkus则直接作为自身的运行模式进行控制。进步的不是一点点啊!
「进行业务编码」通过集成多个开源库以及相关业务需求进行开发相关的程序代码
「建立集成测试」当开发编码完成之后建立版本,进行开发层面集成化测试阶段
「生成镜像打包」建立CLI程序以及创建云原生可执行包文件,并建立对应的容器服务
「部署基础K8S」将对应的可执行应用文件、容器文件、云原生文件包直接集成部署到Kubernetes集群中
Quarkus的环境搭建流程
了解了总体的开发实践流程之后,我觉得到这里才算是真正的开始实践Quarkus了,我们就先看看官方指定的,环境搭建流程,姑且称之为“Quarkus搭建5步”
你需要一个开发者工具,例如:IDEA、Eclipse等
你需要JDK11+版本的JVM环境资源
选择一个GraalVM虚拟机作为编译器的基础
最好选择一个Maven(3.8.1版本)/Gradle工具
最后基于官方最新Quarkus版本(2.3.0.Final)进行开发实现。
Quarkus服务架构的搭建
首先,框架的搭建方案大致有四种,分别是:
Maven构建Quarkus应用服务骨架
首先我们来看看第一种构建方式,通过Maven构建Quarkus应用服务骨架
Maven项目框架结构,包含了相关的内容主要是:
Quarkus服务所需要的Maven环境pom.xml文件
基础的JAX-RS的资源服务类
对应的JAX-RS的资源服务的测试类
Quarkus原生模式的测试类
用于创建Docker容器的Dockerfile文件
空的配置文件( application.properties )
Gradle构建Quarkus应用服务骨架
Gradle项目框架结构,包含了相关的内容主要是:
Quarkus服务所需要的Gradle环境build.gradle文件
基础的JAX-RS的资源服务类
对应的JAX-RS的资源服务的测试类
Quarkus原生模式的测试类
用于创建Docker容器的Dockerfile文件
空的配置文件( application.properties )
到这里,我们可以看到一点,为了让大家熟悉Quarkus、快速开发Quarkus服务,它采用了和SpringBoot非常相似的架构和参数配置,可以让我们快速进行迭代执行开发机制!
Quarkus Start Coding搭建项目骨架
首先,我们打开浏览器直接访问:http://code.quarkus.io
我们主要关注我红线划分出来的这三个区域即可!
Quarkus Start Coding脚手架网站
Group:配置应用的Maven groupId,一般我们采用域名反向即可。
Artifact:配置应用的Maven artifactId,一般就是我们的应用名
Build构建方式: 这里可以选择:Maven/Gradle
而下面的Web部分:
则需要我们选择一个我们希望的Rest服务框架的实现方式:可以看到非常的多哈。
点击-Genrate your application,直接进行提交,就可以下载相关的代码骨架!
这与我们的Spring Initializer非常之相像。
开发工具构建Quarkus应用服务骨架
创建一个新的Quarkus工程项目
- IDEA主菜单选择File -> New Project
选择创建Quarkus应用程序
选择default Server URL: https://code.quarkus.io.
[========] 翻页
IDEA安装Quarkus支持的插件
如果你的IDEA没有支持Quarkus功能那么需要进行安装插件,因为低版本是没有Quarkus项目的,我们可以选择图中的方式进行安装插件即可。
Quarkus应用程序的运行模式
首先呢 ,大家可以看到,Quarkus主要有三种运行模式,分别是开发模式、测试模式、生产模式!
Quarkus具有3种不同的启动模式:
Development(开发环境)
直接运行quarkus:dev maven命令,则模式为DEVELOPMENT,这个我后面会详细介绍到的,特别方便我们的开发,可以实现改动的实时生效。
Test(测试环境)
如果正在运行JUnit测试,则模式转为Test,例如:可以实现更加强大的Testcontainers或者原生可执行文件的测试等。
Normal(生产环境)
出了以上的两种情况,都属于Normal模式,就是我们正式发布的可执行包文件。
Quarkus开发模式实现实时热部署
开发模式就像我刚才说的,它主要是对标Spring loader、Spring devtools、Jrebel等热部署机制
Quarkus的dev(开发模式)
如果使用开发模式,则后台编译实现热部署机制。
- 当修改Java文件或者静态资源文件后,只需要刷新浏览器就会自动变更,实时很方便!
开启dev模式的Quarkus应用程序
如何启动开发模式的机制呢?
在Maven项目根目录执行命令:
mvnw quarkus:dev
Gradle项目根目录命令:
gradlew quarkusDev
也可以通过IDEA的Maven插件进行直接点击运行即可。
- 注意:推荐使用Java11以上的JVM版本
Quarkus开发模式实现实时热部署
在上面左边的图中,显示了相关的,Quarkus资源服务接口代码:,返回的是一个Hello RESTEasy接口!
右边是我们执行curl命令调用服务接口的到的结果:
此时当我们进行修改代码,将返回参数改为“hello”
重新进行调用后,可以看到结果是
hello
可以说,真实非常的的方便!
Quarkus端点服务开发介绍
Quarkus框架对Restful Web服务的支持能力
Quarkus集成RestEasy框架,它是一个遵循Rest协议模式的JAX-RS,也是其定义REST端点的基础默认框架。
Quarkus框架对Restful Web服务的开发方式
Quarkus使用,通过使用JAX-RS注解进行修饰绑定,使用HTTP注解(@GET、@POST、@PUT、@DELETE、@PATCH等)声明端点服务的请求类型,并且通过@Path注解定义公共Path部分。
Quarkus框架对接收资源类型和输出资源类型
@Consumes注解可以定义端点服务的接收资源类型,例如:@Consumes(MediaType.TEXT_PLAIN)
@Produces注解可以定义端点服务的接收资源类型,例如: @Produces(MediaType.TEXT_PLAIN)
Quarkus端点服务注解介绍
Quarkus框架实现端点服务的基础开发结构
定义当前资源的URI定位符路径:@Path注解
设计Http请求的方法类型 @GET注解
定义返回类型的资源相应类型 @Produces注解
定义接收查询Http相关的参数信息
@QueryParam注解可以定义端点请求参数
@HeaderParam注解可以定义端点服务的请求参数
@FormParam注解可以定义端点服务的表单参数
@CookieParam注解可以定义端点服务的cookie参数
@PathParam注解可以定义端点服务的路径变量