1. Tổng quan
Loạt lớp học lập trình này (hướng dẫn thực hành, tự học) nhằm giúp các nhà phát triển Java trên Google App Engine (Chuẩn) hiện đại hoá ứng dụng của họ bằng cách hướng dẫn họ thực hiện một loạt các hoạt động di chuyển. Bằng cách làm theo các bước này, bạn có thể cập nhật ứng dụng để dễ dàng di chuyển hơn và quyết định đóng gói ứng dụng cho Cloud Run, dịch vụ lưu trữ vùng chứa chị em của Google Cloud với App Engine và các dịch vụ lưu trữ vùng chứa khác.
Hướng dẫn này chỉ cho bạn cách chứa một ứng dụng App Engine để triển khai dịch vụ được quản lý hoàn toàn cho Cloud Run bằng Dockerfile. Các tệp Docker là phương thức triển khai phù hợp nhất cho quá trình di chuyển này, nhưng cũng cung cấp nhiều lựa chọn nhất để tuỳ chỉnh quy trình xây dựng của bạn.
Ngoài hướng dẫn cho bạn các bước cần thiết để chuyển từ App Engine sang Cloud Run, bạn cũng sẽ tìm hiểu cách nâng cấp một ứng dụng Java 8 App Engine lên Java 17.
Nếu ứng dụng mà bạn muốn di chuyển sử dụng nhiều dịch vụ theo gói cũ của App Engine hoặc các tính năng dành riêng cho App Engine khác, thì hướng dẫn Truy cập vào các dịch vụ theo gói của App Engine cho Java 11/17 có thể là điểm xuất phát phù hợp hơn so với lớp học lập trình này.
Bạn sẽ tìm hiểu cách
- Sử dụng Cloud Shell
- Bật Cloud Run, Artifact Registry và API Cloud Build
- Đóng gói ứng dụng bằng Docker, Docker và Cloud Build
- Triển khai hình ảnh vùng chứa lên Cloud Run
Bạn cần có
- Dự án Google Cloud Platform có tài khoản thanh toán GCP đang hoạt động và đã bật App Engine
- Có kiến thức về các lệnh Linux phổ biến
- Kiến thức cơ bản về cách phát triển và triển khai ứng dụng App Engine
- Ứng dụng servlet Java 8 mà bạn muốn di chuyển sang Java 17 và triển khai trên Cloud Run (đây có thể là ứng dụng trên App Engine hoặc chỉ là nguồn)
Khảo sát
Bạn sẽ sử dụng hướng dẫn này như thế nào?
Bạn đánh giá thế nào về trải nghiệm của mình với Java?
Bạn đánh giá thế nào về trải nghiệm sử dụng các dịch vụ của Google Cloud?
2. Thông tin khái quát
Các hệ thống PaaS như App Engine và Cloud Functions mang đến nhiều tiện ích cho nhóm và ứng dụng của bạn, chẳng hạn như cho phép SysAdmins và Devops tập trung vào việc xây dựng các giải pháp. Với các nền tảng không có máy chủ, ứng dụng của bạn có thể tự động mở rộng quy mô khi cần, giảm quy mô xuống 0 bằng phương thức thanh toán theo mức sử dụng để giúp kiểm soát chi phí và sử dụng nhiều ngôn ngữ phát triển phổ biến.
Tuy nhiên, tính linh hoạt của vùng chứa cũng rất hấp dẫn. Với khả năng chọn bất kỳ ngôn ngữ, thư viện và tệp nhị phân nào, vùng chứa mang đến cho bạn những lợi ích tốt nhất của cả hai thế giới: sự tiện lợi của mô hình không máy chủ cùng với tính linh hoạt của vùng chứa. Đó chính là mục tiêu của Google Cloud Run.
Việc tìm hiểu cách sử dụng Cloud Run không thuộc phạm vi của lớp học lập trình này; nội dung đó được đề cập trong tài liệu về Cloud Run. Mục tiêu của bài viết này là giúp bạn làm quen với cách đóng gói ứng dụng App Engine cho Cloud Run (hoặc các dịch vụ khác được lưu trữ trong vùng chứa). Có một số điều bạn nên biết trước khi tiếp tục, chủ yếu là trải nghiệm người dùng sẽ hơi khác.
Trong lớp học lập trình này, bạn sẽ tìm hiểu cách tạo và triển khai vùng chứa. Bạn sẽ tìm hiểu cách dùng Dockerfile để chứa ứng dụng của mình, di chuyển khỏi cấu hình App Engine và xác định các bước xây dựng cho Cloud Build (không bắt buộc). Việc này sẽ liên quan đến việc ngừng sử dụng một số tính năng dành riêng cho App Engine. Nếu không muốn làm theo cách này, bạn vẫn có thể nâng cấp lên môi trường thời gian chạy Java 11/17 trong khi vẫn giữ lại ứng dụng trên App Engine.
3. Thiết lập/Công việc chuẩn bị
1. Thiết lập dự án
Trong hướng dẫn này, bạn sẽ sử dụng một ứng dụng mẫu từ kho lưu trữ appengine-java-migration-samples trên một dự án hoàn toàn mới. Đảm bảo dự án có tài khoản thanh toán đang hoạt động.
Nếu dự định di chuyển một ứng dụng App Engine hiện có sang Cloud Run, bạn có thể sử dụng ứng dụng đó để làm theo.
Chạy lệnh sau để bật các API cần thiết cho dự án của bạn:
gcloud services enable artifactregistry.googleapis.com cloudbuild.googleapis.com run.googleapis.com
2. Tải ứng dụng mẫu cơ sở
Nhân bản ứng dụng mẫu trên máy của riêng bạn hoặc Cloud Shell, sau đó chuyển đến thư mục baseline (đường cơ sở).
Mẫu này là một ứng dụng Datastore dựa trên Servlet, Java 8, dùng để triển khai trên App Engine. Làm theo hướng dẫn trong tệp README về cách chuẩn bị ứng dụng này để triển khai trên App Engine.
3. (Không bắt buộc) Triển khai ứng dụng cơ sở
Bạn chỉ cần làm những việc sau đây nếu muốn xác nhận rằng ứng dụng hoạt động trên App Engine trước khi chúng ta di chuyển sang Cloud Run.
Hãy tham khảo các bước trong README.md:
- Cài đặt/Làm quen lại với CLI
gcloud
- Khởi động CLI gcloud cho dự án của bạn bằng
gcloud init
- Tạo dự án App Engine bằng
gcloud app create
- Triển khai ứng dụng mẫu lên App Engine
./mvnw package appengine:deploy -Dapp.projectId=$PROJECT_ID
- Xác nhận ứng dụng chạy trên App Engine mà không gặp vấn đề
4. Tạo kho lưu trữ Artifact Registry
Sau khi đóng gói ứng dụng, bạn cần có một nơi để đẩy và lưu trữ hình ảnh. Bạn nên thực hiện việc này trên Google Cloud bằng Cơ sở lưu trữ cấu phần phần mềm.
Tạo kho lưu trữ có tên migration
bằng gcloud như sau:
gcloud artifacts repositories create migration --repository-format=docker \
--description="Docker repository for the migrated app" \
--location="northamerica-northeast1"
Xin lưu ý rằng kho lưu trữ này sử dụng loại định dạng docker
, nhưng có một số loại kho lưu trữ.
Tại thời điểm này, bạn đã có ứng dụng cơ sở App Engine và dự án Google Cloud của bạn đã sẵn sàng di chuyển ứng dụng đó sang Cloud Run.
4. Sửa đổi tệp ứng dụng
Trong trường hợp ứng dụng của bạn sử dụng nhiều dịch vụ, cấu hình theo gói cũ hoặc các tính năng chỉ dành cho App Engine khác của App Engine, bạn nên tiếp tục truy cập vào các dịch vụ đó trong khi nâng cấp lên môi trường thời gian chạy mới. Lớp học lập trình này minh hoạ lộ trình di chuyển cho các ứng dụng đã sử dụng dịch vụ độc lập hoặc có thể được tái cấu trúc để thực hiện việc này.
1. Nâng cấp lên Java 17
Nếu ứng dụng của bạn đang chạy trên Java 8, hãy cân nhắc nâng cấp lên một ứng cử viên LTS mới hơn như 11 hoặc 17 để nắm bắt các bản cập nhật bảo mật và sử dụng các tính năng ngôn ngữ mới.
Hãy bắt đầu bằng cách cập nhật các thuộc tính trong pom.xml
để thêm những thuộc tính sau:
<properties>
<java.version>17</java.version>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
Thao tác này sẽ đặt phiên bản dự án thành 17, thông báo cho trình bổ trợ trình biên dịch rằng bạn muốn truy cập vào các tính năng ngôn ngữ Java 17 và muốn các lớp đã biên dịch tương thích với JVM Java 17.
2. Bao gồm cả máy chủ web
Có một số điểm khác biệt giữa App Engine và Cloud Run mà bạn nên cân nhắc khi chuyển đổi giữa các nền tảng này. Một điểm khác biệt là mặc dù môi trường thời gian chạy Java 8 của App Engine cung cấp và quản lý máy chủ Jetty cho các ứng dụng mà nó lưu trữ, nhưng Cloud Run thì không. Chúng ta sẽ sử dụng Spring Boot để cung cấp máy chủ web và vùng chứa servlet.
Thêm các phần phụ thuộc sau:
<dependencies>
<!-- ... -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.6.6</version>
<exclusions>
<!-- Exclude the Tomcat dependency -->
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- Use Jetty instead -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
<version>2.6.6</version>
</dependency>
<!-- ... -->
</dependencies>
Theo mặc định, Spring Boot nhúng một máy chủ Tomcat, nhưng mẫu này sẽ loại trừ cấu phần phần mềm đó và gắn bó với Jetty để giảm thiểu sự khác biệt về hành vi mặc định sau khi di chuyển.
3. Thiết lập Spring Boot
Mặc dù Spring Boot có thể sử dụng lại các servlet mà không cần sửa đổi, nhưng bạn sẽ cần phải định cấu hình để đảm bảo có thể phát hiện được các servlet đó.
Tạo lớp MigratedServletApplication.java
sau trong gói com.example.appengine
:
package com.example.appengine;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
@ServletComponentScan
@SpringBootApplication
@EnableAutoConfiguration
public class MigratedServletApplication {
public static void main(String[] args) {
SpringApplication.run(MigratedServletApplication.class, args);
}
}
Lưu ý là việc này bao gồm cả chú giải @ServletComponentScan
. Chú giải này sẽ tìm (trong gói hiện tại theo mặc định) cho mọi @WebServlets
và làm cho chúng xuất hiện như dự kiến.
4. Đóng gói ứng dụng dưới dạng tệp JAR
Mặc dù bạn có thể đóng gói ứng dụng bắt đầu từ một tệp war, nhưng việc này sẽ dễ dàng hơn nếu bạn đóng gói ứng dụng dưới dạng tệp JAR có thể thực thi. Tính năng này sẽ không yêu cầu nhiều cấu hình, đặc biệt là đối với các dự án sử dụng Maven làm công cụ xây dựng – vì việc đóng gói jar là hành vi mặc định.
Xoá thẻ packaging
trong tệp pom.xml
:
<packaging>war</packaging>
Tiếp theo, hãy thêm spring-boot-maven-plugin
:
<plugins>
<!-- ... -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.6.6</version>
</plugin>
<!-- ... -->
</plugins>
5. Di chuyển khỏi cấu hình, dịch vụ và phần phụ thuộc của App Engine
Như đã đề cập ở đầu lớp học lập trình, Cloud Run và App Engine được thiết kế để mang lại trải nghiệm người dùng khác nhau. Một số tính năng nhất định mà App Engine cung cấp sẵn (chẳng hạn như dịch vụ Cron và Task Queue (Bộ xếp hàng tác vụ)) cần được tạo lại theo cách thủ công và sẽ được đề cập chi tiết hơn trong các mô-đun sau.
Ứng dụng mẫu không sử dụng các dịch vụ theo gói cũ, nhưng người dùng có ứng dụng sử dụng các dịch vụ này có thể tham khảo các hướng dẫn sau:
- Di chuyển từ các dịch vụ theo gói để tìm các dịch vụ độc lập phù hợp.
- Di chuyển tệp cấu hình XML sang YAML dành cho người dùng chuyển sang môi trường thời gian chạy Java 11/17 mà vẫn ở trên App Engine.
Vì bạn sẽ triển khai cho Cloud Run từ giờ trở đi nên bạn có thể xoá appengine-maven-plugin
:
<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>appengine-maven-plugin</artifactId>
<version>2.4.1</version>
<configuration>
<!-- can be set w/ -DprojectId=myProjectId on command line -->
<projectId>${app.projectId}</projectId>
<!-- set the GAE version or use "GCLOUD_CONFIG" for an autogenerated GAE version -->
<version>GCLOUD_CONFIG</version>
</configuration>
</plugin>
5. Đóng gói ứng dụng
Tại thời điểm này, bạn đã sẵn sàng thông báo cho Cloud Build về cách thực sự tạo vùng chứa của ứng dụng. Với phương thức đóng gói này, bạn không cần phải có tệp cấu hình bản dựng riêng (cloudbuild.yaml). Chúng ta chỉ cần xác định một Dockerfile tối thiểu làm điểm xuất phát:
TỪ eclipse-temurin
ARG JAR_FILE=JAR_FILE_MUST_BE_SPECIFIED_AS_BUILD_ARG
SAO CHÉP ${JAR_FILE} app.jar
ENTRYPOINT ["java", "-jar","/app.jar"]
Tệp docker này gói phiên bản uber-jar của dịch vụ khởi động mùa xuân trong một lớp duy nhất. Đây là phương pháp đơn giản nhất để đóng gói vùng chứa Dockerfile, nhưng có một số hạn chế, đặc biệt là khi so sánh các lần lặp lại mà các phần phụ thuộc tương đối ổn định. Những mối lo ngại như vậy là lý do khiến phương thức đóng gói này được coi là nâng cao hơn. Tuy nhiên, về ưu điểm, việc viết tệp dockerfile của riêng bạn sẽ giúp bạn kiểm soát hoàn toàn hình ảnh cơ sở và khai thác các lợi ích về hiệu suất của việc viết hình ảnh được phân lớp cẩn thận.
2**. Chạy quy trình xây dựng**
Giờ đây, khi đã thông báo cho Cloud Build về các bước xây dựng mong muốn, bạn đã sẵn sàng triển khai bằng một lần nhấp.
Chạy lệnh sau:
gcloud builds submit --tag LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_NAME
Thay thế các giá trị phần giữ chỗ trong lệnh trên bằng:
- LOCATION (VỊ TRÍ): vị trí theo khu vực hoặc nhiều khu vực cho kho lưu trữ của bạn.
- PROJECT_ID: Mã dự án trên đám mây của bạn.
- REPOSITORY: tên của kho lưu trữ Artifact Registry.
- IMAGE_NAME: tên của hình ảnh vùng chứa của bạn.
Sau khi quá trình này hoàn tất, hình ảnh vùng chứa của bạn sẽ được tạo, lưu trữ trong Artifact Registry và triển khai lên Cloud Run.
Khi kết thúc lớp học lập trình này, ứng dụng của bạn sẽ có giao diện giống như ứng dụng trong thư mục mod4-migrate-to-cloud-run.
Vậy là xong! Bạn đã di chuyển thành công một ứng dụng App Engine Java 8 sang Java 17 và Cloud Run. Giờ đây, bạn đã hiểu rõ hơn về công việc liên quan khi chuyển đổi và chọn giữa các lựa chọn lưu trữ.
6. Tóm tắt/Dọn dẹp
Xin chúc mừng! Bạn đã nâng cấp, đóng gói, di chuyển và ứng dụng của mình. Đây là phần kết thúc của hướng dẫn này!
Từ đây, bước tiếp theo là tìm hiểu thêm về các tính năng bảo mật trong chuỗi cung ứng phần mềm và CI/CD mà bạn có thể triển khai bằng Cloud Build:
- Tạo các bước bản dựng tuỳ chỉnh bằng Cloud Build
- Tạo và quản lý Trình kích hoạt bản dựng
- Sử dụng tính năng Quét theo yêu cầu trong quy trình Cloud Build
Không bắt buộc: Dọn dẹp và/hoặc tắt dịch vụ
Nếu bạn đã triển khai ứng dụng mẫu trên App Engine trong hướng dẫn này, hãy nhớ tắt ứng dụng để tránh bị tính phí. Khi đã sẵn sàng chuyển sang lớp học lập trình tiếp theo, bạn có thể bật lại tính năng này. Khi bị vô hiệu hoá, các ứng dụng App Engine sẽ không nhận được lưu lượng truy cập nào để tính phí. Tuy nhiên, mức sử dụng Datastore có thể phải trả phí nếu vượt quá hạn mức miễn phí. Vì vậy, hãy xoá đủ để nằm trong giới hạn đó.
Mặt khác, nếu không tiếp tục di chuyển và muốn xoá mọi thứ hoàn toàn, bạn có thể xoá dịch vụ hoặc tắt hoàn toàn dự án.
7. Tài nguyên khác
Vấn đề/phản hồi về lớp học lập trình về mô-đun di chuyển App Engine
Nếu bạn gặp vấn đề với lớp học lập trình này, trước tiên, vui lòng tìm vấn đề của bạn trước khi gửi. Đường liên kết để tìm kiếm và báo cáo vấn đề mới:
Tài nguyên di chuyển
- Các lựa chọn di chuyển để tách các dịch vụ của công cụ phát triển ứng dụng
- Thiết lập Điều kiện kích hoạt bản dựng cho Cloud Build
- Thông tin khác về việc di chuyển sang Java 11/17
Tài nguyên trực tuyến
Dưới đây là các tài nguyên trực tuyến có thể liên quan đến hướng dẫn này:
App Engine
- Tài liệu về App Engine
- Thông tin về giá và hạn mức của App Engine
- So sánh nền tảng thế hệ thứ nhất và thứ hai
- Hỗ trợ dài hạn cho các môi trường thời gian chạy cũ
Thông tin khác về Cloud
Video
- Trạm di chuyển không máy chủ
- Expeditions không cần máy chủ
- Đăng ký Google Cloud Tech
- Đăng ký theo dõi Google Developers
Giấy phép
Tác phẩm này được cấp phép theo Giấy phép chung Ghi công 2.0 của Creative Commons.