Java云原生崛起微服务框架Quarkus入门实践
@
概述
定义
Quarkus 官网地址 https://quarkus.io/
Quarkus 官网文档 https://hbase.apache.org/book.html
Quarkus GitHub源码地址 https://github.com/quarkusio/quarkus
Quarkus定位要做超声速、亚原子的Java框架,使用最好标准为OpenJDK HotSpot和GraalVM量身定制的Kubernetes Native Java栈;从一开始就是针对Kubernetes设计的云原生优化Java应用开发框架;兼容主流的框架开发模式如Jpa、Netty、Undertow、Hibernate、JWT、Spring。最新版本为2.13.2
GraalVM简介
GraalVM是Oracle开发的高性能的多语言运行时JDK,提高Java应用程序的性能,同时消耗更少的资源。GraalVM提供了两种运行Java应用程序的方法:在HotSpot JVM上使用Graal即时(JIT)编译器,或者作为预先(AOT)编译的本机可执行文件。除了Java,它还提供了JavaScript、Ruby、Python和其他一些流行语言的运行时。GraalVM的多语言功能使得在一个应用程序中混合编程语言成为可能,同时消除了任何外语调用成本。目前最新版本为22.2。
- GraalVM可以创建原生可执行文件。
- GraalVM提供的原生镜像(native image)功能可以把Java代码预先编译(Ahead-Of-Time,AOT)成独立的可执行文件。该可执行文件包括了应用本身的代码、所依赖的第三方库和 JDK 本身。该执行文件并不运行在Java虚拟机之上,而是名为Substrate的虚拟机。与运行在传统的Java虚拟机上相比,原生可执行文件在运行时的启动速度更快,所耗费的内存资源更少。可执行文件的体积也更小。
- GraalVM生成的原生可执行文件与底层平台相关,不能在当前平台之外的其他平台上运行。但对云原生应用来说,这并不是一个问题。云原生应用的设计目标是在容器中运行,所运行的底层平台是固定的。
为何使用
相信使用SpringBoot的快速开发企业级应用微服务启动慢,从一个应用从启动到服务可用,一般是数秒,在对CPU核数和内存严格限制的情况下,花数十秒启动的情况也屡见不鲜,这样的问题无法适应需要快速重启或快速扩容的场景;而且内存消耗也很大如内存,如果限制在1G时FullGC频率变大,且经常触发OMM后Kill导致pod重启,并且启动时间也会变长,而相比之下,集群中使用go语言开发的应用则配置128M内存也可正常使用。以JVM模式运行的Java应用,并不太适合于云原生应用的开发,而拥抱云原生则是未来技术的大趋势。
- 容器云已经为未来主流,也即是软件都是运行在k8s这样的容器集群里。而容器环境需要应用具备启动速度快,资源占用小,响应时间短等特性。Quarkus顺应这种趋势而生的。
- 对于云原生应用来说,平台无关性变得无关紧要。云原生应用都是以容器化的形式运行的,所运行的底层平台是固定的。
- 云原生应用对启动速度的要求比较高。当需要进行水平扩展时,要求这些新的实例必须在足够短的时间内完成启动,从而尽快的处理新增的请求。
- 云原生应用要求在运行时占用尽可能少的资源。尽可能的减少单个实例占用的资源,就意味着可以用同样的成本,支持更多的访问请求。
- 云原生应用要求更小的打包体积。云原生应用以容器镜像的形式打包。应用镜像的尺寸越大,所需要的存储空间也会越大,推送和拉取镜像所耗费的时间也会更长。
- Quarkus具备企业级应用开发能力。
- 在Serverless服务器架构、微服务、容器、Kubernetes、功能即服务(FaaS)和云环境中运行 Java 而言,考虑了所有这些因素的Quarkus 堪称是一个有效的解决方案。
特性
容器优先:构建期即生成云原生镜像执行文件;Quarkus为GraalVM和HotSpot定制应用程序。快速启动、低内存消耗、体积小,在Kubernetes这样的容器编排平台上提供了近乎实时的扩展和高密度的内存利用率。这就是使用了编译时引导的技术。
- 支持 Graal/SubstrateVM。
- 构建时元数据处理。
- 尽量减少JNI调用。
- 减少反射的使用。
- 本机映像预启动。
Kubernete原生:构建期即生成云原生镜像执行文件,可以与docker和kubernetes轻松集成,Quarkus和Kubernetes的组合可以伸缩、快速创建轻量级的应用程序。Quarkus通过工具、预构建的集成、应用程序服务等显著提高了开发人员的工作效率。
命令式和响应式:在设计上Quarkus 能够在开发应用时无缝地结合熟悉的命令式代码和非阻塞、响应式样式。 这对于习惯使用命令式模型而不想切换风格的 Java 开发人员以及使用云原生/响应式方法的开发人员都非常有用。
社区和标准:拥抱JavaEE标准,使用JavaEE官方Restful、CDI等标准接口。Quarkus提供了一个内聚的、轻量的全栈框架,包含超过50个使用的最佳类库。。
对开发者友好:学习成本也低,具有统一的配置和简单的本地可执行文件生成,零配置,实时重新加载,80%的常用标准和20%灵活应用。
官方性能
从图中可以看出,使用Quarkus和 GraalVM的简单的REST应用的启动时间仅为16毫秒,占用内存仅12MB。如果使用传统的基于Java虚拟机实现,应用的启动时间需要4.3秒,占用内存为136MB。
实战
入门示例
步骤
- 安装GraalVM
- 创建quarkus工程
- IDE导入项目
- Idea编码运行和调试
- 打包成普通的jar
- 打包成依赖GraalVM的二进制文件
- 打包成不依赖GraalVM的二进制文件
- 制作成Docker镜像
安装GraalVM
了解GraalVM的最新版本22.2的使用可以查阅GraalVM官方文档:https://www.graalvm.org/22.2/docs/ ,先从GitHub下载GraalVM,https://github.com/graalvm/graalvm-ce-builds/releases ,这里先以下载windows版本为例,下载后的文件graalvm-ce-java11-windows-amd64-22.2.0.zip,解压到本地磁盘目录,查看版本信息如下
# 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
创建quarkus工程
万丈高楼平地起,首先是创建quarkus项目,与SpringBoot类似,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-web-demo.zip,解压后用tree命令看看项目结构,是一个标准的maven工程,多了个docker目录,里面有几个Dockerfile文件相关的问题,目录结构如下:
Idea导入项目
Idea导入上面的Maven项目,几分钟下载依赖后项目已成功导入,可以看到quarkus项目的pom文件核心依赖为quarkus-bom,quarkus官方认为传统的接口就是一个个对外方法的资源所以在quarkus里面是以Resource资源的概念来进行的。
Idea运行和调试
在Idea要运行和调试quarkus的项目,首先得在项目添加SDK,并将路径指向刚才解压的目录
修改项目的GreetingResource源文件示例方法返回值内容"Hello ITXS RESTEasy",同样也修改单元测试GreetingResourceTest的测试方法的值为上面的内容,在运行菜单中点击添加新的Quarkus配置
新建后点击运行按钮(mvn compile quarkus:dev ),正常运行输出日志如下
访问本地http://localhost:8080/hello 后可以看到正确的返回结果,同样也可以直接点击调试按钮进入调试模式
打包成普通的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秒的时间就启动完毕了,访问上面测试地址同样可以看到正确的结果
打包成依赖GraalVM二进制文件
此方法打包的二进制文件仍需要依赖graalvm,但代码已经做了静态编译处理,所以执行效率有大幅提升,比较适合容器化启动。
先安装vs c++依赖,下载Visual Studio Installer,需要取消中文并选择英文。然后使用power shell进入到项目根目录,执行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也正常显示。
打包成不依赖GraalVM的二进制文件
需要本机先装有docker的环境,这里用的是docker desktop,有多种方法,可以直接maven参数构建,也可以在appllications.properties文件中增加构建参数
quarkus.native.container-build=true
quarkus.native.native-image-xmx=4096m
# 终端命令中执行打包
mvn clean package -Dnative
制作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' 访问页面也是正常的
**本人博客网站 **IT小神 www.itxiaoshen.com
Java云原生崛起微服务框架Quarkus入门实践的更多相关文章
- 云原生 go-zero 微服务框架
0. go-zero介绍 go-zero是一个集成了各种工程实践的web和rpc框架.通过弹性设计保障了大并发服务端的稳定性,经受了充分的实战检验. go-zero包含极简的API定义和生成工具goc ...
- Surging 微服务框架使用入门
原文:Surging 微服务框架使用入门 前言 本文非 Surging 官方教程,只是自己学习的总结.如有哪里不对,还望指正. 我对 surging 的看法 我目前所在的公司采用架构就是类似与Sur ...
- golang微服务框架go-micro 入门笔记2.4 go-micro service解读
本章节阐述go-micro 服务发现原理 go-micro架构 下图来自go-micro官方 阅读本文前你可能需要进行如下知识储备 golang分布式微服务框架go-micro 入门笔记1:搭建go- ...
- golang微服务框架go-micro 入门笔记2.3 micro工具之消息接收和发布
本章节阐述micro消息订阅和发布相关内容 阅读本文前你可能需要进行如下知识储备 golang分布式微服务框架go-micro 入门笔记1:搭建go-micro环境, golang微服务框架go-mi ...
- golang微服务框架go-micro 入门笔记2.2 micro工具之微应用利器micro web
micro web micro 功能非常强大,本文将详细阐述micro web 命令行的功能 阅读本文前你可能需要进行如下知识储备 golang分布式微服务框架go-micro 入门笔记1:搭建go- ...
- 微服务 + Docker + Kubernetes 入门实践 目录
微服务 + Docker + Kubernetes 入门实践: 微服务概念 微服务的一些基本概念 环境准备 Ubuntu & Docker 本文主要讲解在 Ubuntu 上安装和配置 Dock ...
- 【非官方】Surging 微服务框架使用入门
前言 本文非 Surging 官方教程,只是自己学习的总结.如有哪里不对,还望指正. 我对 surging 的看法 我目前所在的公司采用架构就是类似与Surging的RPC框架,在.NET 4.0框架 ...
- golang微服务框架go-micro 入门笔记2.1 micro工具之micro api
micro api micro 功能非常强大,本文将详细阐述micro api 命令行的功能 重要的事情说3次 本文全部代码https://idea.techidea8.com/open/idea.s ...
- Java 微服务框架 Redkale 入门介绍
Redkale 功能 Redkale虽然只有1.xM大小,但是麻雀虽小五脏俱全.既可作为服务器使用,也可当工具包使用.作为独立的工具包提供以下功能:1.convert包提供JSON的序列化和反序列化功 ...
随机推荐
- 使用Typora+EasyBlogImageForTypora写博客,无图床快速上传图片
如今,使用markdown攥写博客已成为主流,而Typora作为markdown的主流工具,广受大众好评,本文讲述从Typora的安装到快速将Typora写好的博文上传到博客园 Typora下载 Ty ...
- 【Java面试】这道互联网高频面试题难住了80%的程序员?索引什么时候失效?
"索引什么时候失效?" 面试过程中,突如其来的一个问题,是不是有点懵? 没关系,关注我,面试不迷路. 我是Mic,一个工作了14年的Java程序员. 索引失效涉及到的知识点非常多, ...
- kali下安装Nessus
Kali安装Nessus 说明 Nessus是一款基于插件的系统漏洞扫描和分析软件 一.安装 1.下载安装包 https://www.tenable.com/downloads/nessus 查看ka ...
- ZJU-199001 第三周练习 2 数字特征值 位运算算法
题目 对数字求特征值是常用的编码算法,奇偶特征是一种简单的特征值. 对于一个整数, 从个位开始对每一位数字编号, 个位是 \(1\) 号, 十位是 \(2\) 号, 以此类推. 这个整数在第位上的数字 ...
- 【MySQL】从入门到掌握3-WorkBench
上期:[MySQL]从入门到掌握2-下载安装 我们安装完MySQL Server的时候,是没有任何界面的. 不过很好,我们有一个工具,MySQL Workbench,他可以简化我们的操作,有点像Jav ...
- 第九十七篇:CSS的选择器及优先级
好家伙,来补一点关于CSS的基础 1.id选择器 id 选择器可以为标有特定 id 的 HTML 元素指定特定的样式 使用#号来定义样式 2.class选择器 class 选择器用于描述一组元素的样式 ...
- Linux 配置ODBC连接Oracle
在使用kdb_database_link 扩展插件连接Oracle数据库时,必须先配置ODBC,确保通过ODBC能连接Oracle数据库.以下是配置ODBC的过程. 一.安装ODBC 1.安装 [ro ...
- 【读书笔记】C#高级编程 第二十五章 事务处理
(一)简介 事务的主要特征是,任务要么全部完成,要么都不完成. (二)概述 事务由事务管理器来管理和协调.每个影响事务结果的资源都由一个资源管理器来管理.事务管理器与资源管理器通信,以定义事务的结果. ...
- URL slug是什么?
URL slug是什么? URL slug是 URL 中最后一个反斜杠之后的部分. 为什么slug 对 SEO 很重要? slug 对于关键字 SEO 来说非常强大.如果用户要在 Google 搜索& ...
- JS数据结构之 Map
JS数据结构之 Map Map介绍 Map(映射)是ES6引入的一种数据结构.这是一种存储键值对列表很方便的方法,类似于其他编程语言的哈希表. HashMap(哈希表),也叫做散列表.是根据关键码值 ...