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 8 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 đang tổ chức cuộc chiến vi dịch vụ này tại SpringOne, nên các vi dịch vụ của chúng tôi sẽ ném lá thay vì ném 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 chiếc lá 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. Hội nghị SpringOne sẽ có một không gian riê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 lá vào những người chơi khác.

Khoảng một lần mỗi giây, 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 phải hoặc ném một chiếc lá. Chiếc lá được ném sẽ bay tối đa 3 ô theo hướng mà người chơi đang đối mặt. Nếu một chiếc lá "trúng" 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 của một đấu trường trước đây:

20628e6bd442bd11.png

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

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

Để có thể triển khai vi dịch vụ 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 vào 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 đề hơn vì đôi khi quản trị viên G Suite ngăn người dùng sử dụng một số tính năng của Google Cloud. Ngoài ra, bảng điều khiển web mà chúng ta sẽ sử dụng hoạt động tốt với Chrome hoặc Firefox nhưng có thể gặp vấn đề trong Safari.

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

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

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

Kotlin và Spring Boot

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.

4. Yêu cầu thêm vào Đấu trường

Để được đưa vào đấu trường, bạn cần gửi một tin nhắn đến kênh Slack #3-sponsor-google-cloud kèm theo tên, URL dịch vụ Cloud Run và tên người dùng GitHub (không bắt buộc) để lấy ảnh đại diện / ảnh hồ sơ. 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. 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-springboot

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 khởi động ứng dụng trong Cloud Shell:

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

Sau khi ứng dụng đang chạy, hãy mở một thẻ Cloud Shell mới và kiểm thử dịch vụ bằng cách sử dụ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 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 gcr.io/buildpacks/builder

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!

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

Bạn có thể làm việc trên dự án của mình tại chỗ bằng cách sử dụng IDE riêng 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 thực hiện và 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 thành cùng 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 dự án gốc):

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 đã 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 tục học

Tài liệu tham khảo

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

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