Dịch vụ Microservice Rainbow Rumpus

1. Giới thiệu

Lần cập nhật gần đây nhất: ngày 6 tháng 5 năm 2021

Microservice Rainbow Rumpus

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ị đánh, 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 vi dịch vụ) để tham gia vào một trận chiến hoành tráng với các vi dịch vụ khác, ném cầu vồng 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" cầu vồng cho 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 Go, Java, Kotlin, Scala, NodeJS hoặc Python), sau đó triển khai vi dịch vụ đó trên Google Cloud. Sau khi triển khai, bạn sẽ cho chúng tôi biết URL của vi dịch vụ và 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. Rainbow Rumpus sẽ có đấu trường 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 cầu vồng vào những người chơi khác.

Khoảng một 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 phải hoặc ném cầu vồng. Cầu vồng sẽ di chuyển tối đa 3 ô theo hướng mà người chơi đang đối mặt. Nếu cầu vồng "trúng" một người chơi khác, người ném sẽ được 1 điểm và người chơi bị trúng sẽ mất 1 đ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ể có nhiều người chơi 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 nướ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à vi dịch vụ đó 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ó nhiều mẫu vi dịch vụ chiến đấu mà bạn có thể bắt đầu:

Kotlin và Spring Boot

Nguồn

Kotlin và Micronaut

Nguồn

Kotlin và Quarkus

Nguồn

Java và Spring Boot

Nguồn

Java và Quarkus

Nguồn

Go

Nguồn

Node.js và Express

Nguồn

Python và Flask

Nguồn

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 đưa vào Đấu trường

Để tham gia Rainbow Rumpus, bạn cần tham gia một đấu trường. Mở rainbowrumpus.dev, nhấp vào nút tham gia trên một đấu trường nơi bạn sẽ cung cấp URL vi dịch vụ của mình.

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=kotlin-micronaut
export SAMPLE=kotlin-quarkus
export SAMPLE=kotlin-springboot
export SAMPLE=java-quarkus
export SAMPLE=java-springboot
export SAMPLE=go
export SAMPLE=nodejs
export SAMPLE=python

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 bằng lệnh trong tệp README.md, nhưng trước tiên, hãy đảm bảo bạn đang ở đúng thư mục mẫu trong Cloud Shell:

cd cloudbowl-microservice-game/samples/$SAMPLE

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).

# Make sure you are in a Cloud Shell tab where you set the PROJECT_ID
# and SAMPLE env vars. Otherwise, set them again.
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 \
          --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ộ (Không bắt buộc)

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:
# Make sure the SAMPLE env var is still set. If not, re-set it.
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_ID và SAMPLE thành các giá trị giống 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 \
  --project=$PROJECT_ID
  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 \
  --allow-unauthenticated

7. Phân phối liên tục

Thiết lập SCM

Thiết lập GitHub để bạn có thể cộng tác với nhóm của mình trên vi dịch vụ:

  1. Đăng nhập vào GitHub
  2. Tạo kho lưu trữ mới
  3. Nếu đang làm việc trên máy cục bộ, bạn có thể sử dụng giao diện dòng lệnh (CLI) của git hoặc ứng dụng GUI GitHub Desktop (Windows hoặc Mac). Nếu đang sử dụng Cloud Shell, bạn sẽ phải dùng git CLI. Để lấy mã của vi dịch vụ trên GitHub, hãy làm theo hướng dẫn về CLI hoặc GitHub Desktop.

Đẩy mã bằng giao diện dòng lệnh git

  1. Làm theo hướng dẫn về git qua https bằng mã truy cập cá nhân
  2. Chọn phạm vi "repo"
  3. Thiết lập git:
git config --global credential.helper \
  'cache --timeout=172800'
git config --global push.default current
git config --global user.email "YOUR@EMAIL"
git config --global user.name "YOUR NAME"
  1. Đặt các biến môi trường cho tổ chức và kho lưu trữ trên GitHub (https://github.com/ORG/REPO)
export GITHUB_ORG=YOUR_GITHUB_ORG
export GITHUB_REPO=YOUR_GITHUB_REPO
  1. Đẩy mã của bạn lên kho lưu trữ mới
# Make sure the SAMPLE env var is still set. If not, re-set it.
cd ~/cloudbowl-microservice-game/samples/$SAMPLE
git init
git add .
git commit -m init
git remote add origin https://github.com/$GITHUB_ORG/$GITHUB_REPO.git
git branch -M main

# This will now ask for your GitHub username & password
# for the password use the personal access token
git push -u origin main
  1. Sau khi thực hiện bất kỳ thay đổi nào, bạn có thể xác nhận và đẩy các thay đổi đó lên GitHub:
git add .
git status
git diff --staged
git commit -am "my changes"
git push

Đẩy mã bằng GitHub Desktop

  1. Tải mã xuống theo hướng dẫn trong phòng thí nghiệm "Phát triển cục bộ" trước đó
  2. Cài đặt GitHub Desktop, khởi chạy và đăng nhập
  3. Tạo bản sao kho lưu trữ bạn vừa tạo

cf7f38c7c86a91cd.png

  1. Mở trình khám phá tệp rồi sao chép dự án vào kho lưu trữ mới
  2. Xác nhận các thay đổi

5f3c1552e30ad7c5.png

  1. Xuất bản nhánh chính lên GitHub

Thiết lập quy trình Triển khai liên tục trên Cloud Run

Khi thiết lập SCM trên GitHub, giờ đây, bạn có thể thiết lập quy trình Phân phối liên tục để mỗi khi các cam kết mới được chuyển đến nhánh main, Cloud Build sẽ tự động tạo và triển khai các thay đổi. Bạn cũng có thể thêm tính năng Tích hợp liên tục để chạy các thử nghiệm trước khi triển khai, nhưng bước đó được để lại cho bạn thực hiện vì các mẫu có sẵn không chứa bất kỳ thử nghiệm nào.

  1. Trong bảng điều khiển Cloud, hãy chuyển đến dịch vụ Cloud Run
  2. Nhấp vào nút "THIẾT LẬP TRIỂN KHAI LIÊN TỤC"
  3. Xác thực bằng GitHub và chọn kho lưu trữ của vi dịch vụ

a3b5692f178869bc.png

  1. Chọn kho lưu trữ trên GitHub rồi đặt nhánh thành: ^main$

338f1c00f33d2f65.png

  1. Đặt Loại bản dựng để sử dụng Buildpack
  2. Nhấp vào Lưu để thiết lập tính năng Triển khai liên tục.

8. Khả năng ghi nhận

Mọi thứ đều có thể hỏng. Khả năng ghi nhận giúp chúng ta biết thời điểm xảy ra sự cố và chẩn đoán nguyên nhân. Các chỉ số cho chúng ta biết dữ liệu về tình trạng và mức độ sử dụng dịch vụ của chúng ta. Nhật ký cho chúng ta thấy thông tin được đo lường theo cách thủ công do dịch vụ của chúng ta phát ra. Cảnh báo giúp chúng ta được thông báo khi có vấn đề xảy ra. Hãy cùng tìm hiểu kỹ hơn về từng loại.

Chỉ số

  1. Tìm dịch vụ của bạn trong danh sách dịch vụ Cloud Run
  2. Nhấp vào tên dịch vụ để truy cập vào trang tổng quan về chỉ số của dịch vụ đó

8491b8ec6bc5b4db.png

  1. Nhấp vào trình đơn ⋮ của một chỉ số, rồi chọn "Xem trong Trình khám phá chỉ số"
  2. Giờ đây, bạn có thể thay đổi các chỉ số tài nguyên, bộ lọc, nhóm và các lựa chọn khác. Ví dụ: bạn có thể xem độ trễ trung bình của dịch vụ cho tất cả các dịch vụ:

f0d666d8f4221d45.png

Nhật ký

Đầu ra STDOUT từ các dịch vụ được gửi đến hệ thống Google Cloud Logging. Bạn có thể truy cập vào chế độ xem nhật ký cơ bản trên trang quản trị dịch vụ Cloud Run, chẳng hạn như:

40058a82c9299cff.png

Trong nhật ký Cloud Run, bạn có thể lọc theo mức độ nghiêm trọng và lọc nhật ký. Để có thêm lựa chọn, hãy nhấp vào: 186fdb0e6d39a6ca.png

Cảnh báo

  1. Tạo một URL kiểm tra tình trạng cho dịch vụ của bạn.
  2. Đối với Spring Boot, bạn chỉ cần thêm phần phụ thuộc sau:
org.springframework.boot:spring-boot-starter-actuator
  1. Tạo hoặc cập nhật src/main/resources/application.properties và tắt quy trình kiểm tra dung lượng ổ đĩa:
management.health.diskspace.enabled=false
  1. Tạo cảnh báo thời gian hoạt động, chỉ định giao thức, tên máy chủ và đường dẫn. Đối với Spring Boot, đường dẫn là: /actuator/health
  2. Kiểm thử cảnh báo

6948d13b263bf573.png

  1. Tạo cảnh báo

9. 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!

Tài liệu tham khảo