1. Tổng quan
Tính năng theo dõi phân tán đóng vai trò quan trọng trong việc thu thập thông tin chi tiết và khả năng ghi nhận được đối với một kiến trúc vi dịch vụ đa cấp. Khi bạn liên kết dịch vụ với các lệnh gọi dịch vụ, từ dịch vụ A đến dịch vụ B đến dịch vụ C, bạn cần hiểu rằng các lệnh gọi đã thành công và cả độ trễ ở mỗi bước.
Trong Spring Boot, bạn có thể dùng Spring Cloud Sleuth để thêm liền mạch khả năng đo lường hoạt động theo dõi được phân phối vào ứng dụng của mình. Theo mặc định, dịch vụ này có thể chuyển tiếp dữ liệu theo dõi đến Zipkin.
Google Cloud Platform có Cloud Trace. Đây là một dịch vụ được quản lý cho phép bạn lưu trữ dữ liệu theo dõi mà không cần phải tự quản lý phiên bản hay bộ nhớ của Zipkin. Cloud Trace cũng có thể tạo báo cáo phân bổ độ trễ và tự động phát hiện lỗi hồi quy hiệu suất.
Bạn có hai tuỳ chọn để sử dụng Cloud Trace từ ứng dụng Spring Boot:
- Sử dụng Stackdriver Trace Zipkin Proxy và chỉ cần định cấu hình Spring Cloud Sleuth để sử dụng proxy này làm điểm cuối Zipkin
- Bạn cũng có thể dùng Spring Cloud GCP Trace. Giải pháp này tích hợp liền mạch với Spring Cloud Sleuth và chuyển tiếp dữ liệu theo dõi trực tiếp tới Cloud Trace.
Trong lớp học lập trình này, bạn sẽ tìm hiểu cách tạo ứng dụng mới có tên là Spring Boot và sử dụng công cụ Dấu vết của Spring Cloud GCP để theo dõi phân tán.
Kiến thức bạn sẽ học được
- Cách tạo ứng dụng Java khởi động mùa xuân và định cấu hình Cloud Trace.
Bạn cần có
- Một dự án trên Google Cloud Platform
- Một trình duyệt, chẳng hạn như Chrome hoặc Firefox
- Quen thuộc với các trình soạn thảo văn bản tiêu chuẩn của Linux như Vim, EMAC hoặc Nano
Bạn sẽ dùng hướng dẫn này như thế nào?
Bạn đánh giá thế nào về kinh nghiệm xây dựng ứng dụng web HTML/CSS?
Bạn đánh giá trải nghiệm sử dụng các dịch vụ của Google Cloud Platform như thế nào?
2. Thiết lập và yêu cầu
Thiết lập môi trường theo tiến độ riêng
- Đăng nhập vào Google Cloud Console rồi tạo dự án mới hoặc sử dụng lại dự án hiện có. Nếu chưa có tài khoản Gmail hoặc Google Workspace, bạn phải tạo một tài khoản.
- Tên dự án là tên hiển thị của những người tham gia dự án này. Đây là một chuỗi ký tự không được API của Google sử dụng. Bạn luôn có thể cập nhật ứng dụng.
- Mã dự án là duy nhất trong tất cả các dự án Google Cloud và không thể thay đổi (không thể thay đổi sau khi đặt). Cloud Console sẽ tự động tạo một chuỗi duy nhất; thường bạn không quan tâm đến sản phẩm đó là gì. Trong hầu hết các lớp học lập trình, bạn sẽ cần tham khảo Mã dự án của mình (thường được xác định là
PROJECT_ID
). Nếu không thích mã đã tạo, bạn có thể tạo một mã nhận dạng ngẫu nhiên khác. Ngoài ra, bạn có thể thử cách riêng của mình để xem có thể sử dụng hay không. Bạn không thể thay đổi mã này sau bước này và mã vẫn giữ nguyên trong thời gian dự án. - Đối với thông tin của bạn, có giá trị thứ ba, Project Number (Số dự án), mà một số API sử dụng. Tìm hiểu thêm về cả ba giá trị này trong tài liệu này.
- Tiếp theo, bạn sẽ phải bật tính năng thanh toán trong Cloud Console để sử dụng API/tài nguyên trên đám mây. Việc chạy qua lớp học lập trình này sẽ không tốn nhiều chi phí. Để tắt các tài nguyên nhằm tránh phát sinh việc thanh toán ngoài hướng dẫn này, bạn có thể xoá các tài nguyên bạn đã tạo hoặc xoá dự án. Người dùng mới của Google Cloud đủ điều kiện tham gia chương trình Dùng thử miễn phí 300 USD.
Google Cloud Shell
Mặc dù bạn có thể vận hành Google Cloud và Kubernetes có thể vận hành từ xa bằng máy tính xách tay, nhưng trong lớp học lập trình này, chúng ta sẽ sử dụng Google Cloud Shell, một môi trường dòng lệnh chạy trên Đám mây.
Kích hoạt Cloud Shell
- Trong Cloud Console, hãy nhấp vào Kích hoạt Cloud Shell .
Nếu đây là lần đầu tiên khởi động Cloud Shell, bạn sẽ thấy một màn hình trung gian mô tả về Cloud Shell. Nếu bạn nhìn thấy màn hình trung gian, hãy nhấp vào Tiếp tục.
Quá trình cấp phép và kết nối với Cloud Shell chỉ mất vài phút.
Máy ảo này được tải tất cả các công cụ phát triển cần thiết. Dịch vụ này cung cấp thư mục gốc có dung lượng ổn định 5 GB và chạy trên Google Cloud, giúp nâng cao đáng kể hiệu suất và khả năng xác thực của mạng. Nhiều (nếu không nói là) tất cả công việc của bạn trong lớp học lập trình này đều có thể thực hiện bằng trình duyệt.
Sau khi kết nối với Cloud Shell, bạn sẽ thấy mình đã được xác thực và dự án được đặt thành mã dự án.
- Chạy lệnh sau trong Cloud Shell để xác nhận rằng bạn đã được xác thực:
gcloud auth list
Kết quả lệnh
Credentialed Accounts ACTIVE ACCOUNT * <my_account>@<my_domain.com> To set the active account, run: $ gcloud config set account `ACCOUNT`
- Chạy lệnh sau trong Cloud Shell để xác nhận rằng lệnh gcloud biết về dự án của bạn:
gcloud config list project
Kết quả lệnh
[core] project = <PROJECT_ID>
Nếu chưa, bạn có thể thiết lập chế độ này bằng lệnh sau:
gcloud config set project <PROJECT_ID>
Kết quả lệnh
Updated property [core/project].
3. Tạo dịch vụ REST khởi động mùa xuân mới
Sau khi Cloud Shell chạy, bạn có thể sử dụng dòng lệnh để tạo ứng dụng Spring Boot mới bằng Spring Boot:
$ curl https://start.spring.io/starter.tgz -d packaging=jar \
-d bootVersion=2.7.6 \
-d dependencies=web,lombok,cloud-gcp,distributed-tracing \
-d jvmVersion=17 \
-d type=maven-project \
-d baseDir=trace-service-one | tar -xzvf - \
&& cd trace-service-one
Tạo trình điều khiển REST mới bằng cách thêm một lớp mới:
src/main/java/com/example/demo/WorkController.java
package com.example.demo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Random;
@RestController
@Slf4j
public class WorkController {
Random r = new Random();
public void meeting() {
try {
log.info("meeting...");
// Delay for random number of milliseconds.
Thread.sleep(r.nextInt(500));
} catch (InterruptedException e) {
}
}
@GetMapping("/")
public String work() {
// What is work? Meetings!
// When you hit this URL, it'll call meetings() 5 times.
// Each time will have a random delay.
log.info("starting to work");
for (int i = 0; i < 5; i++) {
this.meeting();
}
log.info("finished!");
return "finished work!";
}
}
Đảm bảo bạn có phiên bản JVM phù hợp cho ứng dụng:
$ export JAVA_HOME=/usr/lib/jvm/java-1.17.0-openjdk-amd64
Bạn có thể khởi động ứng dụng Spring Boot như bình thường bằng trình bổ trợ Spring Boot. Hãy bỏ qua các thử nghiệm cho phòng thí nghiệm này:
$ ./mvnw -DskipTests spring-boot:run
Sau khi ứng dụng khởi động, hãy nhấp vào biểu tượng Xem trước trên web trong thanh công cụ Cloud Shell rồi chọn xem trước trên cổng 8080.
Sau một chút thời gian chờ đợi, bạn sẽ thấy kết quả:
Trong Cloud Shell, bạn cũng sẽ thấy thông điệp nhật ký có mã theo dõi và mã span:
4. Sử dụng Cloud Trace
Bật Cloud Trace API
Trước tiên, bạn phải bật Cloud Trace API rồi mới có thể sử dụng Cloud Trace để lưu trữ dữ liệu theo dõi. Để bật API, hãy thực thi:
$ gcloud services enable cloudtrace.googleapis.com
Thiết lập thông tin đăng nhập mặc định của ứng dụng
Đối với phòng thí nghiệm này, bạn cần định cấu hình thông tin xác thực mặc định của ứng dụng. Thông tin đăng nhập này sẽ tự động được chọn bằng điều kiện khởi động Spring Cloud GCP Trace.
Trước tiên, hãy đăng nhập:
$ gcloud auth application-default login
You are running on a Google Compute Engine virtual machine.
The service credentials associated with this virtual machine
will automatically be used by Application Default
Credentials, so it is not necessary to use this command.
If you decide to proceed anyway, your user credentials may be visible
to others with access to this virtual machine. Are you sure you want
to authenticate with your personal account?
Do you want to continue (Y/n)? Y
Go to the following link in your browser:
https://accounts.google.com/o/oauth2/auth...
Enter verification code: ...
Nhấp vào đường liên kết để mở một thẻ trình duyệt mới, sau đó nhấp vào Cho phép
Sau đó, sao chép và dán mã xác minh trở lại Cloud Shell và nhấn Enter. Bạn sẽ thấy:
Credentials saved to file: [/tmp/tmp.jm9bnQ4R9Q/application_default_credentials.json]
These credentials will be used by any library that requests
Application Default Credentials.
Thêm dấu vết Spring Cloud GCP
Trong dịch vụ này, chúng tôi đã sử dụng Spring Cloud Sleuth để theo dõi. Hãy thêm điều kiện khởi động của Spring Cloud GCP Trace để chuyển tiếp dữ liệu đến Cloud Trace.
Thêm phần phụ thuộc Spring Cloud GCP Trace:
pom.xml
<project>
...
<dependencies>
...
<!-- Add Cloud Trace Starter -->
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>spring-cloud-gcp-starter-trace</artifactId>
</dependency>
</dependencies>
...
</project>
Theo mặc định, Spring Cloud Sleuth không lấy mẫu mọi yêu cầu. Để quá trình thử nghiệm của chúng tôi dễ dàng hơn một chút, hãy tăng tốc độ lấy mẫu lên 100% trong application.properties
để đảm bảo chúng tôi thấy được dữ liệu theo dõi, cũng như bỏ qua một số URL mà chúng tôi không quan tâm:
$ echo "
spring.sleuth.sampler.probability=1.0
spring.sleuth.web.skipPattern=(^cleanup.*|.+favicon.*)
" > src/main/resources/application.properties
Chạy lại ứng dụng và sử dụng Cloud Shell Web Preview để xem ứng dụng:
$ export GOOGLE_CLOUD_PROJECT=`gcloud config list --format 'value(core.project)'`
$ ./mvnw -DskipTests spring-boot:run
Theo mặc định, công cụ Theo dõi của Spring Cloud GCP Trace theo lô sẽ gửi dữ liệu theo dõi theo lô và gửi đi 10 giây một lần hoặc khi nhận được số lượng dữ liệu theo dõi tối thiểu. Thuộc tính này có thể định cấu hình và bạn có thể tham khảo tài liệu tham khảo về Dấu vết của Spring Cloud GCP để biết thêm thông tin.
Gửi yêu cầu đối với dịch vụ:
$ curl localhost:8080
Trong Cloud Console, hãy chuyển đến Hoạt động → Theo dõi → Danh sách theo dõi
Ở trên cùng, hãy thu hẹp phạm vi thời gian xuống còn 1 giờ. Tính năng Tự động tải lại được bật theo mặc định. Vì vậy, khi dữ liệu theo dõi xuất hiện, dữ liệu đó sẽ xuất hiện trong bảng điều khiển!
Dữ liệu theo dõi sẽ xuất hiện sau khoảng 30 giây.
Nhấp vào chấm xanh dương để xem thông tin chi tiết về dấu vết:
Điều đó khá đơn giản!
5. Tạo ứng dụng web khởi động mùa xuân thứ hai
Mở một phiên Cloud Shell mới bằng cách nhấp vào biểu tượng +:
Trong phiên mới, hãy tạo ứng dụng Spring Boot thứ hai:
$ curl https://start.spring.io/starter.tgz -d packaging=jar \
-d bootVersion=2.7.6 \
-d dependencies=web,lombok,cloud-gcp,distributed-tracing \
-d jvmVersion=17 \
-d type=maven-project \
-d baseDir=trace-service-two | tar -xzvf - \
&& cd trace-service-two
Tạo trình điều khiển REST mới bằng cách thêm một lớp mới:
src/main/java/com/example/demo/MeetingController.java
package com.example.demo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Random;
@RestController
@Slf4j
public class MeetingController {
Random r = new Random();
@GetMapping("/meet")
public String meeting() {
try {
log.info("meeting...");
Thread.sleep(r.nextInt(500 - 20 + 1) + 20);
} catch (InterruptedException e) {
}
return "finished meeting";
}
}
Thêm dấu vết của Spring Cloud GCP vào tệp pom.xml
pom.xml
<project>
...
<dependencies>
...
<!-- Add Cloud Trace starter -->
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>spring-cloud-gcp-starter-trace</artifactId>
</dependency>
</dependencies>
...
</project>
Định cấu hình Thám tử để lấy mẫu 100% các yêu cầu:
src/main/resources/application.properties
$ echo "
spring.sleuth.sampler.probability=1.0
spring.sleuth.web.skipPattern=(^cleanup.*|.+favicon.*)
" > src/main/resources/application.properties
Cuối cùng, bạn có thể khởi động ứng dụng Spring Boot trên cổng 8081 bằng trình bổ trợ Spring Boot:
$ export GOOGLE_CLOUD_PROJECT=`gcloud config list --format 'value(core.project)'`
$ ./mvnw -DskipTests spring-boot:run -Dspring-boot.run.jvmArguments="-Dserver.port=8081"
6. Cập nhật dịch vụ đầu tiên thành Tiêu thụ dịch vụ thứ hai
Khi bạn đang chạy trace-service-two
, hãy quay lại cửa sổ phiên hoạt động đầu tiên của Cloud Shell và sửa đổi thành trace-service-one
.
Trước tiên, hãy khởi chạy một bean RestTemplate
mới:
src/main/java/com/example/demo/DemoApplication.java
package com.example.demo;
...
import org.springframework.web.client.RestTemplate;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
public class DemoApplication {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
Trong WorkController.meeting()
, hãy gọi đến dịch vụ Cuộc họp.
src/main/java/com/example/demo/WorkController.java
package com.example.demo;
...
import org.springframework.web.client.RestTemplate;
import org.springframework.beans.factory.annotation.Autowired;
@RestController
@Slf4j
public class WorkController {
@Autowired
RestTemplate restTemplate;
public void meeting() {
String result = restTemplate.getForObject("http://localhost:8081/meet", String.class);
log.info(result);
}
...
}
Khởi động lại dịch vụ và kích hoạt điểm cuối qua dòng lệnh:
$ export GOOGLE_CLOUD_PROJECT=`gcloud config list --format 'value(core.project)'`
# The '&' places the process in the background. Bring it back to the foreground with 'fg'.
$ ./mvnw -DskipTests spring-boot:run &
$ curl localhost:8080
Trong cả hai cửa sổ phiên, bạn sẽ thấy thông điệp nhật ký với Mã theo dõi được truyền từ dịch vụ này sang dịch vụ khác.
Trong Danh sách dấu vết của Cloud Trace, bạn sẽ thấy dấu vết thứ hai:
Bạn có thể nhấp vào chấm màu xanh dương mới để xem thông tin chi tiết về dấu vết:
Bạn cũng có thể nhấp vào bất kỳ span nào trong biểu đồ này để xem thông tin chi tiết về span đó.
7. Phân phối độ trễ và Báo cáo hiệu suất
Khi bạn sử dụng Cloud Trace làm bộ nhớ dữ liệu theo dõi, Cloud Trace có thể dùng dữ liệu đó để tạo báo cáo phân bổ độ trễ. Bạn sẽ cần hơn 100 dấu vết để tạo báo cáo như sau:
Bạn có thể chạy hơn 100 yêu cầu đầu tiên đó bằng cách sử dụng lệnh hey được cài đặt sẵn trên Cloud Shell!
$ hey localhost:8080 -n 150
Ngoài ra, Cloud Trace có thể tự động phát hiện sự hồi quy hiệu suất của cùng một dịch vụ trong hai khoảng thời gian khác nhau trong Báo cáo phân tích.
8. Tóm tắt
Trong phòng thí nghiệm này, bạn đã tạo 2 dịch vụ đơn giản và thêm tính năng theo dõi phân tán bằng Spring Cloud Sleuth, đồng thời sử dụng Spring Cloud GCP để chuyển tiếp thông tin theo dõi đến Cloud Trace.
9. Xin chúc mừng!
Bạn đã học cách viết ứng dụng web App Engine đầu tiên của mình!
Tìm hiểu thêm
- Dấu vết trên đám mây: https://cloud.google.com/trace/
- Dự án Spring trên GCP: http://cloud.spring.io/spring-cloud-gcp/
- Spring trên kho lưu trữ GitHub của GCP: https://github.com/GoogleCloudPlatform/spring-cloud-gcp
- Java trên Google Cloud Platform: https://cloud.google.com/java/
Giấy phép
Tác phẩm này được cấp phép theo Giấy phép chung Ghi nhận tác giả Creative Commons 2.0.