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

本文涉及的产品
云原生网关 MSE Higress,422元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 【Quarkus技术系列】「云原生架构体系」打造基于Quarkus的云原生微服务框架实践

前提说明:


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



进入前奏:


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


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

image.png

从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实现的,有兴趣的小伙伴们,可以好好研究啊!


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


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


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



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

image.png


Quarkus的基本开发流程


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


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


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


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


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


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


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


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

Quarkus的环境搭建流程


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

image.png


  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.png

Maven项目框架结构,包含了相关的内容主要是:


  • Quarkus服务所需要的Maven环境pom.xml文件
  • 基础的JAX-RS的资源服务类
  • 对应的JAX-RS的资源服务的测试类
  • Quarkus原生模式的测试类
  • 用于创建Docker容器的Dockerfile文件
  • 空的配置文件( application.properties )

image.png


Gradle构建Quarkus应用服务骨架


Gradle项目框架结构,包含了相关的内容主要是:


  • Quarkus服务所需要的Gradle环境build.gradle文件
  • 基础的JAX-RS的资源服务类
  • 对应的JAX-RS的资源服务的测试类
  • Quarkus原生模式的测试类
  • 用于创建Docker容器的Dockerfile文件
  • 空的配置文件( application.properties )

image.png

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


Quarkus Start Coding搭建项目骨架


首先,我们打开浏览器直接访问:code.quarkus.ioimage.png

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


Quarkus Start Coding脚手架网站

image.png

  • Group:配置应用的Maven groupId,一般我们采用域名反向即可。
  • Artifact:配置应用的Maven artifactId,一般就是我们的应用名
  • Build构建方式: 这里可以选择:Maven/Gradle


而下面的Web部分:


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

image.png

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

image.png

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


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

创建一个新的Quarkus工程项目

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

image.png

  • 选择创建Quarkus应用程序
  • 选择default Server URL: code.quarkus.io.image.png

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

IDEA安装Quarkus支持的插件


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

image.png


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.png

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

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


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

image.png

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

image.png

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

image.png

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

image.png

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


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.png

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


  • 定义当前资源的URI定位符路径:@Path注解
  • 设计Http请求的方法类型 @GET注解
  • 定义返回类型的资源相应类型 @Produces注解


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

  • @QueryParam注解可以定义端点请求参数
  • @HeaderParam注解可以定义端点服务的请求参数
  • @FormParam注解可以定义端点服务的表单参数
  • @CookieParam注解可以定义端点服务的cookie参数
  • @PathParam注解可以定义端点服务的路径变量





相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
6天前
|
Cloud Native 云计算 Docker
云原生之旅:从容器化到微服务架构
【9月更文挑战第27天】本文将引领读者进入云原生的世界,探索如何通过容器化技术实现应用的快速部署与扩展,并深入理解微服务架构的设计哲学。我们将一起见证代码如何转化为可在云端无缝运行的服务,同时讨论云原生生态中的最佳实践和面临的挑战。
|
9天前
|
安全 应用服务中间件 API
微服务分布式系统架构之zookeeper与dubbo-2
微服务分布式系统架构之zookeeper与dubbo-2
|
9天前
|
负载均衡 Java 应用服务中间件
微服务分布式系统架构之zookeeper与dubbor-1
微服务分布式系统架构之zookeeper与dubbor-1
|
2天前
|
Cloud Native 持续交付 Docker
云原生之旅:从容器到微服务的演变之路
【9月更文挑战第31天】在数字化转型的浪潮中,云原生技术如星辰般熠熠生辉。本文将带你探索云原生的核心——容器化与微服务架构,揭示它们如何共同推动现代软件开发的革命。通过深入浅出的语言和生动的比喻,我们将一起走进云原生的世界,理解它的魅力所在,并见证代码示例如何将理论转化为实践。
12 4
|
7天前
|
Kubernetes Go Docker
掌握微服务架构:从Go到容器化的旅程
摘要,通常简短概述文章内容,要求精炼。在本文中,我们将打破常规,采用一种故事化叙述的摘要,旨在激发读者的好奇心和探究欲: “从宁静的海滨小城出发,我们踏上了一场技术探险之旅,探索微服务架构的奥秘。我们将学习如何用Go编写微服务,以及如何通过Docker和Kubernetes将它们打包进小巧的容器中。在这场旅程中,我们将遇到挑战、收获知识,最终实现应用的快速部署与可扩展性。”
|
9天前
|
Cloud Native Java 对象存储
揭秘微服务架构之争:Spring Cloud与Netflix OSS巅峰对决,谁将称霸弹性云原生时代?
近年来,微服务架构成为企业应用的主流设计模式。本文对比了两大热门框架Spring Cloud和Netflix OSS,探讨其在构建弹性微服务方面的表现。Spring Cloud依托Spring Boot,提供全面的微服务解决方案,包括服务注册、配置管理和负载均衡等。Netflix OSS则由一系列可独立或组合使用的组件构成,如Eureka、Hystrix等。两者相比,Spring Cloud更易集成且功能完善,而Netflix OSS则需自行整合组件,但灵活性更高。实际上,两者也可结合使用以发挥各自优势。通过对两者的对比分析,希望为企业在微服务架构选型上提供参考。
28 0
|
2月前
|
Kubernetes Cloud Native Docker
云原生之旅:从容器到微服务的架构演变
【8月更文挑战第29天】在数字化时代的浪潮下,云原生技术以其灵活性、可扩展性和弹性管理成为企业数字化转型的关键。本文将通过浅显易懂的语言和生动的比喻,带领读者了解云原生的基本概念,探索容器化技术的奥秘,并深入微服务架构的世界。我们将一起见证代码如何转化为现实中的服务,实现快速迭代和高效部署。无论你是初学者还是有经验的开发者,这篇文章都会为你打开一扇通往云原生世界的大门。
|
2月前
|
负载均衡 应用服务中间件 持续交付
微服务架构下的Web服务器部署
【8月更文第28天】随着互联网应用的不断发展,传统的单体应用架构逐渐显露出其局限性,特别是在可扩展性和维护性方面。为了解决这些问题,微服务架构应运而生。微服务架构通过将应用程序分解成一系列小型、独立的服务来提高系统的灵活性和可维护性。本文将探讨如何在微服务架构中有效部署和管理Web服务器实例,并提供一些实际的代码示例。
68 0
|
21天前
|
运维 Cloud Native Devops
云原生架构的崛起与实践云原生架构是一种通过容器化、微服务和DevOps等技术手段,帮助应用系统实现敏捷部署、弹性扩展和高效运维的技术理念。本文将探讨云原生的概念、核心技术以及其在企业中的应用实践,揭示云原生如何成为现代软件开发和运营的主流方式。##
云原生架构是现代IT领域的一场革命,它依托于容器化、微服务和DevOps等核心技术,旨在解决传统架构在应对复杂业务需求时的不足。通过采用云原生方法,企业可以实现敏捷部署、弹性扩展和高效运维,从而大幅提升开发效率和系统可靠性。本文详细阐述了云原生的核心概念、主要技术和实际应用案例,并探讨了企业在实施云原生过程中的挑战与解决方案。无论是正在转型的传统企业,还是寻求创新的互联网企业,云原生都提供了一条实现高效能、高灵活性和高可靠性的技术路径。 ##
27 3
|
29天前
|
存储 Java Maven
从零到微服务专家:用Micronaut框架轻松构建未来架构
【9月更文挑战第5天】在现代软件开发中,微服务架构因提升应用的可伸缩性和灵活性而广受欢迎。Micronaut 是一个轻量级的 Java 框架,适合构建微服务。本文介绍如何从零开始使用 Micronaut 搭建微服务架构,包括设置开发环境、创建 Maven 项目并添加 Micronaut 依赖,编写主类启动应用,以及添加控制器处理 HTTP 请求。通过示例代码展示如何实现简单的 “Hello, World!” 功能,并介绍如何通过添加更多依赖来扩展应用功能,如数据访问、验证和安全性等。Micronaut 的强大和灵活性使你能够快速构建复杂的微服务系统。
61 5
下一篇
无影云桌面