การกำหนดค่า Eventarc เพื่อทริกเกอร์เวิร์กโฟลว์ที่ผสานรวมกับ GKE Autopilot และ Pub/Sub

การกำหนดค่า Eventarc เพื่อทริกเกอร์เวิร์กโฟลว์ที่ผสานรวมกับ GKE Autopilot และ Pub/Sub

เกี่ยวกับ Codelab นี้

subjectอัปเดตล่าสุดเมื่อ ก.พ. 2, 2023
account_circleเขียนโดย Andrey Shakirov, Christopher Grant

1 ภาพรวม

ในห้องทดลองนี้ คุณจะสร้างทริกเกอร์ Eventarc ที่เชื่อมต่อหัวข้อ Pub/Sub กับบริการเวิร์กโฟลว์ Eventarc ให้คุณแยกบริการออกจากการสื่อสารด้านบริการ ทำให้โซลูชันมีความยืดหยุ่นและขับเคลื่อนเหตุการณ์ได้มากขึ้น คุณจะสร้างเวิร์กโฟลว์ที่มีหลายขั้นตอนในการดำเนินกระบวนการทางธุรกิจเพื่อคำนวณคะแนนสะสมของลูกค้าสำหรับการสั่งซื้อที่ Cymbal Eats เวิร์กโฟลว์จะส่งคำขอหลายรายการไปยังแอปพลิเคชันที่ทำงานบน GKE Autopilot และเผยแพร่ข้อความไปยังหัวข้อ Pub/Sub เพื่อแจ้งแอปพลิเคชันบริการสั่งซื้อเกี่ยวกับคะแนนสะสมที่คำนวณแล้ว

6c0606022b76f79d.png

GKE Autopilot คืออะไร

GKE Autopilot คือโหมดการทำงานใน GKE ที่ Google จัดการการกำหนดค่าคลัสเตอร์ของคุณ รวมถึงโหนด การปรับขนาด การรักษาความปลอดภัย และการตั้งค่าอื่นๆ ที่กำหนดค่าไว้ล่วงหน้า คลัสเตอร์ Autopilot ได้รับการเพิ่มประสิทธิภาพเพื่อเรียกใช้ภาระงานเวอร์ชันที่ใช้งานจริงส่วนใหญ่ และจัดสรรทรัพยากรการประมวลผลโดยอิงตามไฟล์ Manifest ของ Kubernetes การกำหนดค่าที่มีประสิทธิภาพเป็นไปตามแนวทางปฏิบัติแนะนำและคำแนะนำสำหรับ GKE สำหรับการตั้งค่าคลัสเตอร์และภาระงาน ความสามารถในการปรับขนาด และการรักษาความปลอดภัย โปรดดูรายการการตั้งค่าในตัวที่ตารางการเปรียบเทียบ Autopilot และมาตรฐาน

เมื่อใช้ GKE มาตรฐาน ผู้ใช้จะมีหน้าที่จัดการโหนดผู้ปฏิบัติงานและการกำหนดค่า Node Pool ในขณะที่ GKE จะจัดการส่วนที่เหลือ

ความรับผิดชอบของลูกค้าเทียบกับ Google เมื่อทำงานในโหมด GKE มาตรฐาน

85500aad65f87437.png

เมื่อใช้ GKE Autopilot การกำหนดค่าและการจัดการ Node Pool เป็นความรับผิดชอบของ Google ซึ่งจะช่วยให้คุณโฟกัสที่แอปพลิเคชันและบริการที่ทำงานที่ด้านบนของคลัสเตอร์ได้

Eventarc คืออะไร

Eventarc ช่วยให้คุณสร้างสถาปัตยกรรมที่ขับเคลื่อนด้วยเหตุการณ์ได้โดยไม่ต้องใช้ ปรับแต่ง หรือบำรุงรักษาโครงสร้างพื้นฐานที่สำคัญ Eventarc นำเสนอโซลูชันที่เป็นมาตรฐานเพื่อจัดการโฟลว์ของการเปลี่ยนแปลงสถานะ ซึ่งเรียกว่าเหตุการณ์ ระหว่าง Microservice ที่แยกส่วนออกจากกัน เมื่อทริกเกอร์ Eventarc จะกำหนดเส้นทางเหตุการณ์เหล่านี้ผ่านการสมัครใช้บริการ Pub/Sub ไปยังปลายทางต่างๆ (เช่น เวิร์กโฟลว์, Cloud Run) ไปพร้อมกับจัดการการนำส่ง ความปลอดภัย การให้สิทธิ์ ความสามารถในการสังเกต และการจัดการข้อผิดพลาดให้คุณ

ผู้ให้บริการเหตุการณ์ของ Google

  • ผู้ให้บริการ Google Cloud มากกว่า 90 ราย ผู้ให้บริการเหล่านี้จะส่งเหตุการณ์จากแหล่งที่มาโดยตรง (เช่น Cloud Storage) หรือผ่านรายการบันทึก Cloud Audit
  • ผู้ให้บริการ Pub/Sub ผู้ให้บริการเหล่านี้จะส่งเหตุการณ์ไปยัง Eventarc โดยใช้ข้อความ Pub/Sub

ผู้ให้บริการบุคคลที่สาม

ผู้ให้บริการบุคคลที่สามคือนิติบุคคลที่ไม่ใช่ Google ซึ่งนําเสนอแหล่งที่มาของ Eventarc

ทริกเกอร์ Eventarc

  • เหตุการณ์ Cloud Pub/Sub Eventarc จะทริกเกอร์ได้ด้วยข้อความที่เผยแพร่ไปยังหัวข้อ Pub/Sub
  • เหตุการณ์บันทึกการตรวจสอบ Cloud (CAL) บันทึกการตรวจสอบของ Cloud จะมีบันทึกการตรวจสอบกิจกรรมของผู้ดูแลระบบและการเข้าถึงข้อมูลสำหรับโปรเจ็กต์ โฟลเดอร์ และองค์กรในระบบคลาวด์แต่ละรายการ
  • กิจกรรมโดยตรง Eventarc สามารถทริกเกอร์ได้โดยเหตุการณ์โดยตรงหลายรายการ เช่น การอัปเดตที่เก็บข้อมูล Cloud Storage หรือการอัปเดตเทมเพลตการกำหนดค่าระยะไกลของ Firebase

จุดหมายของเหตุการณ์

c7ca054200edf1b3.png

เวิร์กโฟลว์คืออะไร

เวิร์กโฟลว์คือบริการที่มีการจัดการครบวงจรซึ่งช่วยให้คุณผสานรวม Microservice, งาน และ API ได้ เวิร์กโฟลว์เป็นบริการแบบ Serverless และจะปรับขนาดให้ตรงกับความต้องการของคุณ

กรณีการใช้งานเวิร์กโฟลว์

  • เวิร์กโฟลว์ที่ขับเคลื่อนด้วยเหตุการณ์จะดำเนินการกับทริกเกอร์ที่กำหนด เช่น เมื่อมีการส่งคำสั่งซื้อใหม่และคุณต้องการคำนวณคะแนนสะสมของลูกค้า หรือเมื่อคำสั่งซื้อถูกยกเลิก กิจกรรมจะเผยแพร่ได้และบริการที่สนใจทั้งหมดจะประมวลผลกิจกรรม
  • เวิร์กโฟลว์ของงานแบบกลุ่มจะเรียกใช้งานเป็นประจำโดยใช้ Cloud Scheduler ตัวอย่างเช่น งานทุกคืนสำหรับตรวจสอบรายการในเมนูที่อยู่ในสถานะล้มเหลวและลบออก

เวิร์กโฟลว์เหมาะสำหรับเวิร์กโฟลว์ที่จัดการบริการเป็นกลุ่ม คุณสามารถทำให้กระบวนการทำงานโดยอัตโนมัติ ซึ่งได้แก่ การรอและการลองใหม่เป็นเวลาสูงสุด 1 ปี

ประโยชน์ของเวิร์กโฟลว์

  • การกำหนดค่าผ่านโค้ด: ลดหนี้ทางเทคนิคด้วยการย้ายตรรกะไปยังการกำหนดค่าแทนการเขียนโค้ด
  • ลดความซับซ้อนของสถาปัตยกรรม เวิร์กโฟลว์การเก็บสถานะช่วยให้คุณแสดงภาพและตรวจสอบการผสานรวมบริการที่ซับซ้อนได้โดยไม่ต้องใช้ทรัพยากร Dependency เพิ่มเติม
  • ผสานรวมความน่าเชื่อถือและความอดทนต่อความผิดพลาด ควบคุมความล้มเหลวด้วยตรรกะการลองอีกครั้งแบบเริ่มต้นหรือแบบกำหนดเอง รวมถึงการจัดการข้อผิดพลาดแม้ในกรณีที่ระบบอื่นล้มเหลว การตรวจสอบจุดทุกขั้นตอนไปยัง Cloud Spanner เพื่อช่วยให้คุณติดตามความคืบหน้าได้
  • ไม่ต้องบำรุงรักษาเลย ปรับขนาดได้ตามต้องการ: ไม่จำเป็นต้องแก้ไขหรือบำรุงรักษา จ่ายเมื่อเวิร์กโฟลว์ทำงานเท่านั้น โดยไม่มีค่าใช้จ่ายระหว่างรอหรือไม่ได้ใช้งาน

ในห้องทดลองนี้ คุณจะต้องกำหนดค่าเวิร์กโฟลว์ที่ขับเคลื่อนด้วยเหตุการณ์

สิ่งที่คุณจะได้เรียนรู้

ในห้องทดลองนี้ คุณจะได้ศึกษาวิธีทำสิ่งต่อไปนี้

  • กำหนดค่าหัวข้อ Pub/Sub และ Eventarc เพื่อทริกเกอร์เวิร์กโฟลว์
  • กำหนดค่าเวิร์กโฟลว์เพื่อทำการเรียก API ไปยังแอปพลิเคชันที่ทำงานบน GKE Autopilot
  • กำหนดค่าเวิร์กโฟลว์เพื่อเผยแพร่ข้อความไปยัง Pub/Sub
  • วิธีค้นหาบันทึกที่มีโครงสร้างของเวิร์กโฟลว์ใน Cloud Logging และการใช้ gcloud CLI

ข้อกำหนดเบื้องต้น

  • ห้องทดลองนี้จะถือว่ามีความคุ้นเคยกับสภาพแวดล้อม Cloud Console และ Cloud Shell
  • ประสบการณ์ GKE และ Cloud Pub/Sub รุ่นก่อนนั้นมีประโยชน์แต่ไม่จำเป็น

2 การตั้งค่าและข้อกำหนด

ตั้งค่าโปรเจ็กต์ที่อยู่ในระบบคลาวด์

  1. ลงชื่อเข้าใช้ Google Cloud Console และสร้างโปรเจ็กต์ใหม่หรือใช้โปรเจ็กต์ที่มีอยู่ซ้ำ หากยังไม่มีบัญชี Gmail หรือ Google Workspace คุณต้องสร้างบัญชี

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • ชื่อโครงการคือชื่อที่แสดงของผู้เข้าร่วมโปรเจ็กต์นี้ เป็นสตริงอักขระที่ Google APIs ไม่ได้ใช้ โดยคุณจะอัปเดตได้ทุกเมื่อ
  • รหัสโปรเจ็กต์จะไม่ซ้ำกันในทุกโปรเจ็กต์ของ Google Cloud และจะเปลี่ยนแปลงไม่ได้ (เปลี่ยนแปลงไม่ได้หลังจากตั้งค่าแล้ว) Cloud Console จะสร้างสตริงที่ไม่ซ้ำกันโดยอัตโนมัติ ปกติแล้วคุณไม่สนว่าอะไรเป็นอะไร ใน Codelab ส่วนใหญ่ คุณจะต้องอ้างอิงรหัสโปรเจ็กต์ (โดยปกติจะระบุเป็น PROJECT_ID) หากคุณไม่ชอบรหัสที่สร้างขึ้น คุณสามารถสร้างรหัสแบบสุ่มอื่นได้ หรือคุณจะลองดำเนินการเองแล้วดูว่าพร้อมให้บริการหรือไม่ และไม่สามารถเปลี่ยนแปลงได้หลังจากขั้นตอนนี้และจะยังคงอยู่ตลอดระยะเวลาของโปรเจ็กต์
  • สำหรับข้อมูลของคุณ ค่าที่ 3 คือหมายเลขโปรเจ็กต์ที่ API บางตัวใช้ ดูข้อมูลเพิ่มเติมเกี่ยวกับค่าทั้ง 3 ค่าได้ในเอกสารประกอบ
  1. ถัดไป คุณจะต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากร/API ของระบบคลาวด์ การใช้งาน Codelab นี้น่าจะไม่มีค่าใช้จ่ายใดๆ หากมี หากต้องการปิดทรัพยากรเพื่อไม่ให้มีการเรียกเก็บเงินนอกเหนือจากบทแนะนำนี้ คุณสามารถลบทรัพยากรที่คุณสร้างหรือลบทั้งโปรเจ็กต์ได้ ผู้ใช้ใหม่ของ Google Cloud จะมีสิทธิ์เข้าร่วมโปรแกรมทดลองใช้ฟรี$300 USD

การตั้งค่าสภาพแวดล้อม

เปิดใช้งาน Cloud Shell โดยคลิกไอคอนทางด้านขวาของแถบค้นหา

8613854df02635a3.png

โคลนที่เก็บและไปยังไดเรกทอรี คัดลอกและวางคำสั่งด้านล่างลงในเทอร์มินัลแล้วกด Enter:

git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git && cd cymbal-eats/customer-service

ทำให้ทรัพยากร Dependency ที่จำเป็นใช้งานได้โดยการเรียกใช้ gke-lab-setup.sh

ระบบจะสร้างแหล่งข้อมูลต่อไปนี้

  • คลัสเตอร์และอินสแตนซ์ของ AlloyDB
  • คลัสเตอร์ GKE Autopilot
./gke-lab-setup.sh

หากได้รับข้อความแจ้งให้ให้สิทธิ์ ให้คลิก "ให้สิทธิ์" เพื่อดำเนินการต่อ

6356559df3eccdda.png

การตั้งค่าจะใช้เวลาประมาณ 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

ตัวอย่างเอาต์พุต:

772db9dd58172e0c.png

เรียกใช้คำสั่งเพื่อจัดเก็บข้อมูลเข้าสู่ระบบสำหรับคลัสเตอร์ ดังนี้

CLUSTER_NAME=rewards-cluster
REGION=us-central1

gcloud container clusters get-credentials $CLUSTER_NAME --region=$REGION

ทำให้แอปพลิเคชันใช้งานได้

ขั้นตอนต่อไปคือการติดตั้งใช้งานแอปพลิเคชันฝ่ายบริการลูกค้า ซึ่งเป็น Microservice ที่ใช้ 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 .

ตั้งค่าที่อยู่ IP ส่วนตัวของ AlloyDB

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 เพื่อจัดเก็บข้อมูลเข้าสู่ระบบของฐานข้อมูลที่แอปพลิเคชันฝ่ายบริการลูกค้าจะใช้เพื่อเชื่อมต่อกับฐานข้อมูล

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

เรียกใช้คำสั่งเพื่อแทนที่ CUSTOMER_SERVICE_IMAGE ในไฟล์Deployment.yaml

sed "s@CUSTOMER_SERVICE_IMAGE@$CUSTOMER_SERVICE_IMAGE@g" deployment.yaml.tmpl > customer-service-deployment.yaml

เรียกใช้คำสั่งเพื่อทำให้แอปพลิเคชันใช้งานได้ด้วยคำสั่งต่อไปนี้

kubectl apply -f customer-service-deployment.yaml

จะใช้เวลาสักครู่เพื่อให้แอปพลิเคชันเปลี่ยนสถานะเป็น "กำลังทำงาน"

ตรวจสอบไฟล์ข้อกำหนดการทำให้ใช้งานได้

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

ตัวอย่างเอาต์พุต:

179a23bd33793924.png

4 ตรวจสอบเวิร์กโฟลว์

แนวคิดหลักของเวิร์กโฟลว์

เวิร์กโฟลว์ประกอบด้วยชุดขั้นตอนซึ่งอธิบายโดยใช้ไวยากรณ์เวิร์กโฟลว์( YAML หรือ JSON)

หลังจากสร้างเวิร์กโฟลว์แล้ว ระบบจะทำให้ใช้งานได้ ซึ่งจะทำให้เวิร์กโฟลว์พร้อมดำเนินการ

การดำเนินการคือการเรียกใช้ตรรกะ 1 ครั้งที่อยู่ในคำจำกัดความของเวิร์กโฟลว์ เวิร์กโฟลว์ที่ยังไม่มีการดำเนินการจะไม่ทำให้เกิดการเรียกเก็บเงิน การดำเนินการตามเวิร์กโฟลว์ทั้งหมดเป็นอิสระจากกัน และการปรับขนาดอย่างรวดเร็วของผลิตภัณฑ์ทำให้เกิดการดำเนินการพร้อมกันจำนวนมาก

การควบคุมการดำเนินการ

  • ขั้นตอน - หากต้องการสร้างเวิร์กโฟลว์ คุณต้องระบุ steps และลำดับการดำเนินการที่ต้องการโดยใช้ไวยากรณ์เวิร์กโฟลว์ เวิร์กโฟลว์ทั้งหมดต้องมีอย่างน้อย 1 ขั้นตอน
  • เงื่อนไข - คุณสามารถใช้บล็อก switch เป็นกลไกการเลือกที่อนุญาตให้ค่าของนิพจน์ควบคุมโฟลว์การดำเนินการของเวิร์กโฟลว์
  • การทำซ้ำ - คุณสามารถใช้การวนซ้ำ for เพื่อทำซ้ำลำดับตัวเลขหรือผ่านการรวบรวมข้อมูล เช่น รายการหรือแผนที่
  • เวิร์กโฟลว์ย่อย - เวิร์กโฟลว์ย่อยทำงานคล้ายกับกิจวัตรหรือฟังก์ชันในภาษาโปรแกรม ซึ่งทำให้คุณสรุปขั้นตอนหรือชุดขั้นตอนที่จะต้องทำซ้ำๆ หลายครั้ง

การทริกเกอร์การดำเนินการ

  • ด้วยตนเอง - คุณสามารถจัดการเวิร์กโฟลว์ได้จากคอนโซล Google Cloud หรือจากบรรทัดคำสั่งโดยใช้ Google Cloud CLI
  • แบบเป็นโปรแกรม - คุณจะใช้ไลบรารีของไคลเอ็นต์ระบบคลาวด์สำหรับ Workflows API หรือ REST API เพื่อจัดการเวิร์กโฟลว์ได้
  • กำหนดเวลาไว้ - คุณใช้ Cloud Scheduler เพื่อเรียกใช้เวิร์กโฟลว์ตามเวลาที่กำหนดได้

อาร์กิวเมนต์รันไทม์

คุณเข้าถึงข้อมูลที่ส่งขณะรันไทม์ได้โดยการเพิ่มช่อง params ลงในเวิร์กโฟลว์หลัก (วางไว้ในบล็อกหลัก) การบล็อกหลักจะยอมรับอาร์กิวเมนต์เดียวที่เป็นประเภทข้อมูล JSON ที่ถูกต้อง ช่องพารามิเตอร์จะตั้งชื่อตัวแปรที่เวิร์กโฟลว์ใช้ในการจัดเก็บข้อมูลที่คุณส่ง

ตรรกะเวิร์กโฟลว์

หากไม่มีลูกค้าอยู่ เวิร์กโฟลว์จะเรียกใช้ 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}

99f9cf1076c03fb6.png

5 กำหนดค่าและทำให้เวิร์กโฟลว์ใช้งานได้

เรียกใช้คำสั่งเพื่อดูที่อยู่ IP ภายนอกสำหรับบริการ:

kubectl get svc

ตัวอย่างเอาต์พุต:

fe5cfec2bc836a5f.png

ตั้งค่าตัวแปรสภาพแวดล้อมด้านล่างโดยใช้ค่าของ IP ภายนอกจากเอาต์พุตก่อนหน้า

CUSTOMER_SERVICE_URL=http://$(kubectl get svc customer-service -o=jsonpath='{.status.loadBalancer.ingress[0].ip}')

แทนที่ URL แอปพลิเคชันฝ่ายบริการลูกค้าในเทมเพลตเวิร์กโฟลว์

sed "s@CUSTOMER_SERVICE_URL@$CUSTOMER_SERVICE_URL@g" gkeRewardsWorkflow.yaml.tmpl > gkeRewardsWorkflow.yaml

ตั้งค่าตำแหน่งสำหรับตัวแปรสภาพแวดล้อมของบริการเวิร์กโฟลว์และโปรเจ็กต์:

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 การบันทึกการเรียก
  • เผยแพร่ข้อความไปยังหัวข้อ PubSub
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

ตรวจสอบแหล่งที่มาของเวิร์กโฟลว์และรายละเอียดอื่นๆ(แท็บทริกเกอร์) ขณะนี้ไม่มีทริกเกอร์ที่กำหนดค่าเพื่อเรียกใช้เวิร์กโฟลว์นี้ คุณจะได้ตั้งค่าในขั้นตอนถัดไป

66ba7ebbde76d5a6.png

6 กำหนดค่าหัวข้อ Pub/Sub และทริกเกอร์ Eventarc

ถัดไป คุณจะต้องสร้างหัวข้อ Pub/Sub จำนวน 2 รายการ และกำหนดค่าทริกเกอร์ Eventarc 1 รายการ

แอปพลิเคชันบริการสั่งซื้อจะเผยแพร่ข้อความไปยัง 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 และส่งไปยังเวิร์กโฟลว์

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 ที่สร้าง

bda445561ad5f4.png

ตรวจสอบการสมัครใช้บริการที่สร้างขึ้นสำหรับทริกเกอร์

3fccdda7d5526597.png

ตรวจสอบการเปลี่ยนแปลงในฝั่งเวิร์กโฟลว์ เพิ่มทริกเกอร์ใหม่

23d338abc16eaac8.png

7 ทดสอบเวิร์กโฟลว์

6c0606022b76f79d.png

หากต้องการจำลองบริการคำสั่งซื้อ คุณจะต้องส่งข้อความไปยังหัวข้อ Pub/Sub จาก Cloud Shell และยืนยันบันทึกฝ่ายบริการลูกค้าใน Cloud Console

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'

ตรวจสอบรายละเอียดการดำเนินการเวิร์กโฟลว์และบันทึก

1e802826c700cc3e.png

57ff9705bf507fb0.png

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

เปิด Logs Explorer ใน Cloud Console และเรียกใช้การค้นหาเพื่อค้นหาคำสั่งซื้อที่ประมวลผลแล้วซึ่งมียอดเงินรวมมากกว่า $2

หากต้องการแสดงช่องคำค้นหา ให้คลิก "แสดงคำค้นหา"

f0a57ff3d10bad2.png

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

ตัวอย่างเอาต์พุต:

9093f87159f1b928.png

เปิด 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:

35d5fd851ecde60.png

เรียกใช้คำสั่งด้านล่างเพื่อแสดงผลบันทึกในรูปแบบ 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:

ac7421548ea9a9f2.png

9 ตรวจสอบบันทึกข้อมูลลูกค้า

(ขั้นตอนที่ไม่บังคับ)

เรียกใช้คำสั่งด้านล่างเพื่อตั้งค่าตัวแปรสภาพแวดล้อม URL ฝ่ายบริการลูกค้า

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 ยินดีด้วย

ยินดีด้วย คุณศึกษา Codelab จบแล้ว

สิ่งที่เราได้พูดคุยกันมีดังนี้

  • วิธีกำหนดค่าหัวข้อ Pub/Sub และ Eventarc เพื่อทริกเกอร์เวิร์กโฟลว์
  • วิธีกำหนดค่าเวิร์กโฟลว์เพื่อเรียก API ไปยังแอปพลิเคชันที่ทำงานบน GKE Autopilot
  • วิธีกำหนดค่าเวิร์กโฟลว์เพื่อเผยแพร่ข้อความไปยัง Pub/Sub
  • วิธีค้นหาบันทึกที่มีโครงสร้างของเวิร์กโฟลว์ใน Cloud Logging และการใช้ gcloud CLI

ขั้นตอนต่อไปที่ทำได้

สำรวจ Codelab อื่นๆ ของ Cymbal Eats

ล้างข้อมูล

เพื่อหลีกเลี่ยงไม่ให้เกิดการเรียกเก็บเงินกับบัญชี Google Cloud สำหรับทรัพยากรที่ใช้ในบทแนะนำนี้ โปรดลบโปรเจ็กต์ที่มีทรัพยากรดังกล่าวหรือเก็บโปรเจ็กต์ไว้และลบทรัพยากรแต่ละรายการ

กำลังลบโปรเจ็กต์

วิธีที่ง่ายที่สุดในการยกเลิกการเรียกเก็บเงินคือการลบโปรเจ็กต์ที่คุณสร้างไว้สำหรับบทแนะนำ