1. บทนำ
อัปเดตล่าสุด: 12-02-2020
Microservices Battle Arena
คุณเคยเล่นปาลูกบอลหิมะไหม ที่คุณเดินไปมาและปาลูกบอลหิมะใส่คนอื่นอย่างสนุกสนาน หากยังไม่เคยลอง ก็ลองใช้ดูสักวัน แต่ตอนนี้คุณไม่ต้องเสี่ยงโดนตบแล้ว คุณสามารถสร้างบริการขนาดเล็กที่เข้าถึงได้ผ่านเครือข่าย (Microservice) ซึ่งจะเข้าร่วมการต่อสู้ครั้งยิ่งใหญ่กับ Microservice อื่นๆ และเนื่องจากเราจัดการแข่งขันไมโครเซอร์วิสครั้งแรกนี้ในแอตแลนตา รัฐจอร์เจีย ไมโครเซอร์วิสของเราจึงจะขว้างลูกพีชแทนลูกบอลหิมะ
คุณอาจสงสัยว่า... แต่ Microservice จะ "ขว้าง" ลูกพีชใส่ Microservice อื่นๆ ได้อย่างไร Microservice สามารถรับคำขอเครือข่าย (มักจะผ่าน HTTP) และส่งคืนการตอบกลับได้ มี "ผู้จัดการอารีน่า" ที่จะส่งสถานะปัจจุบันของอารีน่าไปยังไมโครเซอร์วิสของคุณ จากนั้นไมโครเซอร์วิสจะตอบกลับด้วยคำสั่งที่ระบุสิ่งที่ต้องทำ
แน่นอนว่าเป้าหมายคือการชนะ แต่ในระหว่างนี้คุณจะได้เรียนรู้เกี่ยวกับการสร้างและทำให้ Microservice ใช้งานได้ใน Google Cloud
วิธีการทำงาน
คุณจะสร้างไมโครเซอร์วิสด้วยเทคโนโลยีใดก็ได้ที่ต้องการ (หรือเลือกจากโปรแกรมเริ่มต้น Java, Kotlin หรือ Scala) จากนั้นจึงจะนำไมโครเซอร์วิสไปใช้งานใน Google Cloud เมื่อติดตั้งใช้งานแล้ว คุณจะต้องกรอกแบบฟอร์มเพื่อแจ้ง URL ของไมโครเซอร์วิสให้เราทราบ จากนั้นเราจะเพิ่ม URL ดังกล่าวลงในอารีน่า
อารีน่าประกอบด้วยผู้เล่นทั้งหมดในการต่อสู้ที่กำหนด สำหรับการประชุม DevNexus จะมีเวที 1 เวทีในแต่ละวัน ผู้เล่นแต่ละคนจะแทนบริการขนาดเล็กที่เคลื่อนที่ไปมาและขว้างลูกพีชใส่ผู้เล่นคนอื่นๆ
ทุกๆ วินาทีโดยประมาณ ผู้จัดการอารีน่าจะเรียกใช้ไมโครเซอร์วิสของคุณ พร้อมส่งสถานะอารีน่าปัจจุบัน (ตำแหน่งของผู้เล่น) และไมโครเซอร์วิสของคุณจะตอบกลับด้วยคำสั่งสำหรับสิ่งที่ต้องทำ ในอารีน่า คุณสามารถเดินหน้า เลี้ยวซ้ายหรือขวา หรือขว้างลูกพีชได้ ลูกพีชที่ขว้างจะเคลื่อนที่ได้สูงสุด 3 ช่องในทิศทางที่ผู้เล่นหันหน้าไป หากลูกท้อ "โดน" ผู้เล่นคนอื่น ผู้ขว้างจะได้ 1 คะแนน และผู้เล่นที่โดนจะเสีย 1 คะแนน ระบบจะปรับขนาดอารีน่าโดยอัตโนมัติตามจำนวนผู้เล่นปัจจุบัน
สนามประลองที่มีผู้เล่นสมมติ 3 คนจะมีลักษณะดังนี้

สนามประลองตัวอย่างของ Battle Peach
ความขัดแย้งที่เกิดขึ้นซ้ำๆ
ในอารีน่า ผู้เล่นหลายคนอาจพยายามดำเนินการที่ขัดแย้งกัน เช่น ผู้เล่น 2 คนอาจพยายามย้ายไปยังช่องเดียวกัน ในกรณีที่เกิดความขัดแย้ง ไมโครเซอร์วิสที่มีเวลาตอบกลับเร็วที่สุดจะเป็นผู้ชนะ
ดูการแข่งขัน
หากต้องการดูว่าไมโครเซอร์วิสของคุณเป็นอย่างไรในการต่อสู้ โปรดดูอารีน่าสด
Battle API
หากต้องการทำงานร่วมกับผู้จัดการอารีน่า ไมโครเซอร์วิสของคุณจะต้องใช้ API เฉพาะเพื่อเข้าร่วมอารีน่า ผู้จัดการอารีน่าจะส่งสถานะอารีน่าปัจจุบันใน HTTP POST ไปยัง URL ที่คุณระบุให้เรา โดยมีโครงสร้าง JSON ดังนี้
{
"_links": {
"self": {
"href": "https://YOUR_SERVICE_URL"
}
},
"arena": {
"dims": [4,3], // width, height
"state": {
"https://A_PLAYERS_URL": {
"x": 0, // zero-based x position, where 0 = left
"y": 0, // zero-based y position, where 0 = top
"direction": "N", // N = North, W = West, S = South, E = East
"wasHit": false,
"score": 0
}
... // also you and the other players
}
}
}
การตอบกลับ HTTP ต้องมีรหัสสถานะ 200 (OK) พร้อมเนื้อหาการตอบกลับที่มีการเคลื่อนไหวครั้งถัดไปของคุณ ซึ่งเข้ารหัสเป็นอักขระตัวพิมพ์ใหญ่ตัวเดียวของตัวเลือกใดตัวเลือกหนึ่งต่อไปนี้
F <- move Forward
R <- turn Right
L <- turn Left
T <- Throw
เท่านี้ก็เรียบร้อย มาดูขั้นตอนการทําให้ Microservice ใช้งานได้ใน Cloud Run ซึ่งเป็นบริการของ Google Cloud สําหรับการเรียกใช้ Microservice และแอปพลิเคชันอื่นๆ
2. การติดตั้งใช้งาน Microservice
คุณสามารถสร้างไมโครเซอร์วิสด้วยเทคโนโลยีใดก็ได้และทำให้ใช้งานได้ทุกที่ตราบใดที่เข้าถึงได้แบบสาธารณะและเป็นไปตาม Battle API คุณสามารถเริ่มต้นด้วยโปรเจ็กต์ตัวอย่างที่เลือกคำสั่งแบบสุ่มได้
เลือกตัวอย่างเพื่อเริ่มต้น
ตัวอย่างไมโครเซอร์วิสการต่อสู้ที่คุณเริ่มต้นได้มี 3 รายการ ดังนี้
Java และ Spring Boot | ||
Java และ Quarkus | ||
Kotlin และ Micronaut | ||
Kotlin และ Quarkus | ||
Scala และ Play Framework | ||
Go |
หลังจากตัดสินใจเลือกตัวอย่างที่จะเริ่มต้นแล้ว ให้คลิกปุ่ม "Deploy on Cloud Run" ด้านบน ซึ่งจะเปิด Cloud Shell (คอนโซลบนเว็บสำหรับเครื่องเสมือนในระบบคลาวด์) ที่จะโคลนแหล่งข้อมูล จากนั้นสร้างเป็นแพ็กเกจที่ทำให้ใช้งานได้ (อิมเมจคอนเทนเนอร์ Docker) ซึ่งจะอัปโหลดไปยัง Google Container Registry แล้วทำให้ใช้งานได้ใน Cloud Run
เมื่อระบบขอ ให้ระบุus-central1 ภูมิภาค
ภาพหน้าจอด้านล่างแสดงเอาต์พุตของ Cloud Shell สำหรับการสร้างและการติดตั้งใช้งานไมโครเซอร์วิส

ยืนยันว่า Microservice ทำงาน
ใน Cloud Shell คุณสามารถส่งคำขอไปยังไมโครเซอร์วิสที่เพิ่งติดตั้งใช้งานได้โดยแทนที่ YOUR_SERVICE_URL ด้วย URL ของบริการ (ซึ่งอยู่ใน Cloud Shell หลังจากบรรทัด "ตอนนี้แอปพลิเคชันของคุณพร้อมใช้งานแล้วที่นี่")
curl -d '{
"_links": {
"self": {
"href": "https://foo.com"
}
},
"arena": {
"dims": [4,3],
"state": {
"https://foo.com": {
"x": 0,
"y": 0,
"direction": "N",
"wasHit": false,
"score": 0
}
}
}
}' -H "Content-Type: application/json" -X POST -w "\n" \
https://YOUR_SERVICE_URL
คุณควรเห็นสตริงการตอบกลับเป็น F, L, R หรือ T
ขอให้รวมไว้ใน Arena
คุณต้องกรอกแบบฟอร์มสั้นๆ เพื่อให้ระบบรวมคุณไว้ในอารีน่า ส่วนที่ยากที่สุดคือการตัดสินใจว่าจะใช้รูปภาพใดเป็นรูปโปรไฟล์ คุณจะใช้รูปภาพ GitHub, รูปภาพ LinkedIn หรือเราจะเลือกรูปโปรไฟล์แบบสุ่มให้คุณก็ได้ เมื่อเราตรวจสอบข้อมูลที่ส่งแล้ว ผู้เล่นของคุณจะปรากฏในอารีน่า
ทำการเปลี่ยนแปลงและนำไปใช้
ก่อนที่จะทำการเปลี่ยนแปลงได้ คุณต้องตั้งค่าข้อมูลบางอย่างใน Cloud Shell เกี่ยวกับโปรเจ็กต์ GCP และตัวอย่างที่คุณใช้ ก่อนอื่น ให้แสดงรายการโปรเจ็กต์ GCP ดังนี้
gcloud projects list
คุณน่าจะมีเพียงโปรเจ็กต์เดียว คัดลอก PROJECT_ID จากคอลัมน์แรก แล้ววางลงในคำสั่งต่อไปนี้ (แทนที่ YOUR_PROJECT_ID ด้วยรหัสโปรเจ็กต์จริง) เพื่อตั้งค่าตัวแปรสภาพแวดล้อมที่เราจะใช้ในคำสั่งในภายหลัง
export PROJECT_ID=YOUR_PROJECT_ID
ตอนนี้ให้ตั้งค่าตัวแปรสภาพแวดล้อมอีกตัวอย่างที่คุณใช้ เพื่อให้เราสามารถระบุไดเรกทอรีและชื่อบริการที่ถูกต้องในคำสั่งในภายหลังได้
# Copy and paste ONLY ONE of these export SAMPLE=java-springboot export SAMPLE=kotlin-micronaut export SAMPLE=scala-play
ตอนนี้คุณแก้ไขแหล่งที่มาของไมโครเซอร์วิสได้จากภายใน Cloud Shell หากต้องการเปิดโปรแกรมแก้ไขบนเว็บของ Cloud Shell ให้เรียกใช้คำสั่งต่อไปนี้
cloudshell edit cloudbowl-microservice-game/samples/$SAMPLE/README.md
จากนั้นคุณจะเห็นวิธีการเพิ่มเติมในการทำการเปลี่ยนแปลง

Cloud Shell ที่มีเครื่องมือแก้ไขพร้อมโปรเจ็กต์ตัวอย่างที่เปิดอยู่
หลังจากบันทึกการเปลี่ยนแปลงแล้ว ให้สร้างโปรเจ็กต์ใน Cloud Shell โดยใช้คำสั่ง pack คำสั่งนี้ใช้ Buildpack เพื่อตรวจหาประเภทโปรเจ็กต์ คอมไพล์ และสร้างอาร์ติแฟกต์ที่สามารถนำไปใช้งานได้ (อิมเมจคอนเทนเนอร์ Docker)
pack build gcr.io/$PROJECT_ID/$SAMPLE \ --path cloudbowl-microservice-game/samples/$SAMPLE \ --builder heroku/buildpacks
เมื่อสร้างอิมเมจคอนเทนเนอร์แล้ว ให้ใช้คำสั่ง Docker (ใน Cloud Shell) เพื่อพุชอิมเมจคอนเทนเนอร์ไปยัง Google Container Registry เพื่อให้ Cloud Run เข้าถึงได้
docker push gcr.io/$PROJECT_ID/$SAMPLE
ตอนนี้ให้ติดตั้งใช้งานเวอร์ชันใหม่ใน Cloud Run โดยทำดังนี้
gcloud run deploy $SAMPLE\
--project=$PROJECT_ID\
--platform=managed\
--region=us-central1\
--image=gcr.io/$PROJECT_ID/$SAMPLE\
--memory=512Mi\
--allow-unauthenticated
ตอนนี้อารีน่าจะใช้เวอร์ชันใหม่ของคุณแล้ว
3. ขอแสดงความยินดี
ขอแสดงความยินดี คุณสร้างและทำให้ Microservice ใช้งานได้สำเร็จแล้ว ซึ่ง Microservice นี้สามารถต่อสู้กับ Microservice อื่นๆ ได้ ขอให้โชคดี