程式碼研究室簡介
1. 總覽
在本研究室中,您將建立 Eventarc 觸發條件,將 Pub/Sub 主題連結至 Workflows 服務。Eventarc 可讓您區隔服務與服務通訊之間的狀況,讓您的解決方案更可擴充且更以事件為準。您將建立一個包含執行業務流程的多個步驟的工作流程,以計算在 Cymbal Eats 訂購商品的客戶獎勵點數。工作流程會向在 GKE Autopilot 上執行的應用程式傳送多項要求,並發布訊息至 Pub/Sub 主題,通知訂單服務應用程式計算獎勵點數。
什麼是 GKE Autopilot?
GKE Autopilot 是 GKE 的作業模式,Google 會管理叢集設定,包括節點、資源調度、安全性和其他預設設定。Autopilot 叢集經過最佳化調整,可以執行大部分的正式環境工作負載,並依據 Kubernetes 資訊清單佈建運算資源。簡化的設定流程符合 GKE 最佳做法、叢集和工作負載設定、擴充性和安全性的建議。如需內建設定清單,請參閱「Autopilot 和 Standard 比較」表格。
採用 GKE Standard 後,使用者需自行管理工作站節點和節點集區設定,其餘工作則交由 GKE 處理。
以 GKE Standard 模式執行時客戶的與 Google 的責任
採用 GKE Autopilot 時,Google 會負責設定與管理節點集區。讓您可以專心處理在叢集頂部執行的應用程式和服務。
什麼是 Eventarc?
Eventarc 可讓您建構事件導向的架構,而不必實作、自訂或維護基礎架構。Eventarc 提供標準化解決方案,可以管理分離微服務的狀態變更流程 (稱為事件)。觸發後,Eventarc 會透過 Pub/Sub 訂閱項目將這些事件轉送至多個目的地 (例如Workflows、Cloud Run),同時管理推送、安全性、授權、觀測能力和錯誤處理工作。
Google 事件供應商
- 超過 90 個 Google Cloud 供應商。這些供應商可以直接從來源 (例如 Cloud Storage) 傳送事件,或是透過 Cloud 稽核記錄項目傳送事件。
- Pub/Sub 供應商。這些提供者使用 Pub/Sub 訊息將事件傳送至 Eventarc。
第三方供應商
第三方供應商是指提供 Eventarc 來源的非 Google 實體。
Eventarc 觸發條件
- Cloud Pub/Sub 事件。發布至 Pub/Sub 主題的訊息可觸發 Eventarc。
- Cloud 稽核記錄 (CAL) 事件。Cloud 稽核記錄提供每個 Cloud 專案、資料夾和機構的管理員活動與資料存取稽核記錄。
- 直接事件:各種直接事件都可觸發 Eventarc,例如 Cloud Storage 值區更新或更新 Firebase 遠端設定範本。
事件目的地
- 工作流程
- Cloud Run
- GKE
- Cloud Functions( 第 2 代)
什麼是 Workflows?
Workflows 是一項全代管服務,可讓您整合微服務、工作和 API。Workflows 是無伺服器的服務,可視需求調度資源。
Workflows 用途:
- 事件導向的工作流程會對已定義的觸發條件執行。舉例來說,使用者提交新訂單且想計算客戶會員點數時。或者,如果訂單取消,系統則會發布活動,讓所有感興趣的服務處理這場活動。
- 批次工作工作流程:使用 Cloud Scheduler 定期執行工作。例如夜間工作會檢查是否有失敗狀態的選單項目,並加以刪除。
Workflows 很適合用於自動化調度管理服務的工作流程。您可以自動執行程序,包含等待和重試最多一年。
Workflows 的優點:
- 設定程式碼:將邏輯移至配置,而非編寫程式碼,藉此減少技術債。
- 簡化架構。有狀態的 Workflows 不需要額外的依附元件,就能以視覺化方式呈現及監控複雜的服務整合項目。
- 納入可靠性和容錯能力:使用預設或自訂重試邏輯和錯誤處理機制來控制故障情形,即使其他系統發生錯誤也不受影響。檢查每個步驟是否都可傳送至 Cloud Spanner,協助您追蹤進度。
- 免維護視需要調度資源:無需進行修補或維護。您只須在工作流程執行時付費,等待或閒置時,無須支付任何費用。
在本研究室中,您將設定事件導向的工作流程。
學習目標
在本研究室中,您將瞭解如何執行下列操作:
- 設定 Pub/Sub 主題和 Eventarc 以觸發 Workflows
- 設定工作流程,向在 GKE Autopilot 上執行的應用程式發出 API 呼叫
- 設定工作流程,將訊息發布至 Pub/Sub
- 如何在 Cloud Logging 和 gcloud CLI 中查詢 Workflows 結構化記錄檔
必要條件
- 本研究室假設您熟悉 Cloud 控制台和 Cloud Shell 環境。
- 具備一定的 GKE 和 Cloud Pub/Sub 體驗會很有幫助,但並非必要。
2. 設定和需求
Cloud 專案設定
- 登入 Google Cloud 控制台,建立新專案或重複使用現有專案。如果您還沒有 Gmail 或 Google Workspace 帳戶,請先建立帳戶。
- 「專案名稱」是這項專案參與者的顯示名稱。這是 Google API 未使用的字元字串。您隨時可以更新這項資訊。
- 所有 Google Cloud 專案的專案 ID 均不得重複,而且設定後即無法變更。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
部署應用程式
接下來,您將部署客戶服務應用程式。這是使用 Quarkus 架構的 Java 微服務。
前往 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 Secrets 物件,儲存資料庫憑證,客戶服務應用程式將使用這組憑證連線至資料庫:
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. 設定及部署 Workflows
執行指令,查看服務的外部 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)')
使用下列權限為工作流程建立自訂服務帳戶:
- 呼叫記錄 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-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 來觸發 Workflows
- 瞭解如何設定 Workflows,以便向在 GKE Autopilot 上執行的應用程式發出 API 呼叫
- 如何設定 Workflows 以將訊息發布至 Pub/Sub
- 如何在 Cloud Logging 和 gcloud CLI 中查詢 Workflows 結構化記錄檔
下一步:
探索其他 Cymbal Eats 程式碼研究室:
- 使用 Eventarc 觸發 Cloud Workflows
- 從 Cloud Storage 觸發事件處理
- 從 Cloud Run 連線至 Private CloudSQL
- 從 Cloud Run 連線至全代管資料庫
- 透過 Identity Aware Proxy (IAP) 提供安全的無伺服器應用程式
- 使用 Cloud Scheduler 觸發 Cloud Run 工作
- 安全地部署至 Cloud Run
- 保護 Cloud Run 輸入流量
清除所用資源
如要避免系統向您的 Google Cloud 帳戶收取本教學課程所用資源的費用,請刪除含有相關資源的專案,或者保留專案但刪除個別資源。
刪除專案
如要避免付費,最簡單的方法就是刪除您針對教學課程建立的專案。