0

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

 2 years ago
source link: https://my.oschina.net/liboware/blog/5285949
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

前提说明:

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

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

  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 语言 )形成多语言微服务生态,岂不美哉!


Quarkus的基本开发流程

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

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

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

    • 1:就是代表着我们需要进入开发状态了,当然这个是开玩笑的!
    • 2:重点要说的就是,Quarkus微服务应用的(开发模式)实现实时热部署能力(改动实时生效),就有点类似于SpringBoot的devTools或者spring loader、甚至收费的JRebel,这种情况需要额外引入包或者插件才可以,而我们Quarkus则直接作为自身的运行模式进行控制。进步的不是一点点啊!
  • 「进行业务编码」通过集成多个开源库以及相关业务需求进行开发相关的程序代码

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

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

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


Quarkus的环境搭建流程

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


  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应用服务骨架

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

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

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注解可以定义端点服务的路径变量


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK