说明:
- 本系列参考了https://github.com/RedHat-Middleware-Workshops/quarkus-workshop。
- 运行环境OpenShift 4.4+CodeReady Workspaces。
- 通过Operator创建CodeReady Workspaces运行环境请参见“《OpenShift 4 之 用CodeReady Workspaces开发Quarkus云原生应用》的第一节说明”。
创建CodeReady项目
- 登录CRW后进入“Get Start”,选中Quarkus Tools区域,然后点击CREATE & OPEN按钮右侧下拉菜单,进入Create & Processed Editing。
- 将NAME设为Quarkus-Workshop,在SELECT STACK区域选中Quarkus Tools。然后在PROJECTS区域点击Remove,删除quarkus-quickstarts项目。
- 在Add or Import Project中的Git一栏中填入“https://github.com/RedHat-Middleware-Workshops/quarkus-workshop-labs”,然后点击Add。
- 点击New Workspace页面上方CREATE & OPEN按钮右侧,在下拉菜单中点击Create & Proceed Editing,此时进入以下界面。在Quarkus-Worshop的Workspace中进入Devfile栏目,将以下内容替换原有“commands”的所有内容。Save内容后Open这个Workspace。
components:
- id: redhat/quarkus-java11/latest
type: chePlugin
- mountSources: true
endpoints:
- name: quarkus-development-server
port: 8080
- name: hello-greeting-endpoint
port: 8080
attributes:
path: /hello/greeting/che-user
memoryLimit: 4Gi
type: dockerimage
volumes:
- name: m2
containerPath: /home/jboss/.m2
alias: maven
image: >-
quay.io/openshiftlabs/quarkus-workshop-stack:2.1
env:
- value: /home/jboss/.m2
name: MAVEN_CONFIG
- value: >-
-Xmx4G -Xss128M -XX:MetaspaceSize=1G -XX:MaxMetaspaceSize=2G
-XX:+CMSClassUnloadingEnabled
name: MAVEN_OPTS
commands:
- name: Run Tests
actions:
- workdir: '${CHE_PROJECTS_ROOT}'
type: exec
command: 'mvn verify -f ${CHE_PROJECTS_ROOT}/quarkus-workshop-labs'
component: maven
- name: Start Live Coding
actions:
- workdir: '${CHE_PROJECTS_ROOT}'
type: exec
command: >-
mvn clean compile quarkus:dev -f
${CHE_PROJECTS_ROOT}/quarkus-workshop-labs
component: maven
- name: Package App for OpenShift
actions:
- workdir: '${CHE_PROJECTS_ROOT}'
type: exec
command: >-
mvn package -DuberJar=true -DskipTests -f
${CHE_PROJECTS_ROOT}/quarkus-workshop-labs
component: maven
- name: Build Native App
actions:
- workdir: '${CHE_PROJECTS_ROOT}'
type: exec
command: >-
mvn package -Pnative -DskipTests -f
${CHE_PROJECTS_ROOT}/quarkus-workshop-labs
component: maven
- name: Start Debugger on 5005
actions:
- referenceContent: |
{
"version": "0.2.0",
"configurations": [
{
"type": "java",
"request": "attach",
"name": "Attach to App",
"hostName": "localhost",
"port": 5005
}
]
}
type: vscode-launch
Live Coding
- 在Quakus-Workshop中打开quakus-workshop-labs项目中的src/main/java/org/acme/people/rest/GreetingResource.java文件查看代码。
- 击窗口右侧的Start Live Codeing,然后在下方的窗口查看编译输出。
- 在编译过程中打Open Link(会打开PREVIEW窗口),并允许使用5005端口。
- 在Workspace中的PREVIEW中的地址栏最后添加"/hello",然后确认页面返回hello。另外还可通过打开一个“_ New Terminal”,在其中运行以下命令查看运行。
$ curl http://localhost:8080/hello
5. 修改GreetingResource.java的代码,将"hello"改为“hola”。保存后按照(8)确认返回结果已经变为“Hola”。
打包Java应用
- 点击Workshop的“Package App for OpenShift”,OpenShift会打开新窗口将应用打包,最后在项目中的target目录中可以看到people-1.0-SNAPSHOT-runner.jar文件。
- 为了区别缺省使用的8080端口,运行以下命令,运行编译好的jar文件,并监听在8081端口。
$ java -Dquarkus.http.port=8081 -jar $CHE_PROJECTS_ROOT/quarkus-workshop-labs/target/*-runner.jar
- 打开另一个Terminal,然后运行以下命令,确认可正常返回结果。
$ curl http://localhost:8081/hello
编译成可执行应用
- 点击Workshop的“Build Native
App”,OpenShift会打开新窗口将应用打包,最后在项目中的target目录中可以看到people-1.0-SNAPSHOT-runner可执行程序。
- 打开一个Terminal,然后运行可执行程序。
$ $CHE_PROJECTS_ROOT/quarkus-workshop-labs/target/people-1.0-SNAPSHOT-runner -Dquarkus.http.port=8081
- 在打开一个新的Terminal,然后运行以下命令,确认可以返回结果。
$ curl http://localhost:8081/hello
配置服务健康检查
- 在Terminal中执行以下命令,为项目添加health的扩展。
$ mvn quarkus:add-extension -Dextensions="health" -f $CHE_PROJECTS_ROOT/quarkus-workshop-labs
在添加为后,在项目的pom.xml文件中确认增加了以下代码。
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-smallrye-health</artifactId>
</dependency>
- 在Terminal中执行以下命令,确认返回结果。
$ curl http://localhost:8080/health/ready
{
"status": "UP",
"checks": [
]
}
$ curl http://localhost:8080/health/live
{
"status": "UP",
"checks": [
]
}
2. 在org.acme.people.health中增加以下内容的SimpleHealthCheck.java,然后再次执行上一步确认live和ready。
package org.acme.people.health;
import org.eclipse.microprofile.health.HealthCheck;
import org.eclipse.microprofile.health.HealthCheckResponse;
import org.eclipse.microprofile.health.Readiness;
import javax.enterprise.context.ApplicationScoped;
@ApplicationScoped
@Readiness
public class SimpleHealthCheck implements HealthCheck {
@Override
public HealthCheckResponse call() {
return HealthCheckResponse.named("Simple health check").up().build();
}
}
向OpenShift部署Quarkus应用
- 打开一个新的Terminal,然后执行以下命令登录OpenShift。
$ oc login https://$KUBERNETES_SERVICE_HOST:$KUBERNETES_SERVICE_PORT --insecure-skip-tls-verify=true
- 创建一个新项目。
$ oc new-project <USER_ID>-project
- 执行命令,基于ubi-quarkus-native-binary-s2i:19.3.1镜像,部署和运行people-1.0-SNAPSHOT-runner可执行应用。
$ oc new-build quay.io/quarkus/ubi-quarkus-native-binary-s2i:19.3.1 --binary --name=people -l app=people
$ oc start-build people --from-file $CHE_PROJECTS_ROOT/quarkus-workshop-labs/target/*-runner --follow
$ oc new-app people -l "app.openshift.io/runtime=quarkus,app.kubernetes.io/part-of=people"
$ oc expose svc/people
$ oc rollout status -w dc/people
- 访问部署的应用。
$ curl $(oc get route people --template='{{ .spec.host }}')/hello
- 在该用户的OpenShift的Developer控制台中,可以在Topology视图中看到该部署的基于Quarkus应用。
- 执行命令,配置健康检查。
$ oc set probe dc/people --readiness --initial-delay-seconds=5 --period-seconds=5 --failure-threshold=20 --get-url=http://:8080/health/ready
$ oc set probe dc/people --liveness --initial-delay-seconds=5 --period-seconds=5 --failure-threshold=20 --get-url=http://:8080/health/live