說明:
- 本系列參考了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
apiVersion: 1.0.0
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