OpenShift 4.3 之 Quarkus(1)创建第一个Quarkus应用

有关RedHat的Quarkus的优势就不详细介绍了,总归就是通过将Java应用编译成可执行文件,可以让应用启动超快,占内存超少。非常适合企业Java应用的微服务化和大规模部署,另外在Serverless等场景也非常适合。
OpenShift 4.3 之 Quarkus(1)创建第一个Quarkus应用_第1张图片
本文基于quarkus.io的quarkus-quickstarts示例,说明如何实现一个最简单的Quarkus应用,并将其以可执行文件的形态部署到OpenShift上运行。

安装环境

  1. 安装GraavlVM和可执行程序插件。如果下载地址有变化,可以到GraavlVM项目中(https://github.com/graalvm/graalvm-ce-builds/releases)下载。
$ export GRAALVM_VERSION=19.3.1
$ export 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 -o graalvm.tar.gz
$ tar xvf graalvm.tar.gz
$ mv ./graalvm-ce-$JAVA_VERSION-$GRAALVM_VERSION ~/graalvm
$ export JAVA_HOME=~/graalvm
$ export 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 19.3.1)
$ gu list
ComponentId              Version             Component name      Origin
--------------------------------------------------------------------------------
graalvm                  19.3.1              GraalVM Core
native-image             19.3.1              Native Image        github.com
$ java -version
openjdk version "11.0.6" 2020-01-14
OpenJDK Runtime Environment GraalVM CE 19.3.1 (build 11.0.6+9-jvmci-19.3-b07)
OpenJDK 64-Bit Server VM GraalVM CE 19.3.1 (build 11.0.6+9-jvmci-19.3-b07, mixed mode, sharing)
  1. 下载Maven,然后可以查看Quarkus的Maven plugin信息。
$ MAVEN_VERSION=3.6.3
$ curl -L http://mirror.bit.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-$MAVEN_VERSION-bin.tar.gz -o maven.tar.gz
$ tar xvf maven.tar.gz
$ mv ./apache-maven-$MAVEN_VERSION ~/maven
$ export MAVEN_HOME=~/maven
$ export PATH=$PATH:$MAVEN_HOME/bin/
$ mvn -Dplugin=io.quarkus:quarkus-maven-plugin help:describe
  1. 确保RHEL上有gcc编译所需环境。
$ sudo yum -y install gcc glibc-devel zlib-devel libstdc++-static

Greeting应用

OpenShift 4.3 之 Quarkus(1)创建第一个Quarkus应用_第2张图片

  1. 根据模板生成应用框架目录。
$ mvn io.quarkus:quarkus-maven-plugin:1.2.0.Final:create \
    -DprojectGroupId=com.example \
    -DprojectArtifactId=hello \
    -DclassName="com.example.quarkus.Greeting" \
    -Dpath="/hello"
$ cd hello
  1. 运行应用。成功启动后显示以下三行,其中“Profile dev activated. Live Coding activated”说明是运行在开发模式(代码更改后Quarkus会自动编译和加载应用),而“[cdi, resteasy]”是该应用加载的Quarkus应用插件。
$ mvnw quarkus:dev
。。。
2020-01-21 11:55:57,142 INFO  [io.quarkus] (main) Quarkus 1.1.1.Final started in 2.453s. Listening on: http://0.0.0.0:8080
2020-01-21 11:55:57,183 INFO  [io.quarkus] (main) Profile dev activated. Live Coding activated.
2020-01-21 11:55:57,183 INFO  [io.quarkus] (main) Installed features: [cdi, resteasy]
  1. 在另一终端窗口访问应用,可以得到“hello”返回结果。
$ curl -w "\n" http://localhost:8080/hello
hello
  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发现代码变化,并自动重新编译并运行了新版应用。
。。。
2020-01-22 09:31:41,174 INFO  [io.qua.dev] (vert.x-worker-thread-4) Changed source files detected, recompiling [/home/xiaoyliu-redhat.com/lab/hello/src/main/java/com/example/quarkus/Greeting.java]
2020-01-22 09:31:41,378 INFO  [io.quarkus] (vert.x-worker-thread-4) Quarkus stopped in 0.007s
2020-01-22 09:31:41,743 INFO  [io.quarkus] (vert.x-worker-thread-4) hello 1.0-SNAPSHOT (running on Quarkus 1.1.1.Final) started in 0.364s. Listening on: http://0.0.0.0:8080
2020-01-22 09:31:41,743 INFO  [io.quarkus] (vert.x-worker-thread-4) Profile dev activated. Live Coding activated.
2020-01-22 09:31:41,743 INFO  [io.quarkus] (vert.x-worker-thread-4) Installed features: [cdi, resteasy]
2020-01-22 09:31:41,743 INFO  [io.qua.dev] (vert.x-worker-thread-4) Hot replace total time: 0.570s
  1. 再次访问应用,确认返回结果已经变化。
$ curl -w "\n" http://localhost:8080/hello
hello world
  1. 撤销(6)对Greeting.java代码的修改。如果不修改,则无法通过自动Test。
  2. 现将Java应用打包,然后运行应用。再次执行(3)访问应用,最后退出应用运行。
$ mvnw package
$ java -jar target/hello-1.0-SNAPSHOT-runner.jar
  1. Java应用编译成可执行应用,然后运行。再次执行(3)访问应用,最后退出应用运行。
$ mvnw package -Pnative
$ target/hello-1.0-SNAPSHOT-runner
  1. 将可执行hello应用部署到OpenShift上。
$ oc new-project quarkus
$ oc new-build quay.io/quarkus/ubi-quarkus-native-binary-s2i:19.2.1 --binary --name=hello -l app=hello
$ oc start-build hello --from-file=target/hello-1.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

你可能感兴趣的:(OpenShift,4,微服务,Quarkus)