写点什么

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

用户头像
浩宇天尚
关注
发布于: 刚刚
【Quarkus技术系列】「云原生架构体系」打造基于Quarkus的云原生微服务框架实践

前提说明:

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



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

发布于: 刚刚阅读数: 2
用户头像

浩宇天尚

关注

🏆 InfoQ写作平台-签约作者 🏆 2020.03.25 加入

【个人简介】酷爱计算机技术、醉心开发编程、喜爱健身运动、热衷悬疑推理的”极客狂人“ 【技术格言】任何足够先进的技术都与魔法无异 【技术范畴】Java领域、Spring生态、MySQL专项、APM专题及微服务/分布式体系等

评论

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