Làm cách nào để triển khai mã cho GCP App Engine?

Google App Engine [GAE] là một trong những dịch vụ Nền tảng dưới dạng Dịch vụ [PaaS] ban đầu do Google Cloud Platform [GCP] cung cấp

GAE lưu trữ các ứng dụng web được viết bằng nhiều ngôn ngữ khác nhau. Nó cũng cung cấp định tuyến mạng, lập lịch công việc, lưu trữ dữ liệu liên tục và hàng đợi tác vụ

Trong bài đăng này, tôi xem xét cách triển khai một ứng dụng mẫu cho GAE và thao tác kết nối mạng để triển khai các kịch bản triển khai phổ biến như triển khai blue/green, canary và nhánh tính năng

Triển khai đơn giản

GAE cung cấp hai loại triển khai cho Java

  • Triển khai mã nguồn do GAE biên dịch
  • Triển khai các ứng dụng đã biên dịch

Việc cho phép GAE biên dịch mã nguồn của bạn rất thuận tiện, mặc dù trong ví dụ này, tôi sử dụng tệp JAR đã được hệ thống CI của chúng tôi biên dịch

Khả năng triển khai một ứng dụng đã biên dịch là duy nhất đối với Java trong GAE. Các thời gian chạy khác như Node, Python, Ruby và PHP thường không tạo ra các ứng dụng đã biên dịch. Go là ngoại lệ đáng chú ý và trong trường hợp đó, bạn cần triển khai mã nguồn của mình và cho phép GAE biên dịch nó cho bạn

Ứng dụng mẫu của chúng tôi là một ứng dụng web Java Spring đơn giản có tên là Báo giá ngẫu nhiên. Mã nguồn của ứng dụng này có thể được tìm thấy trong GitHub. Ứng dụng này tạo một tệp JAR độc lập lưu trữ ứng dụng và một máy chủ web tích hợp

Để triển khai ứng dụng, bạn cần tạo tài nguyên ứng dụng GAE tương ứng bên trong dự án GCP. Các bước bên dưới hiển thị tài nguyên ứng dụng đang được tạo thông qua bảng điều khiển web. Bước đầu tiên là chọn nơi tài nguyên ứng dụng sẽ được lưu trữ

Sau đó, bạn xác định môi trường sẽ lưu trữ ứng dụng web của mình

Một số hướng dẫn về các bước tiếp theo được cung cấp trong khi phiên bản GAE đang được tạo

Kết quả cuối cùng của quá trình này là việc tạo Ứng dụng được hiển thị trong sơ đồ bên dưới

Chỉ có một tài nguyên ứng dụng có thể tồn tại cho mỗi dự án. Nếu bạn cố gắng tạo một ứng dụng khác, chẳng hạn ở một khu vực khác, bạn sẽ thấy một lỗi như thế này

ERROR: [gcloud.app.create] The project [mattctest] already contains an App Engine application. You can deploy your application using `gcloud app deploy`.

Với tài nguyên ứng dụng của bạn được tạo, bạn có thể triển khai ứng dụng web của mình. Tài nguyên ứng dụng có thể lưu trữ nhiều dịch vụ, trong đó mỗi dịch vụ chạy ứng dụng của riêng bạn

Các dịch vụ [hơi khó hiểu] được định nghĩa trong một tệp có tên là

runtime: java11
service: default
instance_class: F2
1. Đây là một tệp
runtime: java11
service: default
instance_class: F2
1 ví dụ mà bạn có thể sử dụng để xác định và triển khai ứng dụng web Java của mình

runtime: java11
service: default
instance_class: F2

Thời gian chạy là thuộc tính bắt buộc xác định nền tảng sẽ lưu trữ mã của bạn. Tôi không thể tìm thấy danh sách thời gian chạy nhất định, nhưng

runtime: java11
service: default
instance_class: F2
3,
runtime: java11
service: default
instance_class: F2
4 và
runtime: java11
service: default
instance_class: F2
5 đều được đưa vào nhiều vị trí khác nhau trong tài liệu và ví dụ. Tôi sử dụng
runtime: java11
service: default
instance_class: F2
5 ở đây vì Java 11 là một phần của thế hệ thứ hai GAE

Dịch vụ đầu tiên được triển khai cho GAE phải được gọi là

runtime: java11
service: default
instance_class: F2
7, vì vậy tôi đã xác định tên đó trong trường
runtime: java11
service: default
instance_class: F2
8

Nếu bạn cố gắng triển khai một dịch vụ có tên khác với tên mặc định, bạn sẽ gặp lỗi

runtime: java11
service: default
instance_class: F2
0

Bạn cũng cần sử dụng lớn hơn một chút so với những gì được cung cấp theo mặc định. Điều này được định nghĩa trong thuộc tính

runtime: java11
service: default
instance_class: F2
9. Phiên bản F2 cung cấp 512MB bộ nhớ mà bạn cần cho ứng dụng web của mình

Biên dịch ứng dụng Java bằng lệnh

runtime: java11
service: default
instance_class: F2
2

Điều này tạo ra một tệp JAR trong thư mục

runtime: java11
service: default
instance_class: F2
00

Tại thời điểm viết bài, ứng dụng mẫu đang ở phiên bản 0. 1. 9, vì vậy tệp JAR được gọi là

runtime: java11
service: default
instance_class: F2
01

Để triển khai ứng dụng web, hãy chạy lệnh sau, thay thế tên của dự án để phù hợp với môi trường của bạn

runtime: java11
service: default
instance_class: F2
5

Ứng dụng đã biên dịch của bạn sau đó được triển khai. Nhật ký triển khai trả về một URL như https. //[Tên dự án]. úc. r. appspot. com/ đến dịch vụ trực tiếp mà bạn có thể mở trong trình duyệt web

Triển khai một nhánh tính năng

Một mẫu triển khai phổ biến là có các nhánh tính năng được triển khai song song với nhánh chính. Để mô phỏng điều này, hãy triển khai nhánh blueheader của ứng dụng web của bạn, nhánh này sẽ thay đổi màu nền của biểu ngữ thành màu xanh lam

Tệp

runtime: java11
service: default
instance_class: F2
1 cho chi nhánh này trông như thế này

runtime: java11
service: default
instance_class: F2
7

Tôi đã đặt tên mới cho dịch vụ này để khớp với tên của nhánh tính năng. Tôi cũng đã xác định biến môi trường

runtime: java11
service: default
instance_class: F2
03, đặt nó thành
runtime: java11
service: default
instance_class: F2
04. Điều này xác định đường dẫn ngữ cảnh mà ứng dụng web dự kiến ​​sẽ nhận được lưu lượng truy cập từ. Điều này cho phép bạn kiểm tra một số quy tắc định tuyến lưu lượng, nghĩa là bạn có thể truy cập dịch vụ mới từ một URL như https. //[Tên dự án]. úc. r. appspot. com/blueheader [trái ngược với URL dịch vụ duy nhất của https. //blueheader-dot-[tên dự án]. úc. r. appspot. com]

Để định tuyến thư mục con của

runtime: java11
service: default
instance_class: F2
05 đến dịch vụ mới, hãy tạo một tệp có tên là
runtime: java11
service: default
instance_class: F2
06 với nội dung sau. Các quy tắc gửi này xác định cách lưu lượng truy cập được định tuyến từ một URL đến một dịch vụ

runtime: java11
service: default
instance_class: F2
2

Điều này được triển khai với lệnh

runtime: java11
service: default
instance_class: F2
3

Bây giờ bạn có thể mở nhánh tính năng tại URL https. //[Tên dự án]. úc. r. appspot. com/blueheader

Triển khai phân tách lưu lượng, canary và blue/green

Bây giờ chúng ta hãy xem cách bạn có thể sử dụng phân tách lưu lượng để triển khai triển khai canary và blue/green

Đối với điều này, bạn cần chuyển phiên bản của ứng dụng trong tệp

runtime: java11
service: default
instance_class: F2
07 thành
runtime: java11
service: default
instance_class: F2
08

runtime: java11
service: default
instance_class: F2
6

Ứng dụng sau đó được đóng gói lại bằng lệnh

runtime: java11
service: default
instance_class: F2
2

Phiên bản mới được triển khai bằng lệnh

runtime: java11
service: default
instance_class: F2
0

Tùy chọn

runtime: java11
service: default
instance_class: F2
09 đảm bảo phiên bản mới này không nhận được bất kỳ lưu lượng truy cập nào, vì vậy hãy mở https. //[Tên dự án]. úc. r. appspot. com/ sẽ vẫn hiển thị phiên bản trước của ứng dụng web

Trong tab Phiên bản, có một nút tên là TÁCH LƯU LƯỢNG

Nhấp vào nút này cho phép bạn điều hướng lưu lượng truy cập giữa các phiên bản dịch vụ. Trong ảnh chụp màn hình bên dưới, bạn có thể thấy rằng lưu lượng truy cập đã được chia 50/50 giữa hai phiên bản mới nhất. Bạn đã chia lưu lượng truy cập một cách ngẫu nhiên, vì điều này cho phép bạn làm mới URL và xem hai phiên bản. Tuy nhiên, nếu bạn đang thực hiện triển khai sản xuất canary, có khả năng bạn sẽ hướng người dùng đến cùng một phiên bản dựa trên cookie hoặc địa chỉ IP để mỗi yêu cầu không được chuyển đến một phiên bản ngẫu nhiên

Bây giờ 50% yêu cầu https. //[Tên dự án]. úc. r. appspot. com/ trở lại phiên bản 0. 1. 9 và trả lại 50% phiên bản 0. 1. 10

Việc triển khai canary đạt được bằng cách tăng dần lưu lượng truy cập vào phiên bản mới của dịch vụ. Triển khai xanh dương/xanh lá cây chỉ cần chuyển 100% lưu lượng truy cập sang phiên bản mới sau khi mọi thử nghiệm được hoàn thành. Bạn có thể kiểm tra một phiên bản cụ thể bên ngoài bất kỳ quy tắc phân chia lưu lượng truy cập nào bằng cách sử dụng URL như https. //[phiên bản]-dot-[tên dự án]. úc. r. appspot. com/

Phần kết luận

Google App Engine cung cấp một nền tảng linh hoạt để lưu trữ các ứng dụng web. Chức năng phân chia lưu lượng và định tuyến mạng cho phép thực hiện các quy trình triển khai phức tạp như nhánh đặc trưng, ​​hoàng yến và xanh lam/xanh lá cây

Trong bài đăng trên blog này, tôi đã triển khai một ứng dụng web Java đơn giản và trình bày cách các mẫu triển khai nâng cao có thể được thực hiện

Chủ Đề