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:
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 | ||
Java và Quarkus | ||
Kotlin và Micronaut | ||
Kotlin và Quarkus | ||
Scala và Khung chương trình của Play | ||
Go |
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ô
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.
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ì?
- Thêm tính năng theo dõi phân tán vào ứng dụng Spring Boot
- Sử dụng Nền tảng AI để biến dịch vụ vi mô của bạn trở nên siêu thông minh