Battle Peach – A Microservices Battle Ground

1. Giới thiệu

Lần cập nhật gần đây nhất: ngày 12 tháng 2 năm 2020

Microservices Battle Arena

Bạn đã từng tham gia một trận chiến ném tuyết, trong đó bạn di chuyển xung quanh và ném tuyết vào người khác chưa? Nếu chưa, hãy thử vào một ngày nào đó! Nhưng giờ đây, thay vì mạo hiểm bị tát vào mặt, bạn có thể xây dựng một dịch vụ nhỏ có thể truy cập vào mạng (một dịch vụ vi mô) để tham gia vào một trận chiến hoành tráng với các dịch vụ vi mô khác. Và vì chúng tôi tổ chức trận chiến vi dịch vụ đầu tiên này ở Atlanta, Georgia, nên các vi dịch vụ của chúng tôi sẽ ném quả đào thay vì quả cầu tuyết.

Có thể bạn đang thắc mắc... Nhưng làm cách nào để một vi dịch vụ "gửi" một quả đào vào các vi dịch vụ khác? Một vi dịch vụ có thể nhận các yêu cầu mạng (thường là qua HTTP) và trả về các phản hồi. Có một "trình quản lý đấu trường" sẽ gửi cho vi dịch vụ của bạn trạng thái hiện tại của đấu trường và sau đó, vi dịch vụ của bạn sẽ phản hồi bằng một lệnh chỉ định việc cần làm.

Tất nhiên, mục tiêu là giành chiến thắng, nhưng trong quá trình này, bạn sẽ tìm hiểu về cách xây dựng và triển khai các vi dịch vụ trên Google Cloud.

Cách hoạt động

Bạn sẽ tạo một vi dịch vụ bằng bất kỳ công nghệ nào bạn muốn (hoặc chọn trong số các chương trình khởi động Java, Kotlin hoặc Scala), sau đó triển khai vi dịch vụ đó trên Google Cloud. Sau khi triển khai, bạn sẽ điền vào một biểu mẫu để cho chúng tôi biết URL của vi dịch vụ của bạn, sau đó chúng tôi sẽ thêm URL đó vào đấu trường.

Đấu trường chứa tất cả người chơi cho một trận chiến nhất định. Đối với hội nghị DevNexus, mỗi ngày sẽ có một hội trường. Mỗi người chơi đại diện cho một vi dịch vụ di chuyển xung quanh và ném quả đào vào những người chơi khác.

Khoảng mỗi giây một lần, trình quản lý đấu trường của chúng tôi sẽ gọi vi dịch vụ của bạn, gửi trạng thái hiện tại của đấu trường (vị trí của người chơi) và vi dịch vụ của bạn sẽ phản hồi bằng một lệnh cho biết việc cần làm. Trong đấu trường, bạn có thể di chuyển về phía trước, rẽ trái hoặc rẽ phải hoặc ném quả đào. Quả đào được ném sẽ bay tối đa 3 ô theo hướng mà người chơi đang đối mặt. Nếu quả đào "trúng" một người chơi khác, người ném sẽ được một điểm và người chơi bị trúng sẽ mất một điểm. Kích thước đấu trường sẽ tự động điều chỉnh theo số lượng người chơi hiện tại.

Sau đây là hình ảnh đấu trường với 3 người chơi ảo:

9e4775d13ff18d4d.png

Ví dụ về đấu trường Battle Peach

Xung đột lặp lại

Trong đấu trường, có thể nhiều người chơi cùng lúc cố gắng thực hiện các hành động xung đột. Ví dụ: hai người chơi có thể cố gắng di chuyển đến cùng một ô. Trong trường hợp xảy ra xung đột, vi dịch vụ có thời gian phản hồi nhanh nhất sẽ chiến thắng.

Xem trận chiến

Để xem hiệu suất của vi dịch vụ trong trận chiến, hãy xem đấu trường trực tiếp!

Battle API

Để làm việc với trình quản lý đấu trường của chúng tôi, vi dịch vụ của bạn sẽ cần triển khai một API cụ thể để tham gia đấu trường. Trình quản lý đấu trường sẽ gửi trạng thái hiện tại của đấu trường trong một yêu cầu HTTP POST đến URL mà bạn cung cấp cho chúng tôi, với cấu trúc JSON sau:

{
  "_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
    }
  }
}

Phản hồi HTTP của bạn phải có mã trạng thái 200 (OK) với một nội dung phản hồi chứa bước đi tiếp theo của bạn, được mã hoá dưới dạng một ký tự viết hoa duy nhất trong số:

F <- move Forward
R <- turn Right
L <- turn Left
T <- Throw

Chỉ vậy thôi! Hãy cùng xem cách triển khai một vi dịch vụ trên Cloud Run, một dịch vụ của Google Cloud để chạy vi dịch vụ và các ứng dụng khác.

2. Triển khai vi dịch vụ

Bạn có thể xây dựng vi dịch vụ bằng bất kỳ công nghệ nào và triển khai ở bất cứ đâu miễn là có thể truy cập công khai và tuân thủ Battle API. Để dễ dàng, bạn có thể bắt đầu bằng một dự án mẫu chỉ chọn một lệnh ngẫu nhiên.

Chọn đoạn nhạc để bắt đầu

Có 3 mẫu vi dịch vụ chiến đấu mà bạn có thể bắt đầu:

Java và Spring Boot

Nguồn

Triển khai trên Cloud Run

Java và Quarkus

Nguồn

Triển khai trên Cloud Run

Kotlin và Micronaut

Nguồn

Triển khai trên Cloud Run

Kotlin và Quarkus

Nguồn

Triển khai trên Cloud Run

Scala và Play Framework

Nguồn

Triển khai trên Cloud Run

Go

Nguồn

Triển khai trên Cloud Run

Sau khi bạn quyết định chọn mẫu nào để bắt đầu, hãy nhấp vào nút "Triển khai trên Cloud Run" ở trên. Thao tác này sẽ khởi chạy Cloud Shell (bảng điều khiển dựa trên web cho một máy ảo trên đám mây) nơi nguồn sẽ được sao chép, sau đó được tạo thành một gói có thể triển khai (hình ảnh vùng chứa Docker), sau đó được tải lên Google Container Registry rồi được triển khai trên Cloud Run.

Khi được hỏi, hãy chỉ định khu vực us-central1.

Ảnh chụp màn hình bên dưới cho thấy đầu ra của Cloud Shell cho quá trình tạo và triển khai vi dịch vụ

d88e40430706a32b.png

Xác minh rằng vi dịch vụ hoạt động

Trong Cloud Shell, bạn có thể đưa ra yêu cầu cho vi dịch vụ mới triển khai của mình, thay thế YOUR_SERVICE_URL bằng URL cho dịch vụ của bạn (URL này nằm trong Cloud Shell sau dòng "Your application is now live here" (Ứng dụng của bạn hiện đang hoạt động tại đây)):

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

Bạn sẽ thấy chuỗi phản hồi là F, L, R hoặc T.

Yêu cầu được đưa vào Arena

Bạn cần điền vào một biểu mẫu ngắn để được đưa vào đấu trường. Phần khó nhất là xác định hình ảnh hồ sơ bạn muốn dùng. Bạn có thể sử dụng hình ảnh trên GitHub, hình ảnh trên LinkedIn hoặc chúng tôi sẽ chọn một hình đại diện ngẫu nhiên cho bạn. Sau khi chúng tôi xem xét nội dung bạn gửi, người chơi của bạn sẽ xuất hiện trong đấu trường.

Thực hiện và triển khai các thay đổi

Trước khi có thể thực hiện các thay đổi, bạn cần thiết lập một số thông tin trong Cloud Shell về dự án GCP và mẫu mà bạn đã sử dụng. Trước tiên, hãy liệt kê các dự án GCP của bạn:

gcloud projects list

Bạn có thể chỉ có một dự án. Sao chép PROJECT_ID từ cột đầu tiên rồi dán vào lệnh sau (thay thế YOUR_PROJECT_ID bằng mã dự án thực tế của bạn) để đặt một biến môi trường mà chúng ta sẽ dùng trong các lệnh sau:

export PROJECT_ID=YOUR_PROJECT_ID

Giờ đây, hãy đặt một biến môi trường khác cho mẫu mà bạn đã dùng để trong các lệnh sau, chúng ta có thể chỉ định đúng tên thư mục và dịch vụ:

# Copy and paste ONLY ONE of these
export SAMPLE=java-springboot
export SAMPLE=kotlin-micronaut
export SAMPLE=scala-play

Giờ đây, bạn có thể chỉnh sửa nguồn cho vi dịch vụ của mình ngay trong Cloud Shell. Để mở trình chỉnh sửa dựa trên web của Cloud Shell, hãy chạy lệnh sau:

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

Sau đó, bạn sẽ thấy hướng dẫn chi tiết hơn về cách thực hiện thay đổi.

f910c9ef7b51c406.png

Cloud Shell có trình chỉnh sửa với dự án mẫu đang mở

Sau khi lưu các thay đổi, hãy tạo dự án của bạn trong Cloud Shell bằng lệnh pack. Lệnh này dùng Buildpacks để phát hiện loại dự án, biên dịch dự án đó và tạo cấu phần phần mềm có thể triển khai (hình ảnh vùng chứa docker).

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

Giờ đây, sau khi tạo hình ảnh vùng chứa, hãy dùng lệnh docker (trong Cloud Shell) để đẩy hình ảnh vùng chứa vào Google Container Registry để Cloud Run có thể truy cập vào hình ảnh đó:

docker push gcr.io/$PROJECT_ID/$SAMPLE

Giờ đây, hãy triển khai phiên bản mới trên Cloud Run:

gcloud run deploy $SAMPLE\
          --project=$PROJECT_ID\
          --platform=managed\
          --region=us-central1\
          --image=gcr.io/$PROJECT_ID/$SAMPLE\
          --memory=512Mi\
          --allow-unauthenticated

Giờ đây, đấu trường sẽ sử dụng phiên bản mới của bạn!

3. Xin chúc mừng

Xin chúc mừng! Bạn đã tạo và triển khai thành công một vi dịch vụ có thể giao tranh với các vi dịch vụ khác! Chúc bạn may mắn!

Tiếp theo là gì?

Tài liệu tham khảo