《OpenShift 4.x HOL教程汇总》

有关RedHat的Quarkus的优势就不详细介绍了,总归就是通过将Java应用编译成可执行文件,可以让应用启动超快,占内存超少。非常适合企业Java应用的微服务化和大规模部署,另外在Serverless等场景也非常适合。

本文基于quarkus.io的quarkus-quickstarts示例,说明如何实现一个最简单的Quarkus应用,并将其以可执行文件的形态部署到OpenShift上运行。

安装环境

  1. 安装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)
  1. 确保RHEL上有gcc编译所需环境。
$ sudo yum -y install gcc glibc-devel zlib-devel gcc-c++
  1. 下载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
  1. 最后还可以下载 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应用

  1. 根据模板生成应用框架目录。
$ 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
  1. 以开发模式运行应用。成功启动后显示以下三行,其中“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
  1. 在第二个终端窗口访问应用,可以得到“hello”返回结果。
$ curl -w "\n" http://localhost:8080/hello
Hello RESTEasy
  1. 停止第一个终端中运行的应用Quarkus应用,然后执行以下功能测试(其中测试代码在src/test/java/com/example/quarkus目录中),确认通过测试场景。
$ mvnw test
。。。
[INFO] Results:
[INFO]
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
。。。
  1. 在第一个终端中再次根据(2)步骤运行hello应用。
  2. 修改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";}
}
  1. 在第一个终端窗口确认有以下新的输出,说明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
  1. 在第二个终端再次访问应用,确认返回结果已经变化。
$ curl -w "\n" http://localhost:8080/hello
Hello World
  1. 撤销(6)对Greeting.java代码的修改。如果不修改,则无法通过自动Test。
  2. 现将Java应用打包,然后运行应用。再次执行(3)访问应用,最后退出应用运行。
$ mvnw package
$ java -jar target/quarkus-app/quarkus-run.jar

也可执行以下命令打包:

$ quarkus build
  1. 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
  1. 运行编译的可运行程序,然后再次执行(3)访问应用,最后退出应用运行。
$ target/hello-1.0.0-SNAPSHOT-runner
  1. 将可执行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
  1. 最后访问hello应用的route,测试应用,应该可以得到hello的正常返回结果。
$ curl $(oc get route hello -o template --template '{{.spec.host}}')/hello
Hello RESTEasy

OpenShift 之 Quarkus(1)创建第一个Quarkus应用相关推荐

  1. OpenShift 4 - 用 Operator 创建 Jenkins 环境

    <OpenShift 4.x HOL教程汇总> 说明:本文已经在OpenShift 4.8环境中验证 文章目录 安装 Jenkins Operator 用 Operator 创建 Jenk ...

  2. OpenShift 4 之Knative(2) - 第一个Serverless应用

    <OpenShift 4.x HOL教程汇总> 说明:本文已经在OpenShift 4.6环境中验证 在完成了<OpenShift 4 之Knative(1) - 创建Knative ...

  3. 创建第一个 local network(I) - 每天5分钟玩转 OpenStack(80)

    在 ML2 配置文件中 enable local network 后,本节将开始创建第一个 local network. 我们将通过 Web GUI 创建第一个 local network. 首先确保 ...

  4. 几分钟让小孩的人物涂鸦「动起来」,Meta AI创建了一个奇妙的火柴人世界

    视学算法报道 编辑:杜伟.陈萍 Meta AI 让儿童手绘「活」了起来. 你有没有想过将一张儿童绘画制作成动画?就如下图,儿童能够绘制出独特和富有创造力的人物和动物:长着双脚的星星.腿超级长的鸟-- ...

  5. spring (由Rod Johnson创建的一个开源框架)

    你可能正在想"Spring不过是另外一个的framework".当已经有许多开放源代码(和专有)J2EEframework时,我们为什么还需要Spring Framework? S ...

  6. Flutter初体验(二)—— 创建第一个Flutter APP

    Flutter初体验(二)--- 创建第一个Flutter APP 在第一篇文章 Flutter初体验(一)---Mac 安装配置,学习了配置 Flutter 开发环境,并运行了Demo项目,本篇根据 ...

  7. 创建第一个IOS项目

    今天我们创建第一个IOS项目,并在模拟器上运行 首先进入Xcode 点击创建新项目后,接下来该给项目起一个名字啦 HelloWorld! 点击下一步,开始选择模板啦 我们选择SingleView Ap ...

  8. AndroidStudio创建第一个 Flutter 应用程序

    AndroidStudio创建第一个 Flutter 应用程序: 转到文件->新建flutter项目. 选择Flutter Application并按下一步按钮. 在下一个窗口中,您将看到您的项 ...

  9. 云炬Qtpy5开发与实战笔记 2PyCharm添加QTDesinger扩展并创建第一个.ui文件

    1.配置使用QTDesigner扩展工具 在pycharm的项目配置中配置扩展工具,将QTDesigner加入其中: 2.在pycharm中打开QTDesigner 或者: 此时,我们就可以使用QTD ...

最新文章

  1. 提效率享效益,看华天CAPP如何优化天润曲轴工艺管理
  2. 微服务架构_企业中的微服务:敌是友?
  3. linux命令行怎么播放,如何在在 Linux 命令行中观看彩虹猫
  4. python中的idle在哪里_python idle 的打开方式
  5. 1G服务器网站,1核1g内存云服务器建网站
  6. 【VMware vSAN 6.6】2.5.硬件部署选项:我们有软硬件项目解决方案
  7. win10中linux系统下载软件,win10 上安装 Debian Linux子系统
  8. 查看ftp创建的用户
  9. 广东地区电信官方DNS服务器
  10. 7 netsnmp安装window_Linuxfx 10.2,一款来自巴西的Window操作系统,“山寨”出了高度...
  11. 莫言瑞典演讲《讲故事的人》
  12. python usb通信测试
  13. 误删除vmdk文件恢复办法
  14. 如何设置阿里云安全组?开放和关闭端口很简单
  15. 企业要融资,增资好还是股权转让好
  16. 抓取中国天气网当前时段所有城市的天气数据(python+xpath)
  17. c语言pm2.5检测系统,基于Arduino的PM2.5实时检测系统
  18. nginx可以用来做什么
  19. iframe的替代品
  20. 无人机集群的分布式协作 VI-SLAM

热门文章

  1. putty怎么拷贝Linux下的日志,linux 下的 putty 如何复制与粘贴?
  2. java死锁2_Java面试必问-死锁终极篇(2)
  3. c语言中switch嵌套,C 嵌套 switch 语句 ——jQuery中文网
  4. html ie 版本设置密码,如何给IE浏览器设置一个密码的详细图文步骤
  5. java递归优化_在Java中谈尾递归--尾递归和垃圾回收的比较
  6. matlab 把区间等分分,MATLAB数学实验报告 定积分的近似计算
  7. mysql profiling详解_使用mysql profiling功能剖析单条查询
  8. android 浮动文字提示,怎么在Android中实现一个自由拖动并显示文字的悬浮框
  9. html 为元素附空值,HTML空(void)元素有哪些?
  10. python一次性输入多个数_python如何利用input函数输入多个参数?