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 02 năm 2020

Cung cấp chiến trường Microservices

Bạn đã bao giờ tham gia trận đấu bóng tuyết mà trong đó bạn đi lại và vui đùa ném bóng 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é! Nhưng giờ đây, thay vì mạo hiểm bị tấn công về mặt vật lý, bạn có thể xây dựng một dịch vụ nhỏ, dễ tiếp cận qua mạng (một dịch vụ vi mô) để tham gia vào một cuộc chiến hoành tráng chống lại các dịch vụ vi mô khác. Và vì chúng tôi tổ chức trận chiến dịch vụ vi mô đầu tiên này tại Atlanta, Georgia, nên các dịch vụ vi mô của chúng tôi sẽ ném quả đào chứ không phải viên đạn tuyết.

Có thể bạn đang thắc mắc... Nhưng làm thế nào một dịch vụ vi mô "gửi" các dịch vụ vi mô khác? Một dịch vụ vi mô có thể nhận các yêu cầu mạng (thường qua HTTP) và trả về phản hồi. Có một "người quản lý sân vận động" sẽ gửi cho dịch vụ vi mô của bạn trạng thái hiện tại của đấu trường, sau đó dịch vụ vi mô 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 đồng thời, bạn sẽ được tìm hiểu về cách xây dựng và triển khai các dịch vụ vi mô trên Google Cloud.

Cách thức hoạt động

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

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

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

Dưới đây là giao diện của nhà thi đấu với 3 cầu thủ hoá trang:

9e4775d13ff18d4d.png.

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

Mâu thuẫn xoay vòng

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

Theo dõi trận chiến

Để xem hiệu quả hoạt động của dịch vụ vi mô của bạn trong trận chiến, hãy xem đấu trường trực tiếp!

Battle API

Để làm việc với người quản lý đấu trường của chúng tôi, dịch vụ vi mô 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 yêu cầu POST qua HTTP tới URL mà bạn cung cấp cho chúng tôi theo cấu trúc JSON như 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 là mã trạng thái 200 (OK) với nội dung phản hồi chứa bước tiếp theo của bạn, được mã hoá dưới dạng ký tự viết hoa đơn của:

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

Vậy là xong! Hãy tìm hiểu cách triển khai một dịch vụ vi mô trên Cloud Run, một dịch vụ của Google Cloud để chạy các dịch vụ vi mô và các ứng dụng khác.

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

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

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

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

Java và Khởi động vào mùa xuân

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à Khung chương trình của Play

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 (một bảng điều khiển dựa trên nền tảng web kết nối với máy ảo trên đám mây) trong đó mã nguồn sẽ được sao chép, sau đó tích hợp vào 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, sau đó triển khai trên Cloud Run.

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

Ảnh chụp màn hình bên dưới minh hoạ kết quả của Cloud Shell để xây dựng và triển khai dịch vụ vi mô

d88e40430706a32b.png

Xác minh hoạt động của dịch vụ vi mô

Trong Cloud Shell, bạn có thể gửi yêu cầu đến dịch vụ vi mô mới triển khai, thay thế YOUR_SERVICE_URL bằng URL của dịch vụ (nằm trong Cloud Shell sau dòng "Ứng dụng của bạn hiện đã xuất hiện 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 tham gia Đấu trường

Bạn cần điền thông tin vào biểu mẫu ngắn để có thể tham gia đấu trường. Phần khó nhất là xác định nội dung bạn muốn sử dụng cho ảnh hồ sơ. Bạn có thể sử dụng hình ảnh GitHub, hình ảnh 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 thông tin bạn gửi, người chơi của bạn sẽ xuất hiện trong đấu trường.

Tạo 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 về dự án GCP và mẫu bạn đã sử dụng trong Cloud Shell. Trước tiên, hãy liệt kê các dự án GCP của bạn:

gcloud projects list

Có thể bạn 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 biến môi trường mà chúng ta sẽ sử dụng trong các lệnh sau:

export PROJECT_ID=YOUR_PROJECT_ID

Bây giờ, hãy đặt một biến môi trường khác cho mẫu mà bạn đã sử dụng để trong các lệnh sau này, chúng ta có thể chỉ định đúng thư mục và tên 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 dịch vụ vi mô của mình từ 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 thêm để thực hiện thay đổi.

f910c9ef7b51c406.png

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

Sau khi lưu các thay đổi, hãy tạo dự án trong Cloud Shell bằng lệnh pack. Lệnh này sử 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

Bây giờ, hình ảnh vùng chứa của bạn đã được tạo, hãy sử 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 tệp sau đó:

docker push gcr.io/$PROJECT_ID/$SAMPLE

Bây giờ, 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

Bây giờ, đấ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 đã xây dựng và triển khai thành công một dịch vụ vi mô có thể cạnh tranh với các dịch vụ vi mô khác! Chúc bạn may mắn!

Tiếp theo là gì?

Tài liệu tham khảo