「Quarkus技术系列」「云原生架构体系」打造基于Quarkus
connygpt 2024-11-12 10:09 11 浏览
前提说明:
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搭建项目骨架
我们主要关注我红线划分出来的这三个区域即可!
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注解可以定义端点服务的路径变量
如果本文对你有帮助,别忘记给我个3连 ,点赞,转发,评论,
咱们下期见!答案获取方式:已赞 已评 已关~
学习更多JAVA知识与技巧,关注与私信博主(666)
相关推荐
- 3分钟让你的项目支持AI问答模块,完全开源!
-
hello,大家好,我是徐小夕。之前和大家分享了很多可视化,零代码和前端工程化的最佳实践,今天继续分享一下最近开源的Next-Admin的最新更新。最近对这个项目做了一些优化,并集成了大家比较关注...
- 干货|程序员的副业挂,12个平台分享
-
1、D2adminD2Admin是一个完全开源免费的企业中后台产品前端集成方案,使用最新的前端技术栈,小于60kb的本地首屏js加载,已经做好大部分项目前期准备工作,并且带有大量示例代码,助...
- Github标星超200K,这10个可视化面板你知道几个
-
在Github上有很多开源免费的后台控制面板可以选择,但是哪些才是最好、最受欢迎的可视化控制面板呢?今天就和大家推荐Github上10个好看又流行的可视化面板:1.AdminLTEAdminLTE是...
- 开箱即用的炫酷中后台前端开源框架第二篇
-
#头条创作挑战赛#1、SoybeanAdmin(1)介绍:SoybeanAdmin是一个基于Vue3、Vite3、TypeScript、NaiveUI、Pinia和UnoCSS的清新优...
- 搭建React+AntDeign的开发环境和框架
-
搭建React+AntDeign的开发环境和框架随着前端技术的不断发展,React和AntDesign已经成为越来越多Web应用程序的首选开发框架。React是一个用于构建用户界面的JavaScrip...
- 基于.NET 5实现的开源通用权限管理平台
-
??大家好,我是为广大程序员兄弟操碎了心的小编,每天推荐一个小工具/源码,装满你的收藏夹,每天分享一个小技巧,让你轻松节省开发效率,实现不加班不熬夜不掉头发,是我的目标!??今天小编推荐一款基于.NE...
- StreamPark - 大数据流计算引擎
-
使用Docker完成StreamPark的部署??1.基于h2和docker-compose进行StreamPark部署wgethttps://raw.githubusercontent.com/a...
- 教你使用UmiJS框架开发React
-
1、什么是Umi.js?umi,中文可发音为乌米,是一个可插拔的企业级react应用框架。你可以将它简单地理解为一个专注性能的类next.js前端框架,并通过约定、自动生成和解析代码等方式来辅助...
- 简单在线流程图工具在用例设计中的运用
-
敏捷模式下,测试团队的用例逐渐简化以适应快速的发版节奏,大家很早就开始运用思维导图工具比如xmind来编写测试方法、测试点。如今不少已经不少利用开源的思维导图组件(如百度脑图...)来构建测试测试...
- 【开源分享】神奇的大数据实时平台框架,让Flink&Spark开发更简单
-
这是一个神奇的框架,让Flink|Spark开发更简单,一站式大数据实时平台!他就是StreamX!什么是StreamX大数据技术如今发展的如火如荼,已经呈现百花齐放欣欣向荣的景象,实时处理流域...
- 聊聊规则引擎的调研及实现全过程
-
摘要本期主要以规则引擎业务实现为例,陈述在陌生业务前如何进行业务深入、调研、技术选型、设计及实现全过程分析,如果你对规则引擎不感冒、也可以从中了解一些抽象实现过程。诉求从硬件采集到的数据提供的形式多种...
- 【开源推荐】Diboot 2.0.5 发布,自动化开发助理
-
一、前言Diboot2.0.5版本已于近日发布,在此次发布中,我们新增了file-starter组件,完善了iam-starter组件,对core核心进行了相关优化,让devtools也支持对IAM...
- 微软推出Copilot Actions,使用人工智能自动执行重复性任务
-
IT之家11月19日消息,微软在今天举办的Ignite大会上宣布了一系列新功能,旨在进一步提升Microsoft365Copilot的智能化水平。其中最引人注目的是Copilot...
- Electron 使用Selenium和WebDriver
-
本节我们来学习如何在Electron下使用Selenium和WebDriver。SeleniumSelenium是ThoughtWorks提供的一个强大的基于浏览器的开源自动化测试工具...
- Quick 'n Easy Web Builder 11.1.0设计和构建功能齐全的网页的工具
-
一个实用而有效的应用程序,能够让您轻松构建、创建和设计个人的HTML网站。Quick'nEasyWebBuilder是一款全面且轻巧的软件,为用户提供了一种简单的方式来创建、编辑...
- 一周热门
- 最近发表
- 标签列表
-
- kubectlsetimage (56)
- mysqlinsertoverwrite (53)
- addcolumn (54)
- helmpackage (54)
- varchar最长多少 (61)
- 类型断言 (53)
- protoc安装 (56)
- jdk20安装教程 (60)
- rpm2cpio (52)
- 控制台打印 (63)
- 401unauthorized (51)
- vuexstore (68)
- druiddatasource (60)
- 企业微信开发文档 (51)
- rendertexture (51)
- speedphp (52)
- gitcommit-am (68)
- bashecho (64)
- str_to_date函数 (58)
- yum下载包及依赖到本地 (72)
- jstree中文api文档 (59)
- mvnw文件 (58)
- rancher安装 (63)
- nginx开机自启 (53)
- .netcore教程 (53)