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

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
云原生网关 MSE Higress,422元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: Java 云原生微服务框架 Quarkus 入门实践



1. 概述

1.1 定义

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

1.2 GraalVM 简介

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

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

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

  • 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 官方性能数据

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

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

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,解压到本地磁盘目录,查看版本信息如下:

image.png

> 基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
>
> * 项目地址:<https://gitee.com/zhijiantianya/yudao-cloud>
> * 视频教程:<https://doc.iocoder.cn/video/>
# windows
PATH环境变量增加路径:D:\Program Files\Java\graalvm-ce-java11-22.2.0\bin
JAVA_HOME配置环境变量:D:\Program Files\Java\graalvm-ce-java11-22.2.0
# linux
wget https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-22.2.0/graalvm-ce-java17-linux-amd64-22.2.0.tar.gz
tar -xvf graalvm-ce-java17-linux-amd64-22.2.0.tar.gz
export GRAALVM_HOME=/home/commons/graalvm-ce-java17-22.2.0
export PATH=$PATH:$GRAALVM_HOME/bin
export JAVA_HOME=${GRAALVM_HOME}
export PATH=$PATH:$JAVA_HOME/bin
export MAVEN_HOME=/home/commons/apache-maven-3.8.6
export PATH=$PATH:$MAVEN_HOME/bin

2.2 创建 Quarkus 工程

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

IDEA 支持创建 Quarkus 项目

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

mvn io.quarkus:quarkus-maven-plugin:create -DprojectGroupId=cn.itxs -DprojectArtifactId=quarkus-web-demo-m -DprojectVersion=1.0-SNAPSHOT -DclassName=FirstResource -Dpath=actions

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

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

目录结构如下:

2.3 IDEA 导入项目

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

2.4 IDEA 运行和调试

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

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

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

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

2.5 打包成普通的 Jar

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

可以直接通过 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 秒的时间就启动完毕了。

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

image.png

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

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

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

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

gu install native-image
# 重新执行打包
mvn package -Pnative

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

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

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

quarkus.native.container-build=true
quarkus.native.native-image-xmx=4096m

# 终端命令中执行打包
mvn clean package -Dnative

2.8 制作 docker 镜像

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

docker build \
-f src/main/docker/Dockerfile.native \
-t bolingcavalry/quarkus-web-demo:0.0.1 .

执行 docker 命令生成成功:

查看镜像已经生成:

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

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



相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
2天前
|
缓存 安全 算法
Java内存模型深度解析与实践应用
本文深入探讨Java内存模型(JMM)的核心原理,揭示其在并发编程中的关键作用。通过分析内存屏障、happens-before原则及线程间的通信机制,阐释了JMM如何确保跨线程操作的有序性和可见性。同时,结合实例代码,展示了在高并发场景下如何有效利用JMM进行优化,避免常见的并发问题,如数据竞争和内存泄漏。文章还讨论了JVM的垃圾回收机制,以及它对应用程序性能的影响,提供了针对性的调优建议。最后,总结了JMM的最佳实践,旨在帮助开发人员构建更高效、稳定的Java应用。
|
8天前
|
缓存 Java 编译器
探索Java中的Lambda表达式及其优化实践
在Java 8中引入的Lambda表达式为函数式编程范式铺平了道路,极大地提升了代码的简洁性和可读性。本文将深入探讨Lambda表达式的内部机制和性能影响,并分享如何在实际开发中有效利用Lambda表达式以提升程序性能和开发效率的策略。 【7月更文挑战第16天】
20 5
|
4天前
|
JSON Java BI
一次Java性能调优实践【代码+JVM 性能提升70%】
这是我第一次对系统进行调优,涉及代码和JVM层面的调优。如果你能看到最后的话,或许会对你日常的开发有帮助,可以避免像我一样,犯一些低级别的错误。本次调优的代码是埋点系统中的报表分析功能,小公司,开发结束后,没有Code Review环节,所以下面某些问题,也许在Code Review环节就可以避免。
53 0
一次Java性能调优实践【代码+JVM 性能提升70%】
|
12天前
|
监控 算法 Java
深入探索Java虚拟机:性能监控与调优实践
在面对日益复杂的企业级应用时,Java虚拟机(JVM)的性能监控和调优显得尤为重要。本文将深入探讨JVM的内部机制,分析常见的性能瓶颈,并提供一系列针对性的调优策略。通过实际案例分析,我们将展示如何运用现代工具对JVM进行监控、诊断及优化,以提升Java应用的性能和稳定性。
|
10天前
|
运维 Cloud Native Devops
云原生架构的演进与实践
【7月更文挑战第14天】在数字化转型的浪潮中,云原生技术作为推动现代软件发展的新引擎,正引领着企业IT架构的变革。本文将探索云原生架构的核心概念、关键技术及其对企业IT策略的影响,同时通过案例分析,揭示云原生在实际应用中的成效与挑战,为读者呈现一幅云原生技术发展与应用的全景图。
27 4
|
9天前
|
监控 Cloud Native 安全
云原生架构下的微服务治理实践
在数字化转型的浪潮中,云原生技术以其灵活性和可扩展性成为现代软件工程的基石。本文将深入探讨云原生架构下微服务治理的实践路径,从微服务的拆分、容器化部署、服务网格的应用到最终的监控与故障排除,提供一套全面的方法论。文章旨在为读者呈现一个清晰的云原生环境下,如何高效管理和维护微服务系统的全景图。
23 2
|
5天前
|
监控 Cloud Native 安全
云原生架构在现代企业中的实践与挑战
本文深入探讨了云原生架构在现代企业中的应用及其面临的主要挑战。通过分析多个行业案例,文章揭示了云原生技术如何促进企业的数字化转型,提高系统的弹性、可扩展性和自动化水平。同时,指出了在实施过程中可能遇到的技术、安全和成本管理等问题,并提供了相应的解决策略,旨在为企业采用云原生架构提供实用的指导和建议。
|
5天前
|
算法 安全 Java
Java并发编程的艺术与实践
【7月更文挑战第19天】在Java的世界中,并发编程是提升应用性能和响应能力的关键。本文将深入探讨如何利用Java的并发工具高效地构建多线程应用程序。我们将从基础的线程管理讲起,逐步过渡到高级的并发框架,如Executors和Futures,以及最新的CompletableFuture。同时,文章还会涵盖线程安全、锁机制、同步器等关键概念,确保读者能够在实战中避免常见的并发陷阱。
16 0
|
10天前
|
Cloud Native 安全 Devops
云原生架构的演进与实践
【7月更文挑战第14天】随着数字化转型的深入,企业对信息技术系统的灵活性、可扩展性及快速迭代能力的要求日益提高。云原生技术作为应对这些挑战的有效方案,其核心价值在于通过容器化、微服务架构、持续集成和持续部署等实践,实现应用的快速开发、部署与自动化管理。本文将探讨云原生架构的关键组成部分、实施策略以及面临的挑战,旨在为读者提供一份云原生技术的实践指南,帮助理解和应用这一前沿技术,推动企业的IT架构向更加灵活、高效和可靠的方向发展。
|
12天前
|
算法 Java 开发者
Java中的多线程编程技巧与实践
在现代软件开发中,多线程编程成为提升应用程序性能和响应能力的关键技术之一。本文将深入探讨Java语言中多线程编程的基础概念、常见问题及其解决方案,帮助开发者更好地理解和应用多线程技术。 【7月更文挑战第12天】
15 0

热门文章

最新文章