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

1. บทนำ

อัปเดตล่าสุด: 12-02-2020

Microservices Battle Arena

คุณเคยเล่นปาหิมะไหมที่ต้องเคลื่อนที่ไปมาและปาหิมะใส่คนอื่นอย่างสนุกสนาน หากยังไม่เคยลอง ก็ลองใช้ดูสักวัน แต่ตอนนี้คุณไม่ต้องเสี่ยงโดนตบแล้ว คุณสามารถสร้างบริการขนาดเล็กที่เข้าถึงได้ผ่านเครือข่าย (Microservice) ซึ่งจะเข้าร่วมการต่อสู้ครั้งยิ่งใหญ่กับ Microservice อื่นๆ และเนื่องจากเราจัดการแข่งขัน 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

หากต้องการทำงานร่วมกับผู้จัดการอารีน่า Microservice ของคุณจะต้องใช้ 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

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

2. การติดตั้งใช้งาน Microservice

คุณสามารถสร้าง 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 คุณสามารถส่งคำขอไปยัง Microservice ที่เพิ่งทำให้ใช้งานได้โดยแทนที่ 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

ตอนนี้คุณแก้ไขแหล่งที่มาของ Microservice ได้จากภายใน 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 อื่นๆ ได้ ขอให้โชคดี

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

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