Battle One – Trận địa chiến dịch vi mô

1. Giới thiệu

Lần cập nhật gần đây nhất: ngày 26 tháng 08 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ô này tại SpringOne, nên các dịch vụ vi mô của chúng tôi sẽ chỉ sử dụng lá xanh thay vì đá cầu.

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" những 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. Hội nghị SpringOne sẽ có nhà thi đấu riê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 lá 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 lên, rẽ trái hoặc phải hoặc ném một chiếc lá. Một chiếc lá ném sẽ di chuyển lên đến ba khoảng trống theo hướng mà người chơi nhìn thấy. Nếu một chiếc lá "trúng" 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.

Sau đây là hình ảnh của một đấu trường trước đây:

20628e6bd442bd11.pngs

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

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. Đăng nhập vào Google Cloud

Để có thể triển khai dịch vụ vi mô trên Cloud Run, bạn cần đăng nhập vào Google Cloud. Chúng tôi sẽ áp dụng một khoản tín dụng cho tài khoản của bạn và bạn không cần phải nhập thẻ tín dụng. Việc sử dụng tài khoản cá nhân (ví dụ: gmail.com) thay vì tài khoản G Suite thường ít gặp vấn đề vì đôi khi quản trị viên G Suite không cho người dùng của họ sử dụng một số tính năng nhất định của Google Cloud. Ngoài ra, bảng điều khiển web mà chúng tôi sẽ sử dụng sẽ hoạt động tốt với Chrome hoặc Firefox nhưng có thể có vấn đề trong Safari.

3. 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. Tuy nhiên, để mọi thứ trở nên dễ dàng, chúng tôi sẽ giúp bạn bắt đầu từ một dịch vụ mẫu rồi triển khai dịch vụ đó trên Cloud Run.

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

Có hai 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

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

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.

4. Yêu cầu xuất hiện trong Đấu trường

Để được tham gia đấu trường, bạn cần gửi tin nhắn đến kênh Slack #3-sponsor-google-cloud kèm theo tên của mình, URL dịch vụ Cloud Run và tên người dùng GitHub của bạn (không bắt buộc) cho hình đại diện / ảnh hồ sơ của họ. Sau khi chúng tôi xác thực thông tin, người chơi của bạn sẽ xuất hiện trong đấu trường.

5. Nhà sản xuất 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-springboot

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 thay đổi, hãy khởi động ứng dụng trong Cloud Shell:

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

Khi ứng dụng đang chạy, hãy mở một thẻ Cloud Shell mới rồi kiểm thử dịch vụ bằng 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

Khi bạn đã sẵn sàng triển khai 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 gcr.io/buildpacks/builder

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!

6. Phát triển cục bộ

Bạn có thể làm việc trên dự án cục bộ bằng cách sử dụng IDE của riêng mình bằng cách làm theo các bước sau:

  1. [Trong Cloud Shell] Nén mẫu:

cd ~/cloudbowl-microservice-game/samples; zip -r cloudbowl-sample.zip $SAMPLE

  1. [Trong Cloud Shell] Tải tệp zip xuống máy của bạn:

cloudshell download-file cloudbowl-sample.zip

  1. [Trên máy của bạn] Giải nén tệp rồi tạo & kiểm thử các thay đổi
  2. [Trên máy của bạn] Cài đặt gcloud CLI
  3. [Trên máy của bạn] Đăng nhập vào Google Cloud:

gcloud auth login

  1. [Trên máy của bạn] Đặt các biến môi trường PROJECT_IDSAMPLE về cùng các giá trị như trong Cloud Shell.
  2. [Trên máy của bạn] Sử dụng Cloud Build để tạo vùng chứa (từ thư mục gốc của dự án):

gcloud alpha builds submit . --pack=image=gcr.io/$PROJECT_ID/$SAMPLE

  1. [Trên máy của bạn] Triển khai vùng chứa mới:

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

7. 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 tục tìm hiểu

Tài liệu tham khảo

8. Câu hỏi thường gặp

Tại sao dịch vụ vi mô của tôi không xuất hiện trong đấu trường?