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 05 năm 2021

Dịch vụ vi mô Rainbow Rumpus

Bạn đã từng tham gia trò chơi ném tuyết chưa? Trong trò chơi này, bạn di chuyển xung quanh và ném tuyết vào người khác một cách vui nhộn. 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 trận chiến hoành tráng chống lại các dịch vụ vi mô khác, đó là ném cầu vồng thay vì ném tuyết.

Bạn có thể thắc mắc... Nhưng làm cách nào để một dịch vụ vi mô "ném" cầu vồng vào 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 trong quá trình đó, bạn sẽ tìm hiểu cách xây dựng và triển khai 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ô bằng bất kỳ công nghệ nào bạn muốn (hoặc chọn trong số các công cụ khởi động Go, Java, Kotlin, Scala, NodeJS hoặc Python) rồi triển khai dịch vụ vi mô đó trên Google Cloud. Sau khi triển khai, bạn sẽ cho chúng tôi biết URL của dịch vụ vi mô của mình, sau đó chúng tôi sẽ thêm dịch vụ đó vào đấu trường.

Đấu trường chứa tất cả người chơi trong một trận chiến nhất định. Cầu vồng Rumpus sẽ có đấu trường 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 cầu vồng vào những 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 cầu vồng. Cầu vồng sẽ di chuyển lên đến ba không gian theo hướng mà người chơi nhìn thấy. Nếu cầu vồng "đổ vào" một người chơi khác, người ném sẽ nhận đượ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 được tự động điều chỉnh cho 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.pngs

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

Mâu thuẫn xoay vòng

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

Xem trận chiến

Để xem hiệu suất của dịch vụ vi mô trong trận chiến, hãy tham khảo đấ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, dịch vụ vi mô của bạn 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 có mã trạng thái 200 (OK) với nội dung phản hồi chứa nước đi tiếp theo, đượ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 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) thường ít gặp vấn đề hơn so với tài khoản GSuite vì đôi khi, quản trị viên GSuite ngăn người dùng 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 ta sẽ sử dụng sẽ 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 dịch vụ vi mô

Bạn có thể xây dựng dịch vụ vi mô 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ủ API Battle. Tuy nhiên, để giúp bạn dễ dàng bắt đầu, chúng tôi sẽ hướng dẫn 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 mẫu để bắt đầu

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

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

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à Nhanh

Nguồn

Python và Bình giữ nhiệt

Nguồn

Sau khi bạn quyết định bắt đầu với mẫu nào, 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ụ (có 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 của F, L, R hoặc T.

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

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

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

Trước khi có thể thực hiện 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 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

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=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 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 chi tiết hơn về cách thực hiện thay đổi.

f910c9ef7b51c406.png

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

Sau khi lưu nội dung 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 mở đú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 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).

# 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, khi hình ảnh vùng chứa đã đượ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 hình ảnh đó:

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 \
          --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ụ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:
# 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 biến môi trường PROJECT_IDSAMPLE thành cùng một 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 \
  --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 dịch vụ vi mô:

  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 git (CLI) hoặc ứng dụng GitHub Desktop GUI (Windows hoặc Mac). Nếu đang sử dụng Cloud Shell, bạn sẽ phải sử dụng git CLI. Để lấy mã của dịch vụ vi mô trên GitHub, hãy làm theo hướng dẫn của CLI hoặc GitHub Desktop.

Đẩy mã bằng git CLI

  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 "kho lưu trữ"
  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 biến môi trường cho tổ chức và kho lưu trữ 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 vào 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ể cam kết và đẩy các thay đổi đó sang GitHub:
git add .
git status
git diff --staged
git commit -am "my changes"
git push

Đẩy mã bằng GitHub trên máy tính

  1. Tải mã xuống bằng cách làm theo hướng dẫn trong lớp học "Phát triển cục bộ" trước đó
  2. Cài đặt GitHub Desktop, chạy ứng dụng và đăng nhập
  3. Sao chép kho lưu trữ mới tạo

cf7f38c7c86a91cd.png

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

5f3c1552e30ad7c5.png

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

Thiết lập tính năng triển khai liên tục trên Cloud Run

Với cách thiết lập SCM trên GitHub, giờ đây, bạn có thể thiết lập tính năng Phân phối liên tục để mỗi khi các cam kết mới được đẩy đến nhánh main, Cloud Build sẽ tự động xây dựng 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 bài kiểm thử trước khi triển khai. Tuy nhiên, bạn vẫn nên thực hiện bước đó vì các mẫu có sẵn không chứa bất kỳ bài kiểm thử nào.

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

a3b5692f178869bc.png

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

338f1c00f33d2f65.pngS

  1. Đặt Loại bản dựng để sử dụng Gói bản dựng
  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

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

Chỉ số

  1. Tìm dịch vụ của bạn trong danh sách các dịch vụ của 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ố, sau đó chọn "Xem trong Trình khám phá chỉ số"
  2. Giờ đây, bạn có thể thay đổi các chỉ số, bộ lọc, nhóm tài nguyên và các lựa chọn khác. Ví dụ: bạn có thể xem độ trễ dịch vụ trung bình 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ể sử dụng 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.pngS

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

Cảnh báo

  1. Tạo URL kiểm tra sức khoẻ 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 tính năng kiểm tra dung lượng ổ đĩa:
management.health.diskspace.enabled=false
  1. Tạo cảnh báo về thời gian hoạt động, chỉ định giao thức, tên máy chủ và đường dẫn. Đối với tính năng Khởi động mùa xuân, đường dẫn là: /actuator/health
  2. Kiểm thử cảnh báo

6948d13b263bf573.pngs

  1. Tạo cảnh báo

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

Tài liệu tham khảo