แบทเทิลพีช - สมรภูมิ Microservice

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 คนจะมีลักษณะดังนี้

9e4775d13ff18d4d.png

สนามประลองตัวอย่างของ 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

แหล่งที่มา

ทำให้ใช้งานได้ใน Cloud Run

Java และ Quarkus

แหล่งที่มา

ทำให้ใช้งานได้ใน Cloud Run

Kotlin และ Micronaut

แหล่งที่มา

ทำให้ใช้งานได้ใน Cloud Run

Kotlin และ Quarkus

แหล่งที่มา

ทำให้ใช้งานได้ใน Cloud Run

Scala และ Play Framework

แหล่งที่มา

ทำให้ใช้งานได้ใน Cloud Run

Go

แหล่งที่มา

ทำให้ใช้งานได้ใน Cloud Run

หลังจากตัดสินใจเลือกตัวอย่างที่จะเริ่มต้นแล้ว ให้คลิกปุ่ม "Deploy on Cloud Run" ด้านบน ซึ่งจะเปิด Cloud Shell (คอนโซลบนเว็บสำหรับเครื่องเสมือนในระบบคลาวด์) ที่จะโคลนแหล่งข้อมูล จากนั้นสร้างเป็นแพ็กเกจที่ทำให้ใช้งานได้ (อิมเมจคอนเทนเนอร์ Docker) ซึ่งจะอัปโหลดไปยัง Google Container Registry แล้วทำให้ใช้งานได้ใน Cloud Run

เมื่อระบบขอ ให้ระบุus-central1 ภูมิภาค

ภาพหน้าจอด้านล่างแสดงเอาต์พุตของ Cloud Shell สำหรับการสร้างและการติดตั้งใช้งานไมโครเซอร์วิส

d88e40430706a32b.png

ยืนยันว่า 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

จากนั้นคุณจะเห็นวิธีการเพิ่มเติมในการทำการเปลี่ยนแปลง

f910c9ef7b51c406.png

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 อื่นๆ ได้ ขอให้โชคดี

สิ่งต่อไปที่ควรทำ

เอกสารอ้างอิง