ยุทธการ Jamón - สมรภูมิ Microservice

1. บทนำ

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

Microservices Battle Arena

คุณเคยเล่นปาลูกบอลหิมะไหม ที่คุณเดินไปมาและปาลูกบอลหิมะใส่คนอื่นอย่างสนุกสนาน หากยังไม่เคยลอง ก็ลองใช้ดูสักวัน แต่ตอนนี้คุณไม่ต้องเสี่ยงโดนตบแล้ว คุณสามารถสร้างบริการขนาดเล็กที่เข้าถึงได้ผ่านเครือข่าย (Microservice) ซึ่งจะเข้าร่วมการต่อสู้ครั้งยิ่งใหญ่กับ Microservice อื่นๆ และเนื่องจากเราจัดการแข่งขัน Microservice นี้ที่ Spring I/O ดังนั้น Microservice ของเราจะขว้างแฮมแทนลูกบอลหิมะ

คุณอาจสงสัยว่า... แต่ Microservice จะ "โยน" ฮามอนไปยัง Microservice อื่นๆ ได้อย่างไร Microservice สามารถรับคำขอเครือข่าย (มักจะผ่าน HTTP) และส่งคืนการตอบกลับได้ มี "ผู้จัดการอารีน่า" ที่จะส่งสถานะปัจจุบันของอารีน่าไปยังไมโครเซอร์วิสของคุณ จากนั้นไมโครเซอร์วิสจะตอบกลับด้วยคำสั่งที่ระบุสิ่งที่ต้องทำ

แน่นอนว่าเป้าหมายคือการชนะ แต่ในระหว่างนี้คุณจะได้เรียนรู้เกี่ยวกับการสร้างและทำให้ Microservice ใช้งานได้ใน Google Cloud

วิธีการทำงาน

คุณจะสร้างไมโครเซอร์วิสด้วยเทคโนโลยีใดก็ได้ที่ต้องการ (หรือเลือกจากโปรแกรมเริ่มต้น Java, Kotlin หรือ Scala) จากนั้นจึงจะนำไมโครเซอร์วิสไปใช้งานใน Google Cloud เมื่อติดตั้งใช้งานแล้ว คุณจะต้องกรอกแบบฟอร์มเพื่อแจ้ง URL ของไมโครเซอร์วิสให้เราทราบ จากนั้นเราจะเพิ่ม URL ดังกล่าวลงในอารีน่า

อารีน่าประกอบด้วยผู้เล่นทั้งหมดในการต่อสู้ที่กำหนด การประชุม Spring I/O Bridge จะมีเวทีของตัวเอง ผู้เล่นแต่ละคนจะแทนบริการขนาดเล็กที่เคลื่อนที่ไปมาและขว้างฮามอนใส่ผู้เล่นคนอื่นๆ

ผู้จัดการอารีน่าจะเรียกใช้ไมโครเซอร์วิสของคุณประมาณ 1 ครั้งต่อวินาที โดยจะส่งสถานะอารีน่าปัจจุบัน (ตำแหน่งของผู้เล่น) และไมโครเซอร์วิสของคุณจะตอบกลับด้วยคำสั่งสำหรับสิ่งที่ต้องทำ ในอารีน่า คุณสามารถเดินหน้า เลี้ยวซ้ายหรือขวา หรือขว้างฮามอนได้ แฮมที่ขว้างจะเคลื่อนที่ได้สูงสุด 3 ช่องในทิศทางที่ผู้เล่นหันหน้าไป หากแฮม "โดน" ผู้เล่นคนอื่น ผู้ขว้างจะได้ 1 คะแนนและผู้เล่นที่โดนจะเสีย 1 คะแนน ระบบจะปรับขนาดอารีน่าโดยอัตโนมัติตามจำนวนผู้เล่นปัจจุบัน

สนามประลองที่มีผู้เล่นสมมติ 3 คนจะมีลักษณะดังนี้

20628e6bd442bd11.png

ตัวอย่างอารีน่า Battle Jamón

ความขัดแย้งที่เกิดขึ้นซ้ำๆ

ในอารีน่า ผู้เล่นหลายคนอาจพยายามดำเนินการที่ขัดแย้งกัน เช่น ผู้เล่น 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. เข้าสู่ระบบ Google Cloud

หากต้องการทำให้ Microservice ใช้งานได้ใน Cloud Run คุณจะต้องเข้าสู่ระบบ Google Cloud เราจะให้เครดิตในบัญชีของคุณและคุณไม่จำเป็นต้องป้อนบัตรเครดิต โดยปกติแล้วการใช้บัญชีส่วนตัว (เช่น gmail.com) แทนบัญชี G Suite จะมีปัญหาน้อยกว่า เนื่องจากบางครั้งผู้ดูแลระบบ G Suite จะป้องกันไม่ให้ผู้ใช้ใช้ฟีเจอร์บางอย่างของ Google Cloud นอกจากนี้ คอนโซลเว็บที่เราจะใช้ควรทำงานได้ดีกับ Chrome หรือ Firefox แต่อาจมีปัญหาใน Safari

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

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

เลือกตัวอย่างเพื่อเริ่มต้น

คุณเริ่มต้นจากตัวอย่างไมโครเซอร์วิสการต่อสู้ 2 รายการได้ดังนี้

Java และ Spring Boot

แหล่งที่มา

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

Kotlin และ Spring Boot

แหล่งที่มา

ทำให้ใช้งานได้ใน 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

4. ขอรวมไว้ในอารีน่า

หากต้องการเข้าร่วมอารีน่า คุณต้องส่งข้อความไปยังแชแนล#battle-jamon พร้อมชื่อ, URL ของบริการ Cloud Run และชื่อผู้ใช้ GitHub (ไม่บังคับ) สำหรับรูปโปรไฟล์ เมื่อเราตรวจสอบข้อมูลแล้ว ผู้เล่นของคุณจะปรากฏในอารีน่า

5. ทำการเปลี่ยนแปลงและนำไปใช้

ก่อนที่จะทำการเปลี่ยนแปลงได้ คุณต้องตั้งค่าข้อมูลบางอย่างใน 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-springboot

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

cloudshell edit cloudbowl-microservice-game/samples/$SAMPLE/README.md

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

f910c9ef7b51c406.png

Cloud Shell ที่มีเครื่องมือแก้ไขพร้อมโปรเจ็กต์ตัวอย่างที่เปิดอยู่

หลังจากบันทึกการเปลี่ยนแปลงแล้ว ให้เริ่มแอปพลิเคชันใน Cloud Shell โดยทำดังนี้

cd cloudbowl-microservice-game/samples/$SAMPLE
./mvnw spring-boot:run

เมื่อแอปพลิเคชันทำงานแล้ว ให้เปิดแท็บ Cloud Shell ใหม่และทดสอบบริการโดยใช้ curl ดังนี้

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" \
  http://localhost:8080

เมื่อพร้อมที่จะทำให้การเปลี่ยนแปลงใช้งานได้แล้ว ให้สร้างโปรเจ็กต์ใน Cloud Shell โดยใช้คำสั่ง pack คำสั่งนี้ใช้ Buildpack เพื่อตรวจหาประเภทโปรเจ็กต์ คอมไพล์ และสร้างอาร์ติแฟกต์ที่สามารถนำไปใช้งานได้ (อิมเมจคอนเทนเนอร์ Docker)

pack build gcr.io/$PROJECT_ID/$SAMPLE \
  --path ~/cloudbowl-microservice-game/samples/$SAMPLE \
  --builder gcr.io/buildpacks/builder

เมื่อสร้างอิมเมจคอนเทนเนอร์แล้ว ให้ใช้คำสั่ง 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

ตอนนี้อารีน่าจะใช้เวอร์ชันใหม่ของคุณแล้ว

6. ขอแสดงความยินดี

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

เรียนรู้ต่อ

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

7. คำถามที่พบบ่อย

เหตุใดไมโครเซอร์วิสของฉันจึงไม่แสดงในอารีน่า

การแข่งขันรอบชิงชนะเลิศมีวิธีการอย่างไร

อารีน่าทำงานอย่างไรก่อนการต่อสู้รอบสุดท้าย

ฉันจะชนะได้อย่างไร

ฉันจะพัฒนาในเครื่องได้ไหม