1. 總覽
在本實驗室中,您將建立 Eventarc 觸發程序,將 Pub/Sub 主題連結至 Workflows 服務。Eventarc 可讓您將服務對服務通訊解除耦合,使解決方案更具擴充性,並以事件驅動。您將建立包含多個步驟的工作流程,執行業務程序,計算在 Cymbal Eats 下單的顧客獎勵點數。Workflow 會將多個要求傳送至 GKE Autopilot 執行的應用程式,並將訊息發布至 Pub/Sub 主題,通知 Order Service 應用程式已計算獎勵點數。

什麼是 GKE Autopilot?
GKE Autopilot 是 GKE 中的一種作業模式,可管理叢集設定,包括節點、資源調度、安全性和其他預先設定。Autopilot 叢集經過最佳化調整,適用於多數正式環境工作負載,並根據您的 Kubernetes 資訊清單佈建運算資源。簡化設定程序,遵循 GKE 最佳做法和建議,以便設置叢集和工作負載,並提升擴充性及安全性。如需內建設定清單,請參閱「Autopilot 和 Standard 比較」表格。
使用 GKE Standard 時,使用者須負責管理工作站節點和節點集區設定,其餘工作則由 GKE 處理。
在 GKE Standard 模式下執行時,客戶與 Google 的責任

使用 GKE Autopilot 時,節點集區的設定和管理作業由 Google 負責。讓您專注於叢集上執行的應用程式和服務。
什麼是 Eventarc?
Eventarc 可讓您建構事件導向架構,不必實作、自訂或維護基礎架構。Eventarc 提供標準化解決方案,可管理已分離微服務之間的狀態變更流程 (稱為「事件」)。觸發之後,Eventarc 會透過 Pub/Sub 訂閱項目,將這些事件轉送至不同的目的地 (例如 Workflows、Cloud Run) 之間傳送事件,同時為您管理傳送、安全防護、授權、觀測和錯誤處理工作。
Google Event 提供者
- 超過 90 家 Google Cloud 供應商。這些供應商會直接從來源 (例如 Cloud Storage) 或透過 Cloud 稽核記錄項目傳送事件。
- Pub/Sub 供應商。這些供應商會使用 Pub/Sub 訊息將事件傳送至 Eventarc。
第三方供應商
第三方供應商是指提供 Eventarc 來源的非 Google 實體。
Eventarc 觸發條件
- Cloud Pub/Sub 事件。發布至 Pub/Sub 主題的訊息可以觸發 Eventarc。
- Cloud 稽核記錄 (CAL) 事件。Cloud 稽核記錄會為每個雲端專案、資料夾和機構提供管理員活動和資料存取稽核記錄。
- 直接事件。Eventarc 可由各種直接事件觸發,例如 Cloud Storage bucket 更新或 Firebase 遠端設定範本更新。
活動目的地
- 工作流程
- Cloud Run
- GKE
- Cloud Functions( 第 2 代)

什麼是 Workflows?
工作流程是一項全代管服務,可讓您整合微服務、工作和 API。Workflows 是無伺服器服務,可根據需求調整規模。
工作流程用途:
- 事件導向工作流程會在定義的觸發條件下執行。舉例來說,當提交新訂單時,您想要計算顧客會員點數。或者,當訂單取消時,系統可以發布事件,所有感興趣的服務都會處理該事件。
- 批次工作流程會使用 Cloud Scheduler 定期執行工作。舉例來說,您可以排定每晚執行工作,檢查狀態為失敗的菜單項目並刪除。
Workflows 非常適合用於自動調度管理服務的工作流程。您可以將流程自動化,包括長達一年的等待及重試。
工作流程優點:
- 設定優於程式碼:將邏輯移至設定,而非編寫程式碼,藉此減少技術債。
- 簡化架構。有狀態的工作流程可讓您以視覺化方式呈現及監控複雜的服務整合作業,無須依賴其他依附元件。
- 結合可靠性和容錯能力。使用預設或自訂重試邏輯和錯誤處理機制來控制失敗,即使其他系統失敗,也能協助您掌握進度,因為每個步驟都會在 Cloud Spanner 中建立查核點。
- 免維護。視需求調度資源:無需修補或維護。您僅須為工作流程實際執行的工作量付費,等待或非使用狀態不會產生費用。
在本實驗室中,您將設定事件驅動型工作流程。
學習目標
在本實驗室中,您將瞭解如何執行下列操作:
- 設定 Pub/Sub 主題和 Eventarc,觸發工作流程
- 設定工作流程,對在 GKE Autopilot 上執行的應用程式發出 API 呼叫
- 設定 Workflow 將訊息發布至 Pub/Sub
- 如何在 Cloud Logging 中查詢 Workflows 結構化記錄,以及如何使用 gcloud CLI
必要條件
- 本實驗室假設您已熟悉 Cloud 控制台和 Cloud Shell 環境。
- 具備 GKE 和 Cloud Pub/Sub 的使用經驗會有幫助,但沒有也無妨。
2. 設定和需求
設定 Cloud 專案
- 登入 Google Cloud 控制台,然後建立新專案或重複使用現有專案。如果沒有 Gmail 或 Google Workspace 帳戶,請先建立帳戶。



- 專案名稱是這個專案參與者的顯示名稱。這是 Google API 未使用的字元字串。你隨時可以更新該位置資訊。
- 專案 ID 在所有 Google Cloud 專案中都是不重複的,而且設定後即無法變更。Cloud 控制台會自動產生不重複的字串,通常您不需要在意這個字串。在大多數程式碼研究室中,您需要參照專案 ID (通常會標示為
PROJECT_ID)。如果您不喜歡產生的 ID,可以產生另一個隨機 ID。你也可以嘗試使用自己的名稱,看看是否可用。完成這個步驟後就無法變更,且專案期間都會維持這個設定。 - 請注意,部分 API 會使用第三個值,也就是「專案編號」。如要進一步瞭解這三種值,請參閱說明文件。
- 接著,您需要在 Cloud 控制台中啟用帳單,才能使用 Cloud 資源/API。完成本程式碼研究室的費用應該不高,甚至完全免費。如要關閉資源,避免產生本教學課程以外的費用,您可以刪除自己建立的資源,或刪除整個專案。Google Cloud 新使用者可參加價值$300 美元的免費試用計畫。
環境設定
按一下搜尋列右側的圖示,啟用 Cloud Shell。

複製存放區並前往該目錄,將下列指令複製並貼到終端機,然後按下 Enter 鍵:
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git && cd cymbal-eats/customer-service
執行 gke-lab-setup.sh,部署必要的依附元件。
系統會建立下列資源:
- AlloyDB 叢集和執行個體
- GKE Autopilot 叢集
./gke-lab-setup.sh
如果系統提示您授權,請點選「授權」繼續操作。

設定程序約需 10 分鐘。
請等待指令碼執行完畢,並看到下列輸出內容,再執行其他步驟。
NAME: client-instance ZONE: us-central1-c MACHINE_TYPE: e2-medium PREEMPTIBLE: INTERNAL_IP: 10.128.0.9 EXTERNAL_IP: 35.232.109.233 STATUS: RUNNING
3. GKE Autopilot 叢集
查看 GKE Autopilot 叢集
設定專案環境變數:
export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
export PROJECT_NAME=$(gcloud projects describe $PROJECT_ID --format='value(name)')
在初始設定期間,系統會使用下列指令建立叢集 (您不必執行這項指令):
gcloud container clusters create-auto $CLUSTER_NAME --region $REGION
執行指令,查看建立的 GKE Autopilot 叢集:
gcloud container clusters list
輸出內容範例:

執行指令來儲存叢集的憑證:
CLUSTER_NAME=rewards-cluster
REGION=us-central1
gcloud container clusters get-credentials $CLUSTER_NAME --region=$REGION
部署應用程式
接著,您將部署客戶服務應用程式。這是以 Java 為基礎的微服務,使用 Quarkus 架構。
前往 cymbal-eats/customer-service 資料夾,然後執行下列指令,建構及上傳容器映像檔:
./mvnw clean package -DskipTests
export CUSTOMER_SERVICE_IMAGE=gcr.io/$PROJECT_ID/customer-service:1.0.0
gcloud builds submit --tag $CUSTOMER_SERVICE_IMAGE .
設定 AlloyDB 私人 IP 位址:
export DB_HOST=$(gcloud beta alloydb instances describe customer-instance \
--cluster=customer-cluster \
--region=$REGION \
--format=json | jq \
--raw-output ".ipAddress")
echo $DB_HOST
執行下列指令,建立 Kubernetes Secret 物件來儲存資料庫憑證,供 Customer Service 應用程式連線至資料庫:
DB_NAME=customers
DB_USER=postgres
DB_PASSWORD=password123
kubectl create secret generic gke-alloydb-secrets \
--from-literal=database=$DB_NAME \
--from-literal=username=$DB_USER \
--from-literal=password=$DB_PASSWORD \
--from-literal=db_host=$DB_HOST
執行指令,替換 deployment.yaml 檔案中的 CUSTOMER_SERVICE_IMAGE:
sed "s@CUSTOMER_SERVICE_IMAGE@$CUSTOMER_SERVICE_IMAGE@g" deployment.yaml.tmpl > customer-service-deployment.yaml
執行指令來部署應用程式:
kubectl apply -f customer-service-deployment.yaml
應用程式需要一些時間才會轉換為 RUNNING 狀態。
查看部署規格檔案:
deployment.yaml.tmpl
以下是設定的一部分,用於指定執行這個應用程式所需的資源。
spec:
containers:
- name: customer-service
image: CUSTOMER_SERVICE_IMAGE
resources:
requests:
cpu: 250m
memory: 512Mi
ephemeral-storage: 512Mi
limits:
cpu: 500m
memory: 1024Mi
ephemeral-storage: 1Gi
執行指令,建立工作流程中要使用的外部 IP:
SERVICE_NAME=customer-service
kubectl expose deployment $SERVICE_NAME \
--type LoadBalancer --port 80 --target-port 8080
執行指令來驗證建立的資源:
kubectl get all
輸出內容範例:

4. 審查工作流程
Workflows 核心概念
工作流程是由一系列步驟組成,這些步驟使用 Workflows 語法( YAML 或 JSON) 描述。
建立工作流程後,系統會部署工作流程,讓工作流程準備執行。
「執行作業」是指單次執行工作流程定義中包含的邏輯。如果工作流程尚未執行,就不會產生任何費用。所有工作流程執行作業都是獨立的,而且產品可快速調度資源,因此能同時執行大量作業。
執行控制項
- 步驟:如要建立工作流程,請使用 Workflows 語法定義所需的
steps和執行順序。每個工作流程至少要有一個步驟。 - 條件 - 您可以使用
switch區塊做為選取機制,讓運算式的值控制工作流程的執行流程。 - 疊代 - 您可以使用
for迴圈,疊代處理一系列數字或資料集合 (例如清單或對應)。 - 子工作流程:子工作流程的運作方式與程式設計語言中的常式或函式類似,可讓您封裝工作流程會重複執行的步驟或一組步驟。
觸發執行作業
- 手動:您可以使用 Google Cloud 控制台或 Google Cloud CLI,透過指令列管理工作流程。
- 程式輔助 - 您可以使用 Workflows API 的 Cloud 用戶端程式庫或 REST API 管理工作流程。
- 已排定 - 您可以使用 Cloud Scheduler,按照特定排程執行工作流程。
執行階段引數
如要存取在執行階段傳遞的資料,請將 params 欄位新增至主要工作流程 (放在主要區塊中)。主要區塊會接受單一引數,也就是任何有效的 JSON 資料型別。params 欄位會命名工作流程用來儲存您傳遞資料的變數。
工作流程邏輯
如果沒有現成顧客,工作流程會先發出 API 呼叫來建立顧客,然後更新獎勵點數。工作流程會根據訂單總金額選取乘數,計算顧客的獎勵點數。詳情請參閱下方範例。
- calculate_multiplier:
switch:
- condition: ${totalAmount < 10}
steps:
- set_multiplier1:
assign:
- multiplier: 2
- condition: ${totalAmount >= 10 and totalAmount < 25}
steps:
- set_multiplier2:
assign:
- multiplier: 3
- condition: ${totalAmount >= 25}
steps:
- set_multiplier3:
assign:
- multiplier: 5
- calculate_rewards:
assign:
- rewardPoints: ${customerRecord.rewardPoints + multiplier}

5. 設定及部署工作流程
執行指令,查看服務的外部 IP 位址:
kubectl get svc
輸出內容範例:

使用先前輸出內容中的外部 IP 值,設定下列環境變數。
CUSTOMER_SERVICE_URL=http://$(kubectl get svc customer-service -o=jsonpath='{.status.loadBalancer.ingress[0].ip}')
在工作流程範本中取代客戶服務應用程式網址:
sed "s@CUSTOMER_SERVICE_URL@$CUSTOMER_SERVICE_URL@g" gkeRewardsWorkflow.yaml.tmpl > gkeRewardsWorkflow.yaml
設定 Workflows 服務和專案環境變數的位置:
gcloud config set workflows/location ${REGION}
export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
export PROJECT_NAME=$(gcloud projects describe $PROJECT_ID --format='value(name)')
為工作流程建立自訂服務帳戶,並授予下列權限:
- 呼叫 Logging API
- 將訊息發布至 Pub/Sub 主題
export WORKFLOW_SERVICE_ACCOUNT=workflows-sa
gcloud iam service-accounts create ${WORKFLOW_SERVICE_ACCOUNT}
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member "serviceAccount:${WORKFLOW_SERVICE_ACCOUNT}@$PROJECT_ID.iam.gserviceaccount.com" \
--role "roles/logging.logWriter"
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member "serviceAccount:${WORKFLOW_SERVICE_ACCOUNT}@$PROJECT_ID.iam.gserviceaccount.com" \
--role "roles/pubsub.publisher"
部署工作流程。工作流程已設定為使用上一個步驟中建立的服務帳戶:
export WORKFLOW_NAME=rewardsWorkflow
gcloud workflows deploy ${WORKFLOW_NAME} \
--source=gkeRewardsWorkflow.yaml \
--service-account=${WORKFLOW_SERVICE_ACCOUNT}@$PROJECT_ID.iam.gserviceaccount.com
查看工作流程來源和其他詳細資料 (「觸發條件」分頁)。目前尚未設定任何觸發條件來執行這項工作流程。您會在下一個步驟中設定。

6. 設定 Pub/Sub 主題和 Eventarc 觸發條件
接下來,您要建立兩個 Pub/Sub 主題,並設定一個 Eventarc 觸發條件。
Order Service 應用程式會將新訂單的相關資訊發布至 order-topic。
工作流程會將訊息發布至 order-points-topic,內含訂單獎勵點數和總金額資訊。訂單服務(本實驗室未部署的部分) 會公開一個端點,供推送訂閱項目功能用於更新每個訂單的獎勵點數和總金額。order-points-topic,
建立新的 Pub/Sub 主題:
export TOPIC_ID=order-topic
export ORDER_POINTS_TOPIC_ID=order-points-topic
gcloud pubsub topics create $TOPIC_ID --project=$PROJECT_ID
gcloud pubsub topics create $ORDER_POINTS_TOPIC_ID --project=$PROJECT_ID
設定 Eventarc 服務的位置:
gcloud config set eventarc/location ${REGION}
建立自訂服務帳戶,供 Eventarc 觸發條件執行工作流程。
export TRIGGER_SERVICE_ACCOUNT=eventarc-workflow-sa
gcloud iam service-accounts create ${TRIGGER_SERVICE_ACCOUNT}
授予服務帳戶執行工作流程的權限。
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
--member="serviceAccount:${TRIGGER_SERVICE_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com" \
--role="roles/workflows.invoker"
建立 Eventarc 觸發條件,監聽 Pub/Sub 訊息並傳送至 Workflows。
gcloud eventarc triggers create new-orders-trigger \
--destination-workflow=${WORKFLOW_NAME} \
--destination-workflow-location=${REGION} \
--event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \
--service-account="${TRIGGER_SERVICE_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com" \
--transport-topic=$TOPIC_ID
輸出內容範例:
Creating trigger [new-orders-trigger] in project [qwiklabs-gcp-01-1a990bfcadb3], location [us-east1]...done. Publish to Pub/Sub topic [projects/qwiklabs-gcp-01-1a990bfcadb3/topics/order-topic] to receive events in Workflow [rewardsWorkflow]. WARNING: It may take up to 2 minutes for the new trigger to become active.
查看建立的 Eventarc 觸發條件。

查看為觸發條件建立的訂閱項目。

在工作流程端查看變更。新增了觸發條件。

7. 測試工作流程

如要模擬訂單服務,請從 Cloud Shell 將訊息傳送至 Pub/Sub 主題,並在 Cloud 控制台中驗證客戶服務記錄。
export TOPIC_ID=order-topic
gcloud pubsub topics publish $TOPIC_ID --message '{"userId":"id1","orderNumber":123456,"name":"Angela Jensen","email":"ajensen9090+eats@gmail.com","address":"1845 Denise St","city":"Mountain View","state":"CA","zip":"94043","orderItems":[{"id":7,"createDateTime":"2022-03-17T21:51:44.968584","itemImageURL":"https://images.unsplash.com/photo-1618449840665-9ed506d73a34?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=687&q=80","itemName":"Curry Plate","itemPrice":12.5,"itemThumbnailURL":"https://images.unsplash.com/photo-1618449840665-9ed506d73a34?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=687&q=80","spiceLevel":0,"status":"Ready","tagLine":"Spicy touch for your taste buds","updateDateTime":"2022-03-18T01:30:29.340584","inventory":8,"quantity":1}]}'
輸出內容範例:
messageIds: - '5063709859203105'
查看工作流程執行詳細資料和記錄。


8. 工作流程結構化記錄
工作流程已設定為以 JSON 格式寫入結構化記錄。系統會使用 Cloud Logging API、workflows.googleapis.com/Workflow 資源,以及 projects/${PROJECT_ID}/logs/Workflows 記錄檔名稱,寫入記錄。
查看下方的記錄設定。
- log_totalAmount:
call: sys.log
args:
json:
orderNumber: ${order.orderNumber}
totalAmount: ${totalAmount}
multiplier: ${multiplier}
totalRewardPoints: ${rewardPoints}
orderRewardPoints: ${orderRewardPoints}
severity: INFO
在 Cloud 控制台中開啟「記錄檔探索工具」,然後執行查詢,找出總金額超過 $2 美元的已處理訂單。
如要顯示搜尋查詢欄位,請按一下「顯示查詢」。

resource.type="workflows.googleapis.com/Workflow" AND
jsonPayload.totalAmount > 2 AND
timestamp >= "2023-01-01T00:00:00Z" AND
timestamp <= "2024-12-31T23:59:59Z"
輸出內容範例:

開啟 Cloud Shell,然後使用 gcloud CLI 讀取記錄,並執行下列指令。
gcloud logging read 'resource.type="workflows.googleapis.com/Workflow" AND jsonPayload.totalAmount > 2 AND timestamp >= "2023-01-01T00:00:00Z" AND timestamp <= "2023-12-31T23:59:59Z"' --limit 10 --format="table(jsonPayload.orderNumber,jsonPayload.totalAmount,jsonPayload.orderRewardPoints,jsonPayload.totalRewardPoints,jsonPayload.multiplier)"
使用 table 格式的輸出內容範例:

執行下列指令,以 JSON 格式傳回記錄:
gcloud logging read 'resource.type="workflows.googleapis.com/Workflow" AND jsonPayload.totalAmount > 2 AND timestamp >= "2023-01-01T00:00:00Z" AND timestamp <= "2023-12-31T23:59:59Z"' --limit 10 --format=json | jq
使用 json 格式的輸出內容範例:

9. 查看顧客記錄
(選用步驟)
執行下列指令,設定客戶服務網址環境變數。
CUSTOMER_SERVICE_URL=http://$(kubectl get svc customer-service -o=jsonpath='{.status.loadBalancer.ingress[0].ip}')
curl $CUSTOMER_SERVICE_URL/customer | jq
輸出內容範例:
[
{
"address": "1845 Denise St",
"city": "Mountain View",
"createDateTime": "2023-01-31T17:22:08.853644",
"email": "ajensen9090+eats@gmail.com",
"id": "id1",
"name": "Angela Jensen",
"rewardPoints": 4,
"state": "CA",
"updateDateTime": "2023-01-31T17:22:09.652117",
"zip": "94043"
}
]
多次執行指令來發布新訂單,並使用 curl 指令驗證顧客獎勵點數。
發布新訂單訊息:
export TOPIC_ID=order-topic
gcloud pubsub topics publish $TOPIC_ID --message '{"userId":"id1","orderNumber":123456,"name":"Angela Jensen","email":"ajensen9090+eats@gmail.com","address":"1845 Denise St","city":"Mountain View","state":"CA","zip":"94043","orderItems":[{"id":7,"createDateTime":"2022-03-17T21:51:44.968584","itemImageURL":"https://images.unsplash.com/photo-1618449840665-9ed506d73a34?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=687&q=80","itemName":"Curry Plate","itemPrice":12.5,"itemThumbnailURL":"https://images.unsplash.com/photo-1618449840665-9ed506d73a34?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=687&q=80","spiceLevel":0,"status":"Ready","tagLine":"Spicy touch for your taste buds","updateDateTime":"2022-03-18T01:30:29.340584","inventory":8,"quantity":1}]}'
確認顧客獎勵點數:
curl $CUSTOMER_SERVICE_URL/customer | jq
執行下列指令,檢查最新記錄:
gcloud logging read 'resource.type="workflows.googleapis.com/Workflow" AND jsonPayload.totalAmount > 2 AND timestamp >= "2023-01-01T00:00:00Z" AND timestamp <= "2023-12-31T23:59:59Z"' --limit 10 --format="table(jsonPayload.orderNumber,jsonPayload.totalAmount,jsonPayload.orderRewardPoints,jsonPayload.totalRewardPoints,jsonPayload.multiplier)"
10. 恭喜!
恭喜,您已完成本程式碼研究室!
涵蓋內容:
- 如何設定 Pub/Sub 主題和 Eventarc 來觸發工作流程
- 如何設定工作流程,對在 GKE Autopilot 上執行的應用程式發出 API 呼叫
- 如何設定 Workflow,將訊息發布至 Pub/Sub
- 如何在 Cloud Logging 中查詢 Workflows 結構化記錄,以及如何使用 gcloud CLI
後續步驟:
探索其他 Cymbal Eats 程式碼研究室:
- 使用 Eventarc 觸發 Cloud Workflows
- 透過 Cloud Storage 觸發事件處理作業
- 從 Cloud Run 連線至私人 Cloud SQL
- 從 Cloud Run 連線至全代管資料庫
- 使用 Identity-Aware Proxy (IAP) 保護無伺服器應用程式
- 使用 Cloud Scheduler 觸發 Cloud Run 工作
- 安全部署至 Cloud Run
- 保護 Cloud Run 輸入流量
清除所用資源
如要避免系統向您的 Google Cloud 帳戶收取本教學課程所用資源的費用,請刪除含有相關資源的專案,或者保留專案但刪除個別資源。
刪除專案
如要避免付費,最簡單的方法就是刪除您為了本教學課程所建立的專案。