OpenShift 之 Quarkus(1)创建第一个Quarkus应用
《OpenShift 4.x HOL教程汇总》
有关RedHat的Quarkus的优势就不详细介绍了,总归就是通过将Java应用编译成可执行文件,可以让应用启动超快,占内存超少。非常适合企业Java应用的微服务化和大规模部署,另外在Serverless等场景也非常适合。
本文基于quarkus.io的quarkus-quickstarts示例,说明如何实现一个最简单的Quarkus应用,并将其以可执行文件的形态部署到OpenShift上运行。
安装环境
- 安装OpenJDK11、GraavlVM和可执行程序插件。如果下载地址有变化,可以到GraavlVM项目中(https://github.com/graalvm/graalvm-ce-builds/releases)下载。
$ sudo yum install -y java-11
$ GRAALVM_VERSION=21.2.0
$ JAVA_VERSION=java11
$ curl -L https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-$GRAALVM_VERSION/graalvm-ce-$JAVA_VERSION-linux-amd64-$GRAALVM_VERSION.tar.gz | tar -xzf -
$ JAVA_HOME=$PWD/graalvm-ce-$JAVA_VERSION-$GRAALVM_VERSION
$ PATH=./:$JAVA_HOME/bin/:$PATH
$ gu install native-image
Downloading: Component catalog from www.graalvm.org
Processing Component: Native Image
Downloading: Component native-image: Native Image from github.com
Installing new component: Native Image (org.graalvm.native-image, version 21.2.0)$ gu list
ComponentId Version Component name Stability Origin
---------------------------------------------------------------------------------------------------------------------------------
graalvm 21.2.0 GraalVM Core -
js 21.2.0 Graal.js Supported
native-image 21.2.0 Native Image Early adopter github.com$ java -version
openjdk version "11.0.12" 2021-07-20
OpenJDK Runtime Environment GraalVM CE 21.2.0 (build 11.0.12+6-jvmci-21.2-b08)
OpenJDK 64-Bit Server VM GraalVM CE 21.2.0 (build 11.0.12+6-jvmci-21.2-b08, mixed mode, sharing)
- 确保RHEL上有gcc编译所需环境。
$ sudo yum -y install gcc glibc-devel zlib-devel gcc-c++
- 下载Maven,然后可以查看 Quarkus 的Maven plugin 信息。
$ MAVEN_VERSION=3.8.4
$ curl -L https://archive.apache.org/dist/maven/maven-3/$MAVEN_VERSION/binaries/apache-maven-$MAVEN_VERSION-bin.tar.gz | tar -xzf -
$ MAVEN_HOME=$PWD/apache-maven-$MAVEN_VERSION
$ PATH=$PATH:$MAVEN_HOME/bin/
$ mvn -Dplugin=io.quarkus:quarkus-maven-plugin help:describe
- 最后还可以下载 Quarkus 的 cli 客户端。
$ QUARKUS_VERSION=2.7.4
$ curl -L https://github.com/quarkusio/quarkus/releases/download/$QUARKUS_VERSION.Final/quarkus-cli-$QUARKUS_VERSION.Final.tar.gz | tar -xzf -
$ PATH=$PATH:$PWD/quarkus-cli-$QUARKUS_VERSION.Final/bin/
Greeting应用
- 根据模板生成应用框架目录。
$ mvn io.quarkus:quarkus-maven-plugin:$QUARKUS_VERSION.Final:create \-DprojectGroupId=com.example \-DprojectArtifactId=hello \-DclassName="com.example.quarkus.Greeting" \-Dpath="/hello"
$ cd hello
也可以用 quarkus 命令生成应用资源。
$ quarkus create com.example:hello
- 以开发模式运行应用。成功启动后显示以下三行,其中“Profile dev activated. Live Coding activated”说明是运行在开发模式(代码更改后Quarkus会自动编译和加载应用),而“[cdi, resteasy]”是该应用加载的Quarkus应用插件。
$ mvnw quarkus:dev
。。。
__ ____ __ _____ ___ __ ____ ______--/ __ \/ / / / _ | / _ \/ //_/ / / / __/-/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \
--\___\_\____/_/ |_/_/|_/_/|_|\____/___/
2022-03-13 14:01:48,176 INFO [io.quarkus] (Quarkus Main Thread) hello 1.0.0-SNAPSHOT on JVM (powered by Quarkus 2.7.4.Final) started in 4.768s. Listening on: http://localhost:80802022-03-13 14:01:48,244 INFO [io.quarkus] (Quarkus Main Thread) Profile dev activated. Live Coding activated.
2022-03-13 14:01:48,246 INFO [io.quarkus] (Quarkus Main Thread) Installed features: [cdi, resteasy, smallrye-context-propagation, vertx]
也可执行以下命令:
$ quarkus dev
- 在第二个终端窗口访问应用,可以得到“hello”返回结果。
$ curl -w "\n" http://localhost:8080/hello
Hello RESTEasy
- 停止第一个终端中运行的应用Quarkus应用,然后执行以下功能测试(其中测试代码在src/test/java/com/example/quarkus目录中),确认通过测试场景。
$ mvnw test
。。。
[INFO] Results:
[INFO]
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
。。。
- 在第一个终端中再次根据(2)步骤运行hello应用。
- 修改src/main/java/com/example/quarkus/Greeting.java文件文件,将返回结果设为“hello world”。
[...]
@Path("/hello")
public class Greeting {@GET@Produces(MediaType.TEXT_PLAIN)public String hello() {return "Hello World";}
}
- 在第一个终端窗口确认有以下新的输出,说明quarkus发现代码变化,并自动重新编译并运行了新版应用。
。。。
2022-03-13 14:06:04,752 INFO [io.qua.dep.dev.RuntimeUpdatesProcessor] (vert.x-worker-thread-0) Restarting quarkus due to changes in Greeting.class.
2022-03-13 14:06:04,814 INFO [io.quarkus] (Quarkus Main Thread) hello stopped in 0.044s
__ ____ __ _____ ___ __ ____ ______--/ __ \/ / / / _ | / _ \/ //_/ / / / __/-/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \
--\___\_\____/_/ |_/_/|_/_/|_|\____/___/
2022-03-13 14:06:05,690 INFO [io.quarkus] (Quarkus Main Thread) hello 1.0.0-SNAPSHOT on JVM (powered by Quarkus 2.7.4.Final) started in 0.857s. Listening on: http://localhost:80802022-03-13 14:06:05,692 INFO [io.quarkus] (Quarkus Main Thread) Profile dev activated. Live Coding activated.
2022-03-13 14:06:05,693 INFO [io.quarkus] (Quarkus Main Thread) Installed features: [cdi, resteasy, smallrye-context-propagation, vertx]
2022-03-13 14:06:05,694 INFO [io.qua.dep.dev.RuntimeUpdatesProcessor] (vert.x-worker-thread-0) Live reload total time: 1.959s
- 在第二个终端再次访问应用,确认返回结果已经变化。
$ curl -w "\n" http://localhost:8080/hello
Hello World
- 撤销(6)对Greeting.java代码的修改。如果不修改,则无法通过自动Test。
- 现将Java应用打包,然后运行应用。再次执行(3)访问应用,最后退出应用运行。
$ mvnw package
$ java -jar target/quarkus-app/quarkus-run.jar
也可执行以下命令打包:
$ quarkus build
- Java应用编译成可执行应用,然后运行。再次执行(3)访问应用,最后退出应用运行。
$ mvnw package -Pnative
。。。
[INFO] [io.quarkus.deployment.pkg.steps.NativeImageBuildStep] Running Quarkus native-image plugin on GraalVM 21.2.0 Java 11 CE (Java Version 11.0.12+6-jvmci-21.2-b08)
[INFO] [io.quarkus.deployment.pkg.steps.NativeImageBuildRunner] /home/xiaoyliu-redhat.com/graalvm-ce-java11-21.2.0/bin/native-image -J-Djava.util.logging.manager=org.jboss.logmanager.LogManager -J-Dsun.nio.ch.maxUpdateArraySize=100 -J-Dvertx.logger-delegate-factory-class-name=io.quarkus.vertx.core.runtime.VertxLogDelegateFactory -J-Dvertx.disableDnsResolver=true -J-Dio.netty.leakDetection.level=DISABLED -J-Dio.netty.allocator.maxOrder=3 -J-Duser.language=en -J-Duser.country=US -J-Dfile.encoding=UTF-8 -H:-ParseOnce -J--add-exports=java.security.jgss/sun.security.krb5=ALL-UNNAMED -J--add-opens=java.base/java.text=ALL-UNNAMED -H:InitialCollectionPolicy=com.oracle.svm.core.genscavenge.CollectionPolicy\$BySpaceAndTime -H:+JNI -H:+AllowFoldMethods -J-Djava.awt.headless=true -H:FallbackThreshold=0 -H:+ReportExceptionStackTraces -H:-AddAllCharsets -H:EnableURLProtocols=http -H:+InlineBeforeAnalysis -H:NativeLinkerOption=-no-pie -H:-UseServiceLoaderFeature -H:+StackTrace hello-1.0.0-SNAPSHOT-runner -jar hello-1.0.0-SNAPSHOT-runner.jar
[hello-1.0.0-SNAPSHOT-runner:6265] classlist: 9,924.75 ms, 0.96 GB
[hello-1.0.0-SNAPSHOT-runner:6265] (cap): 1,281.13 ms, 0.96 GB
[hello-1.0.0-SNAPSHOT-runner:6265] setup: 5,017.74 ms, 0.96 GB
15:20:24,727 INFO [org.jbo.threads] JBoss Threads version 3.4.2.Final
[hello-1.0.0-SNAPSHOT-runner:6265] (clinit): 930.44 ms, 1.53 GB
[hello-1.0.0-SNAPSHOT-runner:6265] (typeflow): 55,758.93 ms, 1.53 GB
[hello-1.0.0-SNAPSHOT-runner:6265] (objects): 61,720.18 ms, 1.53 GB
[hello-1.0.0-SNAPSHOT-runner:6265] (features): 1,755.63 ms, 1.53 GB
[hello-1.0.0-SNAPSHOT-runner:6265] analysis: 122,008.40 ms, 1.53 GB
[hello-1.0.0-SNAPSHOT-runner:6265] universe: 8,794.51 ms, 1.95 GB
[hello-1.0.0-SNAPSHOT-runner:6265] (parse): 24,436.11 ms, 2.27 GB
[hello-1.0.0-SNAPSHOT-runner:6265] (inline): 13,982.62 ms, 2.17 GB
[hello-1.0.0-SNAPSHOT-runner:6265] (compile): 100,145.05 ms, 2.35 GB
[hello-1.0.0-SNAPSHOT-runner:6265] compile: 142,020.03 ms, 2.35 GB
[hello-1.0.0-SNAPSHOT-runner:6265] image: 8,985.69 ms, 2.28 GB
[hello-1.0.0-SNAPSHOT-runner:6265] write: 1,249.15 ms, 2.28 GB
[hello-1.0.0-SNAPSHOT-runner:6265] [total]: 298,664.67 ms, 2.28 GB
# Printing build artifacts to: /home/xiaoyliu-redhat.com/hello/target/hello-1.0.0-SNAPSHOT-native-image-source-jar/hello-1.0.0-SNAPSHOT-runner.build_artifacts.txt
[INFO] [io.quarkus.deployment.pkg.steps.NativeImageBuildRunner] objcopy --strip-debug hello-1.0.0-SNAPSHOT-runner
[INFO] [io.quarkus.deployment.QuarkusAugmentor] Quarkus augmentation completed in 304810ms
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
也可执行以下命令打包成可执行应用:
$ quarkus build --native
如果在生成可执行程序过程中报: “OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x0000000737300000, 839909376, 0) failed; error=‘Not enough space’ (errno=12)”,这是由于可以内存较少的原因。可运行以下命令用swapfile解决。
$ dd if=/dev/zero of=swapfile bs=1G count=8
$ mkswap swapfile
$ swapon swapfile
- 运行编译的可运行程序,然后再次执行(3)访问应用,最后退出应用运行。
$ target/hello-1.0.0-SNAPSHOT-runner
- 将可执行hello应用部署到OpenShift上。
$ oc new-project quarkus
$ oc new-build quay.io/quarkus/ubi-quarkus-native-binary-s2i:1.0 --binary --name=hello -l app=hello
$ oc start-build hello --from-file=target/hello-1.0.0-SNAPSHOT-runner --follow
$ oc new-app hello
$ oc expose service hello
$ oc rollout status -w dc/hello
- 最后访问hello应用的route,测试应用,应该可以得到hello的正常返回结果。
$ curl $(oc get route hello -o template --template '{{.spec.host}}')/hello
Hello RESTEasy
OpenShift 之 Quarkus(1)创建第一个Quarkus应用相关推荐
- OpenShift 4 - 用 Operator 创建 Jenkins 环境
<OpenShift 4.x HOL教程汇总> 说明:本文已经在OpenShift 4.8环境中验证 文章目录 安装 Jenkins Operator 用 Operator 创建 Jenk ...
- OpenShift 4 之Knative(2) - 第一个Serverless应用
<OpenShift 4.x HOL教程汇总> 说明:本文已经在OpenShift 4.6环境中验证 在完成了<OpenShift 4 之Knative(1) - 创建Knative ...
- 创建第一个 local network(I) - 每天5分钟玩转 OpenStack(80)
在 ML2 配置文件中 enable local network 后,本节将开始创建第一个 local network. 我们将通过 Web GUI 创建第一个 local network. 首先确保 ...
- 几分钟让小孩的人物涂鸦「动起来」,Meta AI创建了一个奇妙的火柴人世界
视学算法报道 编辑:杜伟.陈萍 Meta AI 让儿童手绘「活」了起来. 你有没有想过将一张儿童绘画制作成动画?就如下图,儿童能够绘制出独特和富有创造力的人物和动物:长着双脚的星星.腿超级长的鸟-- ...
- spring (由Rod Johnson创建的一个开源框架)
你可能正在想"Spring不过是另外一个的framework".当已经有许多开放源代码(和专有)J2EEframework时,我们为什么还需要Spring Framework? S ...
- Flutter初体验(二)—— 创建第一个Flutter APP
Flutter初体验(二)--- 创建第一个Flutter APP 在第一篇文章 Flutter初体验(一)---Mac 安装配置,学习了配置 Flutter 开发环境,并运行了Demo项目,本篇根据 ...
- 创建第一个IOS项目
今天我们创建第一个IOS项目,并在模拟器上运行 首先进入Xcode 点击创建新项目后,接下来该给项目起一个名字啦 HelloWorld! 点击下一步,开始选择模板啦 我们选择SingleView Ap ...
- AndroidStudio创建第一个 Flutter 应用程序
AndroidStudio创建第一个 Flutter 应用程序: 转到文件->新建flutter项目. 选择Flutter Application并按下一步按钮. 在下一个窗口中,您将看到您的项 ...
- 云炬Qtpy5开发与实战笔记 2PyCharm添加QTDesinger扩展并创建第一个.ui文件
1.配置使用QTDesigner扩展工具 在pycharm的项目配置中配置扩展工具,将QTDesigner加入其中: 2.在pycharm中打开QTDesigner 或者: 此时,我们就可以使用QTD ...
最新文章
- 提效率享效益,看华天CAPP如何优化天润曲轴工艺管理
- 微服务架构_企业中的微服务:敌是友?
- linux命令行怎么播放,如何在在 Linux 命令行中观看彩虹猫
- python中的idle在哪里_python idle 的打开方式
- 1G服务器网站,1核1g内存云服务器建网站
- 【VMware vSAN 6.6】2.5.硬件部署选项:我们有软硬件项目解决方案
- win10中linux系统下载软件,win10 上安装 Debian Linux子系统
- 查看ftp创建的用户
- 广东地区电信官方DNS服务器
- 7 netsnmp安装window_Linuxfx 10.2,一款来自巴西的Window操作系统,“山寨”出了高度...
- 莫言瑞典演讲《讲故事的人》
- python usb通信测试
- 误删除vmdk文件恢复办法
- 如何设置阿里云安全组?开放和关闭端口很简单
- 企业要融资,增资好还是股权转让好
- 抓取中国天气网当前时段所有城市的天气数据(python+xpath)
- c语言pm2.5检测系统,基于Arduino的PM2.5实时检测系统
- nginx可以用来做什么
- iframe的替代品
- 无人机集群的分布式协作 VI-SLAM
热门文章
- putty怎么拷贝Linux下的日志,linux 下的 putty 如何复制与粘贴?
- java死锁2_Java面试必问-死锁终极篇(2)
- c语言中switch嵌套,C 嵌套 switch 语句 ——jQuery中文网
- html ie 版本设置密码,如何给IE浏览器设置一个密码的详细图文步骤
- java递归优化_在Java中谈尾递归--尾递归和垃圾回收的比较
- matlab 把区间等分分,MATLAB数学实验报告 定积分的近似计算
- mysql profiling详解_使用mysql profiling功能剖析单条查询
- android 浮动文字提示,怎么在Android中实现一个自由拖动并显示文字的悬浮框
- html 为元素附空值,HTML空(void)元素有哪些?
- python一次性输入多个数_python如何利用input函数输入多个参数?