การพัฒนา InnerLoop ด้วย NodeJS

1. ภาพรวม

แล็บนี้จะสาธิตฟีเจอร์และความสามารถที่ออกแบบมาเพื่อเพิ่มประสิทธิภาพเวิร์กโฟลว์การพัฒนาสำหรับวิศวกรซอฟต์แวร์ที่ได้รับมอบหมายให้พัฒนาแอปพลิเคชัน NodeJS ในสภาพแวดล้อมที่มีคอนเทนเนอร์ การพัฒนาคอนเทนเนอร์โดยทั่วไปกำหนดให้ผู้ใช้ต้องเข้าใจรายละเอียดของคอนเทนเนอร์และกระบวนการบิลด์คอนเทนเนอร์ นอกจากนี้ โดยปกติแล้ว นักพัฒนาแอปจะต้องหยุดโฟลว์การทำงาน ย้ายออกจาก IDE เพื่อทดสอบและแก้ไขข้อบกพร่องของแอปพลิเคชันในสภาพแวดล้อมระยะไกล เครื่องมือและเทคโนโลยีที่กล่าวถึงในบทแนะนำนี้ช่วยให้นักพัฒนาแอปทำงานกับแอปพลิเคชันที่ใช้คอนเทนเนอร์ได้อย่างมีประสิทธิภาพโดยไม่ต้องออกจาก IDE

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

ในแล็บนี้ คุณจะได้เรียนรู้วิธีการพัฒนาด้วยคอนเทนเนอร์ใน GCP ซึ่งรวมถึง

  • การสร้างแอปพลิเคชัน Nodejs เริ่มต้น
  • การกำหนดค่าแอปพลิเคชัน Nodejs สำหรับการพัฒนาคอนเทนเนอร์
  • การเขียนโค้ดบริการ REST แบบ CRUD อย่างง่าย
  • การติดตั้งใช้งานใน GKE
  • การแก้ไขข้อบกพร่องของสถานะข้อผิดพลาด
  • การใช้เบรกพอยท์ / บันทึก
  • การเปลี่ยนแปลงการฮอตดีพลอยกลับไปยัง GKE
  • ไม่บังคับ: การผสานรวม CloudSQL เพื่อการคงอยู่ของข้อมูลส่วนหลัง

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

การตั้งค่าสภาพแวดล้อมแบบเรียนรู้ด้วยตนเอง

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

b35bf95b8bf3d5d8.pnga99b7ace416376c4.pngbd84a6d3004737c5.png

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

เริ่มโปรแกรมแก้ไข Cloud Shell

แล็บนี้ออกแบบและทดสอบเพื่อใช้กับ Google Cloud Shell Editor วิธีเข้าถึงเอดิเตอร์

  1. เข้าถึงโปรเจ็กต์ Google ที่ https://console.cloud.google.com
  2. คลิกไอคอนโปรแกรมแก้ไข Cloud Shell ที่มุมขวาบน

8560cc8d45e8c112.png

  1. แผงใหม่จะเปิดขึ้นที่ด้านล่างของหน้าต่าง
  2. คลิกปุ่ม "เปิดเครื่องมือแก้ไข"

9e504cb98a6a8005.png

  1. เครื่องมือแก้ไขจะเปิดขึ้นพร้อมกับ Explorer ทางด้านขวาและเครื่องมือแก้ไขในพื้นที่ส่วนกลาง
  2. นอกจากนี้ ควรมีแผงเทอร์มินัลที่ด้านล่างของหน้าจอด้วย
  3. หากเทอร์มินัลไม่ได้เปิดอยู่ ให้ใช้ชุดค่าผสมของปุ่ม `ctrl+`` เพื่อเปิดหน้าต่างเทอร์มินัลใหม่

ตั้งค่า gcloud

ใน Cloud Shell ให้ตั้งค่ารหัสโปรเจ็กต์และภูมิภาคที่คุณต้องการทำให้แอปพลิเคชันใช้งานได้ บันทึกเป็นตัวแปร PROJECT_ID และ REGION

export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')

ตั้งค่าคลัสเตอร์ GKE และฐานข้อมูล

  1. ดาวน์โหลดสคริปต์การตั้งค่าและทำให้สคริปต์ใช้งานได้
wget https://raw.githubusercontent.com/GoogleCloudPlatform/container-developer-workshop/main/labs/nodejs/setup.sh
chmod +x setup.sh

จัดสรรโครงสร้างพื้นฐานที่ใช้ในแล็บนี้

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

  1. เปิดไฟล์ setup.sh แล้วแก้ไขค่าของรหัสผ่านที่ตั้งค่าเป็น CHANGEME ในปัจจุบัน
  2. เรียกใช้สคริปต์การตั้งค่าเพื่อสร้างคลัสเตอร์ GKE และฐานข้อมูล Cloud SQL ที่คุณจะใช้ใน Lab นี้
./setup.sh
  1. ใน Cloud Shell ให้สร้างไดเรกทอรีใหม่ชื่อ mynodejsapp
mkdir mynodejsapp
  1. เปลี่ยนไปใช้ไดเรกทอรีนี้แล้วเปิดเป็นพื้นที่ทำงาน ซึ่งจะโหลดเอดิเตอร์ซ้ำโดยสร้างการกำหนดค่าพื้นที่ทำงานในโฟลเดอร์ที่สร้างขึ้นใหม่
cd mynodejsapp && cloudshell workspace .
  1. ติดตั้ง Node และ NPM โดยใช้ NVM
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash
        
        # This loads nvm bash_completion
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  

nvm install stable

nvm alias default stable

3. สร้างแอปพลิเคชันเงื่อนไขเริ่มต้นใหม่

  1. เริ่มต้นแอปพลิเคชัน

สร้างไฟล์ package.json โดยเรียกใช้คำสั่งต่อไปนี้

npm init
    Choose the entry point: (index.js) src/index.js and default values for the rest of the parameters. This will create the file with following contents
{
  "name": "mynodejsapp",
  "version": "1.0.0",
  "description": "",
  "main": "src/index.js",,
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}
  1. เพิ่มจุดแรกเข้า

แก้ไขไฟล์นี้เพื่อให้มีคำสั่งเริ่มต้นในสคริปต์ "start": "node src/index.js", หลังจากทำการเปลี่ยนแปลงแล้ว สคริปต์ควรมีลักษณะเหมือนข้อมูลโค้ดด้านล่าง

"scripts": {
    "start": "node src/index.js",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  1. เพิ่มทรัพยากร Dependency ของ Express

โค้ดที่เราจะเพิ่มยังใช้ express ด้วย ดังนั้นเรามาเพิ่มทรัพยากร Dependency นั้นลงในไฟล์ package.json นี้กัน ดังนั้นหลังจากทำการเปลี่ยนแปลงทั้งหมดแล้ว ไฟล์ package.json ควรมีลักษณะดังที่แสดงด้านล่าง

​​{
  "name": "mynodejsapp",
  "version": "1.0.0",
  "description": "",
  "main": "src/index.js",
  "scripts": {
    "start": "node src/index.js",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "Your Name",
  "license": "ISC",
  "dependencies": {
    "express": "^4.16.4"
  }
}
  1. สร้างไฟล์ index.js

สร้างไดเรกทอรีต้นทางชื่อ src

สร้าง src/index.js ด้วยโค้ดต่อไปนี้

const express = require('express');
const app = express();
const PORT = 8080;

app.get('/', (req, res) => {
    var message="Greetings from Node";
    res.send({ message: message });
  });

app.listen(PORT, () => {
  console.log(`Server running at: http://localhost:${PORT}/`);

});

โปรดทราบว่าตั้งค่า PORT เป็น 8080

สร้างไฟล์ Manifest

Skaffold มีเครื่องมือแบบผสานรวมที่จะช่วยลดความซับซ้อนในการพัฒนาคอนเทนเนอร์ ในขั้นตอนนี้ คุณจะเริ่มต้น Skaffold ซึ่งจะสร้างไฟล์ YAML ของ Kubernetes ฐานโดยอัตโนมัติ เรียกใช้คำสั่งด้านล่างเพื่อเริ่มกระบวนการ

เรียกใช้คำสั่งต่อไปนี้ในเทอร์มินัล

skaffold init --generate-manifests

เมื่อมีข้อความแจ้ง ให้ทำดังนี้

  • ป้อน 8080 สำหรับพอร์ต
  • ป้อน y เพื่อบันทึกการกำหนดค่า

ระบบจะเพิ่มไฟล์ 2 ไฟล์ลงในพื้นที่ทำงาน ได้แก่ skaffold.yaml และ deployment.yaml

อัปเดตชื่อแอป

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

  1. เปลี่ยนรายการในการกำหนดค่า Skaffold
  • เปิด skaffold.yaml
  • เลือกชื่อรูปภาพที่ตั้งเป็น package-json-image ในปัจจุบัน
  • คลิกขวาแล้วเลือก "เปลี่ยนทุกรายการ"
  • พิมพ์ชื่อใหม่เป็นภาษาmynodejsapp
  1. เปลี่ยนรายการในการกำหนดค่า Kubernetes
  • เปิดไฟล์ deployment.yaml
  • เลือกชื่อรูปภาพที่ตั้งเป็น package-json-image ในปัจจุบัน
  • คลิกขวาแล้วเลือก "เปลี่ยนทุกรายการ"
  • พิมพ์ชื่อใหม่เป็นภาษาmynodejsapp

โปรดทราบว่าในskaffold.yaml ไฟล์ ส่วน build จะใช้ buildpacks เพื่อจัดคอนเทนเนอร์แอปพลิเคชัน โค้ดนี้ไม่มี Dockerfile และนักพัฒนาแอปไม่จำเป็นต้องมีความรู้เกี่ยวกับ Docker เพื่อทำแอปพลิเคชันนี้ให้เป็นคอนเทนเนอร์

นอกจากนี้ การกำหนดค่า skaffold นี้ยังเปิดใช้การซิงค์ด่วนโดยอัตโนมัติระหว่างเอดิเตอร์กับคอนเทนเนอร์ที่ทำงานอยู่ด้วย ไม่จำเป็นต้องมีการกำหนดค่าเพิ่มเติมเพื่อเปิดใช้การซิงค์ด่วน

4. การเดินผ่านกระบวนการพัฒนา

ในส่วนนี้ คุณจะได้ทำตามขั้นตอน 2-3 ขั้นตอนโดยใช้ปลั๊กอิน Cloud Code เพื่อเรียนรู้กระบวนการพื้นฐาน รวมถึงตรวจสอบการกำหนดค่าและการตั้งค่าของแอปพลิเคชันเริ่มต้น

Cloud Code ผสานรวมกับ Skaffold เพื่อเพิ่มประสิทธิภาพกระบวนการพัฒนา เมื่อคุณทําการติดตั้งใช้งานใน GKE ในขั้นตอนต่อไปนี้ Cloud Code และ Skaffold จะสร้างอิมเมจคอนเทนเนอร์ พุชไปยัง Container Registry แล้วจึงทําการติดตั้งใช้งานแอปพลิเคชันใน GKE โดยอัตโนมัติ ซึ่งจะเกิดขึ้นเบื้องหลังโดยซ่อนรายละเอียดจากขั้นตอนการทำงานของนักพัฒนาแอป นอกจากนี้ Cloud Code ยังช่วยเพิ่มประสิทธิภาพกระบวนการพัฒนาด้วยการมอบความสามารถในการแก้ไขข้อบกพร่องและการซิงค์ด่วนแบบเดิมให้กับการพัฒนาที่อิงตามคอนเทนเนอร์

ทําให้ใช้งานได้ใน Kubernetes

  1. เลือก Cloud Code  ในบานหน้าต่างที่ด้านล่างของ Cloud Shell Editor

fdc797a769040839.png

  1. เลือกเรียกใช้ใน Kubernetes ในแผงที่ปรากฏที่ด้านบน หากได้รับข้อความแจ้ง ให้เลือก "ใช่" เพื่อใช้บริบท Kubernetes ปัจจุบัน

cfce0d11ef307087.png

  1. เมื่อเรียกใช้คำสั่งเป็นครั้งแรก ข้อความแจ้งจะปรากฏที่ด้านบนของหน้าจอเพื่อถามว่าคุณต้องการใช้บริบท Kubernetes ปัจจุบันหรือไม่ ให้เลือก "ใช่" เพื่อยอมรับและใช้บริบทปัจจุบัน

817ee33b5b412ff8.png

  1. จากนั้นระบบจะแสดงข้อความแจ้งเพื่อถามว่าควรใช้รีจิสทรีคอนเทนเนอร์ใด กด Enter เพื่อยอมรับค่าเริ่มต้นที่ระบุ

eb4469aed97a25f6.png

  1. เลือกแท็บเอาต์พุตในบานหน้าต่างด้านล่างเพื่อดูความคืบหน้าและการแจ้งเตือน

f95b620569ba96c5.png

  1. เลือก "Kubernetes: เรียกใช้/แก้ไขข้อบกพร่อง - โดยละเอียด" ในเมนูแบบเลื่อนลงของช่องทางทางด้านขวาเพื่อดูรายละเอียดเพิ่มเติมและบันทึกที่สตรีมแบบสดจากคอนเทนเนอร์

94acdcdda6d2108.png

  1. กลับไปที่มุมมองแบบง่ายโดยเลือก "Kubernetes: เรียกใช้/แก้ไขข้อบกพร่อง" จากเมนูแบบเลื่อนลง
  2. เมื่อบิลด์และทดสอบเสร็จแล้ว แท็บเอาต์พุตจะแสดงข้อความ Resource deployment/mynodejsapp status completed successfully และ URL ที่ระบุคือ "Forwarded URL from service demo-app: http://localhost:8080"
  3. ในเทอร์มินัล Cloud Code ให้วางเมาส์เหนือ URL ในเอาต์พุต (http://localhost:8080) จากนั้นเลือก "เปิดตัวอย่างเว็บ" ในเคล็ดลับเครื่องมือที่ปรากฏขึ้น

คำตอบจะเป็นดังนี้

{"message":"Greetings from Node"}

Hot Reload

  1. นำทางไปยัง src/index.js แก้ไขรหัสข้อความทักทายถึง 'Hello from Node'

สังเกตได้ทันทีว่าในหน้าต่าง Output มุมมอง Kubernetes: Run/Debug ผู้ดูจะซิงค์ไฟล์ที่อัปเดตกับคอนเทนเนอร์ใน Kubernetes

Update initiated
File sync started for 1 files for gcr.io/myproject/mynodejsapp:latest@sha256:f554756b3b4d6c301c4b26ef96102227cfa2833270db56241248ae42baa1971a
File sync succeeded for 1 files for gcr.io/myproject/mynodejsapp:latest@sha256:f554756b3b4d6c301c4b26ef96102227cfa2833270db56241248ae42baa1971a
Update succeeded
  1. หากเปลี่ยนไปใช้Kubernetes: Run/Debug - Detailedมุมมอง คุณจะเห็นว่าระบบจดจำการเปลี่ยนแปลงไฟล์และรีสตาร์ทโหนด
files modified: [src/index.js]
Copying files:map[src/index.js:[/workspace/src/index.js]]togcr.io/myproject/mynodejsapp:latest@sha256:f554756b3b4d6c301c4b26ef96102227cfa2833270db56241248ae42baa1971a
Syncing 1 files for gcr.io/myproject/mynodejsapp:latest@sha256:f554756b3b4d6c301c4b26ef96102227cfa2833270db56241248ae42baa1971a
Watching for changes...
[mynodejsapp]
[mynodejsapp]> mynodejsapp@1.0.0 start /workspace
[mynodejsapp]> node src/index.js
[mynodejsapp]
[mynodejsapp]Server running at: http://localhost:8080/
  1. โปรดรีเฟรชเบราว์เซอร์เพื่อดูผลลัพธ์ที่อัปเดต

การแก้ไขข้อบกพร่อง

  1. ไปที่มุมมองการแก้ไขข้อบกพร่องและหยุดเธรดปัจจุบัน 647213126d7a4c7b.png
  2. คลิก Cloud Code ในเมนูด้านล่าง แล้วเลือก Debug on Kubernetes เพื่อเรียกใช้แอปพลิเคชันในโหมด debug
  • ในKubernetes Run/Debug - DetailedมุมมองของOutputหน้าต่าง ให้สังเกตว่า Skaffold จะนำแอปพลิเคชันนี้ไปใช้งานในโหมดแก้ไขข้อบกพร่อง
  • การสร้างและติดตั้งใช้งานแอปพลิเคชันจะใช้เวลา 2-3 นาที คุณจะเห็นว่าดีบักเกอร์แนบมาในครั้งนี้
Port forwarding pod/mynodejsapp-6bbcf847cd-vqr6v in namespace default, remote port 9229 -> http://127.0.0.1:9229
[mynodejsapp]Debugger attached.
  1. แถบสถานะด้านล่างจะเปลี่ยนสีจากสีน้ำเงินเป็นสีส้ม ซึ่งบ่งบอกว่าอยู่ในโหมดแก้ไขข้อบกพร่อง
  2. ในมุมมอง Kubernetes Run/Debug ให้สังเกตว่ามีการเริ่มคอนเทนเนอร์ที่แก้ไขข้อบกพร่องได้
**************URLs*****************
Forwarded URL from service mynodejsapp-service: http://localhost:8080
Debuggable container started pod/mynodejsapp-deployment-6bc7598798-xl9kj:mynodejsapp (default)
Update succeeded
***********************************

ใช้เบรกพอยท์

  1. เปิด src/index.js
  2. ค้นหาสถานะที่ระบุว่า var message="Greetings from Node";
  3. เพิ่มเบรกพอยต์ในบรรทัดนั้นโดยคลิกพื้นที่ว่างทางด้านซ้ายของหมายเลขบรรทัด ตัวบ่งชี้สีแดงจะแสดงขึ้นเพื่อระบุว่ามีการตั้งค่าเบรกพอยต์
  4. โหลดเบราว์เซอร์ซ้ำและสังเกตว่าดีบักเกอร์จะหยุดกระบวนการที่เบรกพอยต์และช่วยให้คุณตรวจสอบตัวแปรและสถานะของแอปพลิเคชันที่ทำงานจากระยะไกลใน GKE ได้
  5. คลิกส่วนตัวแปรลงไปจนกว่าจะพบตัวแปร "message"
  6. เรียกใช้บรรทัดโดยกด Step over 7cfdee4fd6ef5c3a.png
  7. สังเกตการเปลี่ยนแปลงค่าปัจจุบันของตัวแปร "message" เป็น "Greetings from Node"
  8. ดับเบิลคลิกชื่อตัวแปร "target" และในป๊อปอัป ให้เปลี่ยนค่าเป็นค่าอื่น เช่น "Hello from Node"
  9. คลิกปุ่ม "ดำเนินการต่อ" ในแผงควบคุมการแก้ไขข้อบกพร่อง
  10. ตรวจสอบการตอบกลับในเบราว์เซอร์ ซึ่งตอนนี้จะแสดงค่าที่อัปเดตที่คุณเพิ่งป้อน
  11. หยุดโหมด "แก้ไขข้อบกพร่อง" โดยกดปุ่มหยุด 647213126d7a4c7b.png และนำจุดพักออกโดยคลิกจุดพักอีกครั้ง

5. การพัฒนาบริการ REST แบบ CRUD อย่างง่าย

ตอนนี้แอปพลิเคชันของคุณได้รับการกำหนดค่าอย่างสมบูรณ์สำหรับการพัฒนาแบบคอนเทนเนอร์แล้ว และคุณได้ทำตามเวิร์กโฟลว์การพัฒนาพื้นฐานด้วย Cloud Code แล้ว ในส่วนต่อไปนี้ คุณจะได้ฝึกฝนสิ่งที่ได้เรียนรู้โดยการเพิ่มปลายทางของบริการ REST ที่เชื่อมต่อกับฐานข้อมูลที่มีการจัดการใน Google Cloud

กำหนดค่าการอ้างอิง

โค้ดของแอปพลิเคชันใช้ฐานข้อมูลเพื่อจัดเก็บข้อมูลบริการ REST ตรวจสอบว่าทรัพยากร Dependency พร้อมใช้งานโดยเพิ่มรายการต่อไปนี้ในไฟล์ package.json

  1. เพิ่ม Dependency อีก 2 รายการ pg และ sequelize ลงในไฟล์ package.json เพื่อสร้างแอปพลิเคชัน CRUD ของ Postgres การโพสต์การเปลี่ยนแปลงในส่วนการขึ้นต่อกันจะมีลักษณะดังนี้
    "dependencies": {
    "express": "^4.16.4",
    "pg": "^8.7.3",
    "sequelize": "^6.17.0"
  }

เขียนโค้ดบริการ REST

  1. เพิ่มโค้ดของแอปพลิเคชัน CRUD ลงในแอปพลิเคชันนี้
wget -O app.zip https://github.com/GoogleCloudPlatform/container-developer-workshop/raw/main/labs/nodejs/app.zip

unzip app.zip

รหัสนี้มี

  • โฟลเดอร์ models ที่มีโมเดลเอนทิตีสำหรับ item
  • โฟลเดอร์ controllers ที่มีโค้ดที่ดำเนินการ CRUD
  • โฟลเดอร์ routes ที่กำหนดเส้นทางรูปแบบ URL ที่เฉพาะเจาะจงไปยังการเรียกที่แตกต่างกัน
  • โฟลเดอร์ config ที่มีรายละเอียดการเชื่อมต่อฐานข้อมูล
  1. โปรดทราบว่าการกำหนดค่าฐานข้อมูลในไฟล์ db.config.js หมายถึงตัวแปรสภาพแวดล้อมที่ต้องระบุเพื่อเชื่อมต่อกับฐานข้อมูล นอกจากนี้ คุณยังต้องแยกวิเคราะห์คำขอขาเข้าเพื่อการเข้ารหัส URL ด้วย
  2. เพิ่มข้อมูลโค้ดต่อไปนี้ใน src/index.js เพื่อให้เชื่อมต่อกับโค้ด CRUD จากไฟล์ JavaScript หลักได้ทันทีก่อนส่วนสุดท้ายที่เริ่มต้นด้วย app.listen(PORT, () => {
const bodyParser = require('body-parser')
app.use(bodyParser.json())
app.use(
 bodyParser.urlencoded({
   extended: true,
 })
)
const db = require("../app/models");
db.sequelize.sync();
require("../app/routes/item.routes")(app);
  1. แก้ไขการติดตั้งใช้งานในไฟล์ deployment.yaml เพื่อเพิ่มตัวแปรสภาพแวดล้อมเพื่อระบุข้อมูลการเชื่อมต่อฐานข้อมูล

อัปเดตรายการข้อกำหนดที่ส่วนท้ายของไฟล์ให้ตรงกับคำจำกัดความต่อไปนี้

    spec:
      containers:
      - name: mynodejsapp
        image: mynodejsapp
        env:
        - name: DB_HOST
          value: ${DB_INSTANCE_IP}        
        - name: DB_PORT
          value: "5432"  
        - name: DB_USER
          valueFrom:
            secretKeyRef:
              name: gke-cloud-sql-secrets
              key: username
        - name: DB_PASS
          valueFrom:
            secretKeyRef:
              name: gke-cloud-sql-secrets
              key: password
        - name: DB_NAME
          valueFrom:
            secretKeyRef:
              name: gke-cloud-sql-secrets
              key: database
  1. แทนที่ค่า DB_HOST ด้วยที่อยู่ของฐานข้อมูล
export DB_INSTANCE_IP=$(gcloud sql instances describe mytest-instance \
    --format=json | jq \
    --raw-output ".ipAddresses[].ipAddress")

envsubst < deployment.yaml > deployment.new && mv deployment.new deployment.yaml

ทำให้แอปพลิเคชันใช้งานได้และตรวจสอบ

  1. ในแผงที่ด้านล่างของ Cloud Shell Editor ให้เลือก Cloud Code จากนั้นเลือก Debug on Kubernetes ที่ด้านบนของหน้าจอ
  2. เมื่อการสร้างและการทดสอบเสร็จสมบูรณ์ แท็บเอาต์พุตจะแสดงข้อความ Resource deployment/mynodejsapp status completed successfully และ URL ที่ระบุคือ "Forwarded URL from service mynodejsapp: http://localhost:8080"
  3. เพิ่มรายการ 2-3 รายการ

เรียกใช้คำสั่งด้านล่างจากเทอร์มินัล Cloud Shell

URL=localhost:8080
curl -X POST $URL/items -d '{"itemName":"Body Spray", "itemPrice":3.2}' -H "Content-Type: application/json"
curl -X POST $URL/items -d '{"itemName":"Nail Cutter", "itemPrice":2.5}' -H "Content-Type: application/json"
  1. ทดสอบ GET โดยเรียกใช้ $URL/items ในเบราว์เซอร์ นอกจากนี้ คุณยังเรียกใช้ curl จากบรรทัดคำสั่งได้ด้วย
curl -X GET $URL/items
  1. ทดสอบการลบ: ตอนนี้ลองลบรายการโดยเรียกใช้ เปลี่ยนค่าของรหัสสินค้าหากจำเป็น
curl -X DELETE $URL/items/1
    This throws an error message
{"message":"Could not delete Item with id=[object Object]"}

ระบุและแก้ไขปัญหา

  1. รีสตาร์ทแอปพลิเคชันในโหมดแก้ไขข้อบกพร่องและค้นหาปัญหา มาดูเคล็ดลับบางส่วนกัน
  • เราทราบว่ามีบางอย่างผิดปกติกับคำสั่ง DELETE เนื่องจากไม่ได้แสดงผลลัพธ์ที่ต้องการ ดังนั้นคุณจึงตั้งค่าเบรกพอยต์ในเมธอด itemcontroller.js->exports.delete
  • เรียกใช้การดำเนินการทีละขั้นตอนและดูตัวแปรในแต่ละขั้นตอนเพื่อสังเกตค่าของตัวแปรภายในในหน้าต่างด้านซ้าย
  • หากต้องการสังเกตค่าที่เฉพาะเจาะจง เช่น request.params ให้เพิ่มตัวแปรนี้ลงในหน้าต่าง Watch
  1. โปรดทราบว่าค่าที่กำหนดให้กับ id คือ undefined เปลี่ยนรหัสเพื่อแก้ไขปัญหา

ข้อมูลโค้ดที่แก้ไขแล้วจะมีลักษณะดังนี้

// Delete a Item with the specified id in the request
exports.delete = (req, res) => {
    const id = req.params.id;
  1. เมื่อรีสตาร์ทแอปพลิเคชันแล้ว ให้ทดสอบอีกครั้งโดยลองลบ
  2. หยุดเซสชันการแก้ไขข้อบกพร่องโดยคลิกสี่เหลี่ยมสีแดงในแถบเครื่องมือการแก้ไขข้อบกพร่อง 647213126d7a4c7b.png

6. ล้างข้อมูล

ยินดีด้วย ในแล็บนี้ คุณได้สร้างแอปพลิเคชัน Nodejs ใหม่ตั้งแต่ต้นและกำหนดค่าให้ทำงานในโหมดการติดตั้งใช้งานแบบร้อนด้วยคอนเทนเนอร์ จากนั้นคุณได้ทําการติดตั้งใช้งานและแก้ไขข้อบกพร่องของแอปพลิเคชันไปยังคลัสเตอร์ GKE ระยะไกลตามขั้นตอนการพัฒนาเดียวกันกับที่พบในสแต็กแอปพลิเคชันแบบเดิม

วิธีล้างข้อมูลหลังจากทำแล็บเสร็จแล้ว

  1. ลบไฟล์ที่ใช้ในห้องทดลอง
cd ~ && rm -rf mynodejsapp && rm -f setup.sh
  1. ลบโปรเจ็กต์เพื่อนำโครงสร้างพื้นฐานและทรัพยากรที่เกี่ยวข้องทั้งหมดออก