【Quarkus技术系列】「云原生架构体系」打造基于Quarkus的云原生微服务框架实践

前提说明:

Ok,大家好,今天呢,我们的分享主题是“如何打造一个基于Quarkus的云原生微服务架构”,无论你之前是否了解或者熟悉Quarkus,希望通过今天的技术分享可以让你认识和知道Quarkus。

进入前奏:

好了,我们废话不多说,进入主题,我觉得要是谈到Quarkus,那么我们肯定需要先分析一下,目前Java和云原生服务的关系以及在行业中它们的风向、行情。


Java和云原生在行业的行情和风向

image

从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的特点有哪些:

我们来说说看它的特点都有那些!

  1. 专门用于创建适配于GraalVM和OpenJDK HotSpot的云原生框架。这说明它可以并肩与两种虚拟机的存在!对HotSpot虚拟机而言(无论是Oracle JDK还是OpenJDK我们都不陌生!),我们就不多说了,这里特别说一下GraalVM虚拟机,它是一个新时代的虚拟机(特别是它有一个强大的编译器),可谓是Quarkus性能优化的灵魂所在!

  2. 专门用于针对容器优化Java应用程序,并使其成为无服务器架构(甚至面向与Faas化,这也是GraalVM的功劳之一)、云上服务、还有就是我们重点关注的Kubernetes模式下的云原生服务

  3. 主要的目的就是为了集成Kubernetes(特别是Kubernetes集群)而生的,非常的具有针对性和专业性!

Quarkus的优点

我们在看看Quarkus的优点吧!

  1. (JVM的升级)首先我们在回到GraalVM这个概念上来,刚刚说到了GraalVM的编译器功能,那么我们就知道,它是可以通过借助GraalVM的编译器实现内联机制,逃逸分析以及独特的优化技术,可以提升2至5倍的性能。此外特意多说一下,GraalVM就是为了代替JVM原有的C2编译器,才诞生的,C2编译器是Ciff click 大神的精心之作,但是过于庞大和复杂,甚至到大神自己都不想维护了!所以JVM优化的瓶颈已经慢慢停留在了C2编译器,这对Java的发展是非常不利的!,所以才有了GraalVM,并且也是Java实现的,有兴趣的小伙伴们,可以好好研究啊!

  2. (Spring层面的升级)我们都知道Spring框架不是性能为优先,而是扩展性闻名于世,而Quarkus的扩展能力并不比spring差!和Spring一样,完全可以集成Eclipse MicroProfile、Hibernate、Apache Camel和Eclipse Vert.x等开源库、甚至还可以将SpringBoot迁移到Quarkus生态,这是不是非常方便呢!解决了很多公司或者开发团队的迁移复杂的后顾之忧!

  3. (云原生的升级),之前我们开发Java项目而言,如果想做成Docker镜像或者Kubernetes镜像,那么只能依靠于额外的第三发插件或者开发库,导致我们的项目过于臃肿了,而且Spring对Docker或者K8s的支持也不太尽人意,但是有了Quarkus后,就可以与Docker和Kubernetes轻松集成,不依靠额外插件,它可以打造Docker资源(包含JVM模式Dockerfile、云原生模式的Dockerfile)、kubernete资源甚至是OpenShift资源。

  4. (服务启动性能提升)这个可是重头戏,在Quarkus服务中不只是单纯拥有JVM这一种运行模式。对于相同的应用程序代码,在原生模式下,服务启动速度非常快(大约可以缩短3倍的时间,可以减少我们很多的等待时间)、而且大多数的Spring项目会占用资源空间非常多,常常会造成很多OOM或者FGC,我相信大家都遇到过哈,之前的我们只能通过补救的方案,要不就是Spring的瘦身化,或者去提升JVM GC的能力,快速回收,无论是采用回收算法、还是机器的配置来解决这个问题,个人认为都只是补救的方面。但是有了Quarkus服务后,它解决了Spring项目占用庞大内存的问题,因为它本身很小且内存消耗低(特别是在原生模式下,底层水很深!),可以大大提高性能和资源使用率,这是不是说明我们以后可以很可能跟“OOM”说拜拜了?这里打上一个问号。

补充一点:借了GraalVM的光,Quarkus也解决了Java体系在跨语言层面来讲的很多问题,比如说,它可以支持更多种类的语言接入到Java的生态中(比如说,组合Java、JavaScript、Ruby 和 R 语言 )形成多语言微服务生态,岂不美哉!

image

Quarkus的基本开发流程

我们简称为“夸克斯开发6部”,让我们来看看它们都是什么?

  • 「搭建脚手架」第一步就是快速搭建属于Quarkus的应用云原生框架(这为构建应用服务奠定基础)

  • 「开发者模式」这个阶段代表两个含义:

  • 1:就是代表着我们需要进入开发状态了,当然这个是开玩笑的!

  • 2:重点要说的就是,Quarkus微服务应用的(开发模式)实现实时热部署能力(改动实时生效),就有点类似于SpringBoot的devTools或者spring loader、甚至收费的JRebel,这种情况需要额外引入包或者插件才可以,而我们Quarkus则直接作为自身的运行模式进行控制。进步的不是一点点啊!

  • 「进行业务编码」通过集成多个开源库以及相关业务需求进行开发相关的程序代码

  • 「建立集成测试」当开发编码完成之后建立版本,进行开发层面集成化测试阶段

  • 「生成镜像打包」建立CLI程序以及创建云原生可执行包文件,并建立对应的容器服务

  • 「部署基础K8S」将对应的可执行应用文件、容器文件、云原生文件包直接集成部署到Kubernetes集群中


Quarkus的环境搭建流程

了解了总体的开发实践流程之后,我觉得到这里才算是真正的开始实践Quarkus了,我们就先看看官方指定的,环境搭建流程,姑且称之为“Quarkus搭建5步”

image

  1. 你需要一个开发者工具,例如:IDEA、Eclipse等

  2. 你需要JDK11+版本的JVM环境资源

  3. 选择一个GraalVM虚拟机作为编译器的基础

  4. 最好选择一个Maven(3.8.1版本)/Gradle工具

  5. 最后基于官方最新Quarkus版本(2.3.0.Final)进行开发实现。

Quarkus服务架构的搭建

首先,框架的搭建方案大致有四种,分别是:

Maven构建Quarkus应用服务骨架

首先我们来看看第一种构建方式,通过Maven构建Quarkus应用服务骨架

image
Maven项目框架结构,包含了相关的内容主要是:
  • Quarkus服务所需要的Maven环境pom.xml文件

  • 基础的JAX-RS的资源服务类

  • 对应的JAX-RS的资源服务的测试类

  • Quarkus原生模式的测试类

  • 用于创建Docker容器的Dockerfile文件

  • 空的配置文件( application.properties )

image

Gradle构建Quarkus应用服务骨架
Gradle项目框架结构,包含了相关的内容主要是:
  • Quarkus服务所需要的Gradle环境build.gradle文件

  • 基础的JAX-RS的资源服务类

  • 对应的JAX-RS的资源服务的测试类

  • Quarkus原生模式的测试类

  • 用于创建Docker容器的Dockerfile文件

  • 空的配置文件( application.properties )

image

到这里,我们可以看到一点,为了让大家熟悉Quarkus、快速开发Quarkus服务,它采用了和SpringBoot非常相似的架构和参数配置,可以让我们快速进行迭代执行开发机制!


Quarkus Start Coding搭建项目骨架

首先,我们打开浏览器直接访问:http://code.quarkus.io

image

我们主要关注我红线划分出来的这三个区域即可!

Quarkus Start Coding脚手架网站
image
  • Group:配置应用的Maven groupId,一般我们采用域名反向即可。

  • Artifact:配置应用的Maven artifactId,一般就是我们的应用名

  • Build构建方式: 这里可以选择:Maven/Gradle

而下面的Web部分:

则需要我们选择一个我们希望的Rest服务框架的实现方式:可以看到非常的多哈。

image

点击-Genrate your application,直接进行提交,就可以下载相关的代码骨架!

image

这与我们的Spring Initializer非常之相像。


开发工具构建Quarkus应用服务骨架

创建一个新的Quarkus工程项目

  • IDEA主菜单选择File -> New Project
image
image

[========] 翻页

IDEA安装Quarkus支持的插件

如果你的IDEA没有支持Quarkus功能那么需要进行安装插件,因为低版本是没有Quarkus项目的,我们可以选择图中的方式进行安装插件即可。

image

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插件进行直接点击运行即可。

image
  • 注意:推荐使用Java11以上的JVM版本

Quarkus开发模式实现实时热部署

在上面左边的图中,显示了相关的,Quarkus资源服务接口代码:,返回的是一个Hello RESTEasy接口!

image

右边是我们执行curl命令调用服务接口的到的结果

image

此时当我们进行修改代码,将返回参数改为“hello”

image

重新进行调用后,可以看到结果是hello

image

可以说,真实非常的的方便!


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端点服务注解介绍

image
  • Quarkus框架实现端点服务的基础开发结构

  • 定义当前资源的URI定位符路径:@Path注解

  • 设计Http请求的方法类型 @GET注解

  • 定义返回类型的资源相应类型 @Produces注解

  • 定义接收查询Http相关的参数信息

  • @QueryParam注解可以定义端点请求参数

  • @HeaderParam注解可以定义端点服务的请求参数

  • @FormParam注解可以定义端点服务的表单参数

  • @CookieParam注解可以定义端点服务的cookie参数

  • @PathParam注解可以定义端点服务的路径变量

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342

推荐阅读更多精彩内容