0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Java云原生微服务框架Quarkus入门实践

jf_ro2CN3Fa 来源:芋道源码 作者:芋道源码 2022-11-03 14:15 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群


1. 概述

1.1 定义

Quarkus定位要做超声速、亚原子的Java框架,使用最好标准为OpenJDK HotSpot和GraalVM量身定制的Kubernetes Native Java栈;从一开始就是针对Kubernetes设计的云原生优化Java应用开发框架;兼容主流的框架开发模式如Jpa、Netty、Undertow、Hibernate、JWT、Spring。最新版本为2.13.3。

  • Quarkus 官网:https://quarkus.io/
  • Quarkus GitHub:https://github.com/quarkusio/quarkus

1.2 GraalVM 简介

GraalVM 是 Oracle 开发的高性能的多语言运行时 JDK,旨在提高 Java 应用程序的性能,同时消耗更少的资源。

GraalVM 提供了两种运行Java应用程序的方法:在HotSpot JVM上使用 Graal 即时(JIT)编译器或者作为预先(AOT)编译的本机可执行文件。

除了 Java,它还提供了 JavaScript、Ruby、Python 和其他一些流行语言的运行时。GraalVM 的多语言功能使得在一个应用程序中混合编程语言成为可能,同时消除了任何外语调用成本。目前最新版本为 22.3。

cd27fac4-5b3d-11ed-a3b6-dac502259ad0.png
  • GraalVM 可以创建原生可执行文件;
  • GraalVM 提供的原生镜像(native image)功能可以把Java代码预先编译(Ahead-Of-Time,AOT)成独立的可执行文件。该可执行文件包括了应用本身的代码、所依赖的第三方库和 JDK 本身。该执行文件并不运行在 Java 虚拟机之上,而是名为 Substrate 的虚拟机。与运行在传统的 Java 虚拟机上相比,原生可执行文件在运行时的启动速度更快,所耗费的内存资源更少。可执行文件的体积也更小;
  • GraalVM 生成的原生可执行文件与底层平台相关,不能在当前平台之外的其他平台上运行。但对云原生应用来说,这并不是一个问题。云原生应用的设计目标是在容器中运行,所运行的底层平台是固定的。

1.3 为何使用

使用 Spring Boot 的快速开发企业级应用的微服务启动慢,从一个应用从启动到服务可用,一般是数秒。在对 CPU 核数和内存严格限制的情况下,花数十秒启动的情况也屡见不鲜。这样的问题无法适应需要快速重启或快速扩容的场景。不仅如此,内存消耗也很大。如果限制在 1G 时 FullGC 频率变大,且经常触发 OMM 后 Kill 导致 pod 重启,并且启动时间也会变长。

相比之下,集群中使用 GO 语言开发的应用则配置 128M 内存也可正常使用。以 JVM 模式运行的 Java 应用,并不太适合于云原生应用的开发,而拥抱云原生则是未来技术的大趋势。

容器云已经为未来主流,也即是软件都是运行在 K8S 这样的容器集群里。而容器环境需要应用具备启动速度快,资源占用小,响应时间短等特性。Quarkus 顺应这种趋势而生的。

  • 对于云原生应用来说,平台无关性变得无关紧要。云原生应用都是以容器化的形式运行的,所运行的底层平台是固定的;
  • 云原生应用对启动速度的要求比较高。当需要进行水平扩展时,要求这些新的实例必须在足够短的时间内完成启动,从而尽快的处理新增的请求;
  • 云原生应用要求在运行时占用尽可能少的资源。尽可能的减少单个实例占用的资源,就意味着可以用同样的成本,支持更多的访问请求;
  • 云原生应用要求更小的打包体积。云原生应用以容器镜像的形式打包。应用镜像的尺寸越大,所需要的存储空间也会越大,推送和拉取镜像所耗费的时间也会更长。

Quarkus具备企业级应用开发能力。

在 Serverless 服务器架构、微服务、容器、Kubernetes、功能即服务(FaaS)和云环境中运行 Java 而言,考虑了所有这些因素的 Quarkus 堪称是一个有效的解决方案。

1.4 特性

容器优先

构建期即生成云原生镜像执行文件。

Quarkus 为 GraalVM 和 HotSpot 定制应用程序。快速启动、低内存消耗、体积小,在 Kubernetes 这样的容器编排平台上提供了近乎实时的扩展和高密度的内存利用率。这就是使用了编译时引导的技术。

  • 支持 Graal/SubstrateVM
  • 构建时元数据处理
  • 尽量减少 JNI 调用
  • 减少反射的使用
  • 本机映像预启动

Kubernete 原生

构建期即生成云原生镜像执行文件,可以与 Docker 和 Kubernetes 轻松集成,Quarkus 和 Kubernetes 的组合可以伸缩、快速创建轻量级的应用程序。Quarkus 通过工具、预构建的集成、应用程序服务等显著提高了开发人员的工作效率。

命令式和响应式

在设计上 Quarkus 能够在开发应用时无缝地结合熟悉的命令式代码和非阻塞、响应式样式。这对于习惯使用命令式模型而不想切换风格的 Java 开发人员以及使用云原生/响应式方法的开发人员都非常有用。

社区和标准

拥抱 JavaEE 标准,使用 JavaEE 官方 RESTful、CDI 等标准接口。Quarkus 提供了一个内聚的、轻量的全栈框架,包含超过 50 个使用的最佳类库。

开发者友好

学习成本也低,具有统一的配置和简单的本地可执行文件生成,零配置,实时重新加载,80% 的常用标准和 20% 灵活应用。

1.5 官方性能数据

cd3b8238-5b3d-11ed-a3b6-dac502259ad0.png

从图中可以看出,使用 Quarkus 和 GraalVM 的简单的 REST 应用的启动时间仅为 16 毫秒,占用内存仅 12MB。如果使用传统的基于 Java 虚拟机实现,应用的启动时间需要 4.3 秒,占用内存为 136MB。

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://gitee.com/zhijiantianya/ruoyi-vue-pro
  • 视频教程:https://doc.iocoder.cn/video/

2. 实战

入门示例项目步骤:

  • 安装 GraalVM
  • 创建 Quarkus工程
  • IDEA 导入项目
  • IDEA 编码运行和调试
  • 打包成普通的 jar
  • 打包成依赖 GraalVM 的二进制文件
  • 打包成不依赖 GraalVM 的二进制文件
  • 制作成 Docker 镜像

2.1 安装 GraalVM

GraalVM 官方文档:https://www.graalvm.org/22.2/docs/

GraalVM GitHub:https://github.com/graalvm/graalvm-ce-builds/releases

了解 GraalVM 的最新版本 22.3 的使用可以查阅 GraalVM 官方文档。先从 GitHub 下载 GraalVM 。这里先以下载windows版本为例,下载后的文件 graalvm-ce-java11-windows-amd64-22.2.0.zip,解压到本地磁盘目录,查看版本信息如下:

cd51bcf6-5b3d-11ed-a3b6-dac502259ad0.png
>基于SpringCloudAlibaba+Gateway+Nacos+RocketMQ+Vue&Element实现的后台管理系统+用户小程序,支持RBAC动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
>
>*项目地址:
>*视频教程:

#windows
PATH环境变量增加路径:D:ProgramFilesJavagraalvm-ce-java11-22.2.0in
JAVA_HOME配置环境变量:D:ProgramFilesJavagraalvm-ce-java11-22.2.0

#linux
wgethttps://github.com/graalvm/graalvm-ce-builds/releases/download/vm-22.2.0/graalvm-ce-java17-linux-amd64-22.2.0.tar.gz
tar-xvfgraalvm-ce-java17-linux-amd64-22.2.0.tar.gz

exportGRAALVM_HOME=/home/commons/graalvm-ce-java17-22.2.0
exportPATH=$PATH:$GRAALVM_HOME/bin
exportJAVA_HOME=${GRAALVM_HOME}
exportPATH=$PATH:$JAVA_HOME/bin
exportMAVEN_HOME=/home/commons/apache-maven-3.8.6
exportPATH=$PATH:$MAVEN_HOME/bin

2.2 创建 Quarkus 工程

万丈高楼平地起,首先是创建 Quarkus 项目。与 Spring Boot类似,Quarkus 为我们提供了多种方式创建 Quarkus 工程,下面对常用的 3 种进行介绍。

IDEA 支持创建 Quarkus 项目

cd607f98-5b3d-11ed-a3b6-dac502259ad0.png

maven 命令支持创建(使用的是 apache-maven-3.8.6)

mvnio.quarkuscreate-DprojectGroupId=cn.itxs-DprojectArtifactId=quarkus-web-demo-m-DprojectVersion=1.0-SNAPSHOT-DclassName=FirstResource-Dpath=actions

通过官方提供 Quarkus 代码生成 https://code.quarkus.io/ 页面在线创建,这种方法直观且简单(不用记命令),推荐使用。添加自己的 maven 配置,然后下载网站生成的工程包。

cd76e620-5b3d-11ed-a3b6-dac502259ad0.png

我们先以第三种为例说明,通过在线网页生成 quarkus-web-demo.zip。解压后用 tree 命令看看项目结构,是一个标准的 maven 工程,多了个 docker 目录,里面有几个 Dockerfile 文件相关的问题。

目录结构如下:

cd9f54b6-5b3d-11ed-a3b6-dac502259ad0.png

2.3 IDEA 导入项目

IDEA 导入上面的 Maven项目,几分钟下载依赖后项目已成功导入。可以看到 Quarkus 项目的 pom 文件核心依赖为 quarkus-bom。Quarkus 官方认为传统的接口就是一个个对外方法的资源,所以在 Quarkus 里面是以 Resource 资源的概念来进行的。

cdacad46-5b3d-11ed-a3b6-dac502259ad0.png

2.4 IDEA 运行和调试

在 IDEA 要运行和调试 Quarkus 的项目,首先得在项目添加 SDK,并将路径指向刚才解压的目录。

cdc22e46-5b3d-11ed-a3b6-dac502259ad0.png

修改项目的 GreetingResource 源文件示例方法返回值内容"Hello ITXS RESTEasy",同样也修改单元测试 GreetingResourceTest 的测试方法的值为上面的内容,在运行菜单中点击添加新的 Quarkus 配置。

cddff48a-5b3d-11ed-a3b6-dac502259ad0.png

新建后点击运行按钮(mvn compile quarkus:dev ),正常运行输出日志如下:

cdfed396-5b3d-11ed-a3b6-dac502259ad0.png

访问本地 http://localhost:8080/hello 后可以看到正确的返回结果,同样也可以直接点击调试按钮进入调试模式。

ce217694-5b3d-11ed-a3b6-dac502259ad0.png

2.5 打包成普通的 Jar

通过 maven 的 package 打包后,生成打包目录如下:

ce336110-5b3d-11ed-a3b6-dac502259ad0.png

可以直接通过 java -jar 运行 quarkus-app 目录下 quarkus-run.jar 和 quarkus-web-demo-1.0.0-SNAPSHOT-native-image-source-jar 目录下的 quarkus-web-demo-1.0.0-SNAPSHOT-runner.jar。不到 1 秒的时间就启动完毕了。

访问上面测试地址同样可以看到正确的结果:

ce4ce5b8-5b3d-11ed-a3b6-dac502259ad0.png

2.6 打包成依赖 GraalVM 二进制文件

此方法打包的二进制文件仍需要依赖 GraalVM,但由于代码已经做了静态编译处理,所以执行效率有大幅提升,比较适合容器化启动。

先安装 VS C++依赖,下载 Visual Studio Installer,需要取消中文并选择英文。然后使用 powershell 进入到项目根目录,执行 mvn package -Pnative 命令后报错:

ce61adae-5b3d-11ed-a3b6-dac502259ad0.png

根据提示安装 native-image 执行安装命令和确认是否配置了 GRAALVM_HOME、JAVA_HOME 环境变量

guinstallnative-image
#重新执行打包
mvnpackage-Pnative
ce71349a-5b3d-11ed-a3b6-dac502259ad0.png

直接运行生成的可执行文件 quarkus-web-demo-1.0.0-SNAPSHOT-runner,确实飞快,启动时间只要 0.033s,访问hello也正常显示。

ce7fbc68-5b3d-11ed-a3b6-dac502259ad0.png

2.7 打包成不依赖 GraalVM 的二进制文件

需要本机先装有 docker 的环境,这里用的是 docker desktop。打包有多种方法,可以直接 maven 参数构建,也可以在 appllications.properties 文件中增加构建参数。

quarkus.native.container-build=true
quarkus.native.native-image-xmx=4096m
ce9cb8ea-5b3d-11ed-a3b6-dac502259ad0.png
#终端命令中执行打包
mvncleanpackage-Dnative
ceb9a234-5b3d-11ed-a3b6-dac502259ad0.png

2.8 制作 docker 镜像

直接通过 Dockerfile.native 制作 docker 镜像:

dockerbuild
-fsrc/main/docker/Dockerfile.native
-tbolingcavalry/quarkus-web-demo:0.0.1.

执行 docker 命令生成成功:

ceca1902-5b3d-11ed-a3b6-dac502259ad0.png

查看镜像已经生成:

cee6a158-5b3d-11ed-a3b6-dac502259ad0.png

通过 docker run 命令启动后查看容器的信息:

cefbabde-5b3d-11ed-a3b6-dac502259ad0.png

通过 curl -L http://172.17.0.2:8080/hello -w ' ' 也可以正常访问。

cf14eca2-5b3d-11ed-a3b6-dac502259ad0.png


审核编辑 :李倩

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • JAVA
    +关注

    关注

    20

    文章

    3015

    浏览量

    117030
  • 框架
    +关注

    关注

    0

    文章

    404

    浏览量

    18529
  • 微服务
    +关注

    关注

    0

    文章

    152

    浏览量

    8155

原文标题:Java 云原生微服务框架 Quarkus 入门实践

文章出处:【微信号:芋道源码,微信公众号:芋道源码】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    新一代微服务全家桶AlibabaCloud+SpringCloud实战

    吃透双云微服务架构,职场晋升架构师快车道 2026年,一场静默的架构革命正在重塑整个技术职场。(搜星 课it。top) 当你还在纠结\"要不要学K8s\"的时候,头部大厂的技术
    发表于 05-18 17:04

    SGG-北京总部Java20250625-12月结课

    成功的核心逻辑。通过扎实的底层原理、先进的微服务架构、严谨的工程化实践以及前沿的 AI 融合技术,学员们构建了坚不可摧的技术壁垒。毕业不是终点,而是新征程的起点。带着满载的干货与实战经验,这批新生代的 Java 工程师必将为科技
    发表于 05-01 17:33

    黑马-Java+AI新版V16零基础就业班百度云网盘下载+Java+AI全栈开发工程师

    AI 能力有两条典型路径。初级做法是独立部署 AI 模型服务(Python 推理端),Java 业务层通过 HTTP/RPC 调用获取结果。这种方式开发快、解耦好,但延迟与稳定性受网络调用影响。进阶
    发表于 05-01 11:29

    [完结15章]Java转 AI高薪领域必备-从0到1打通生产级AI Agent开发

    必须转Python”。事实上,在企业级生产环境中,Python往往只停留在算法训练阶段,真正让AI能力落地并产生商业价值的,必然依赖Java强大的高并发处理与微服务治理能力。 转型的第一步,是掌握
    发表于 04-30 13:46

    Springboot+SpringData+SpringCloud微服务架构课程

    不再是加分项,而是必选项。而在 Java 生态中,SpringCloud 无疑是微服务领域的“事实标准”。然而,从会用 SpringCloud 组件到真正落地一个高可用、高并发的微服务系统,中间隔着巨大的鸿沟。这正是“落地实战”
    的头像 发表于 03-19 16:08 583次阅读

    基于OpenTelemetry的全链路追踪微服务可观测性实践

    微服务拆分到第三年,我们的服务数量从最初的5个膨胀到了47个。一个用户下单请求要经过API Gateway -> 用户服务 -> 商品服务 -> 库存
    的头像 发表于 02-26 15:43 765次阅读

    码神之路Netty-从零实现RPC框架课分享

    面向未来的分布式基石:Netty 从零实现 RPC 框架全体系实战 在微服务架构与云原生技术大行其道的今天,分布式系统已成为互联网应用的标准形态。而在这些庞大系统的底层,隐藏着一个至关重要的通信引擎
    的头像 发表于 02-13 11:38 200次阅读

    Istio服务网格生产环境性能调优的最佳实践

    随着微服务架构的普及,服务间通信的复杂度呈指数级增长。传统的应用层负载均衡和服务发现方案已经无法满足现代云原生应用的需求。Istio作为目前最成熟的
    的头像 发表于 01-20 15:40 461次阅读

    【技术分享】Systemd原生服务配置最佳实践(下)

    上期我们说到sysv的规范,创建以及示例,那么我们今天就来讲讲Systemd的原生服务配置。为何要迁移到Systemd原生服务?尽管规范化的SysV脚本可临时解决问题,但可能存在以下缺
    的头像 发表于 10-29 11:40 604次阅读
    【技术分享】Systemd<b class='flag-5'>原生</b><b class='flag-5'>服务</b>配置最佳<b class='flag-5'>实践</b>(下)

    香港服务器支持Docker和Kubernetes吗?

    和Kubernetes的部署与运行? 答案是肯定的,而且香港服务器由于其独特的优势,往往是部署容器化应用的绝佳选择。 下面,我们将从技术支持、网络优势、实践指南和注意事项等方面,全面解析香港服务器与
    的头像 发表于 10-21 15:47 1017次阅读

    如何基于Nginx构建微服务网关

    今天,我将分享我们团队如何基于Nginx构建了一个日均处理10亿+请求的微服务网关,以及踩过的那些坑。这套方案已经稳定运行2年+,经历过多次大促考验。
    的头像 发表于 09-02 16:29 1057次阅读

    如何构建高可用Prometheus监控体系

    云原生时代,传统监控工具已经无法满足微服务架构的复杂需求。Prometheus凭借其Pull模式、多维数据模型和强大的查询语言PromQL,成为了CNCF毕业项目中的监控标杆。
    的头像 发表于 08-01 09:10 1083次阅读

    电商API的微服务架构优化策略

    ​ 随着电子商务的快速发展,API(应用程序编程接口)已成为电商平台的核心组件,负责连接用户、商家和后台系统。微服务架构通过将应用拆分为独立、可扩展的服务单元,显著提升了系统的灵活性和可维护性。然而
    的头像 发表于 07-23 14:30 783次阅读
    电商API的<b class='flag-5'>微服务</b>架构优化策略

    安卓原生兼容服务

    安卓原生兼容服务器的定义 安卓原生兼容服务器‌指基于Android系统内核和服务框架构建的
    的头像 发表于 06-19 17:32 725次阅读

    云原生环境里Nginx的故障排查思路

    本文聚焦于云原生环境下Nginx的故障排查思路。随着云原生技术的广泛应用,Nginx作为常用的高性能Web服务器和反向代理服务器,在容器化和编排的环境中面临着新的故障场景和挑战。
    的头像 发表于 06-17 13:53 1257次阅读
    <b class='flag-5'>云原生</b>环境里Nginx的故障排查思路