Theo dõi phân tán bằng Spring Cloud Sleuth và Cloud Trace

1. Tổng quan

Tính năng theo dõi phân tán rất quan trọng để thu thập thông tin chi tiết và khả năng quan sát đối với cấu trúc nhiều tầng của các dịch vụ vi mô. Khi bạn có các lệnh gọi dịch vụ được liên kết, từ dịch vụ A đến dịch vụ B rồi đến dịch vụ C, điều quan trọng là bạn phải hiểu rằng các lệnh gọi đã thành công và độ trễ ở mỗi bước.

Trong Spring Boot, bạn có thể sử dụng Spring Cloud Sleuth để thêm liền mạch khả năng đo lường theo dấu vết phân tán vào ứng dụng của mình. Theo mặc định, nó 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ý giúp bạn lưu trữ dữ liệu theo dõi mà không cần quản lý phiên bản Zipkin hoặc bộ nhớ của riêng mình. Cloud Trace cũng có thể tạo báo cáo phân phối độ trễ và tự động phát hiện các trường hợp hiệu suất giảm.

Bạn có 2 lựa chọn để sử dụng Cloud Trace từ một ứng dụng Spring Boot:

  1. Sử dụng Stackdriver Trace Zipkin Proxy và chỉ cần định cấu hình Spring Cloud Sleuth để dùng proxy này làm điểm cuối Zipkin
  2. Hoặc sử dụng Spring Cloud GCP Trace, tích hợp liền mạch với Spring Cloud Sleuth và chuyển tiếp dữ liệu dấu vết trực tiếp đến Cloud Trace.

Trong lớp học lập trình này, bạn sẽ tìm hiểu cách tạo một ứng dụng Spring Boot mới và sử dụng Spring Cloud GCP Trace để 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 Spring Boot 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
  • Làm quen với các trình chỉnh sửa văn bản tiêu chuẩn của Linux, chẳng hạn như Vim, EMAC hoặc Nano

Bạn sẽ sử dụng hướng dẫn này như thế nào?

Chỉ đọc Đọc và hoàn thành bài tập

Bạn đánh giá thế nào về trải nghiệm xây dựng ứng dụng web HTML/CSS?

Người mới bắt đầu Trung cấp Thành thạo

Bạn đánh giá thế nào về trải nghiệm sử dụng các dịch vụ của Google Cloud Platform?

Người mới bắt đầu Trung cấp Thành thạo

2. Thiết lập và yêu cầu

Thiết lập môi trường theo tốc độ của riêng bạn

  1. Đăng nhập vào Google Cloud Console rồi tạo một dự án mới hoặc sử dụng lại một 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.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • 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ự mà các API của Google không sử dụng. Bạn luôn có thể cập nhật thông tin này.
  • Mã dự án là mã duy nhất trên tất cả các dự án trên Google Cloud và không thể thay đổi (bạn không thể thay đổi mã này sau khi đã đặt). Cloud Console sẽ tự động tạo một chuỗi duy nhất; thường thì bạn không cần quan tâm đến chuỗi này. Trong hầu hết các lớp học lập trình, bạn sẽ cần tham chiếu đến Mã dự án (thường được xác định là PROJECT_ID). Nếu không thích mã nhận dạng được tạo, bạn có thể tạo một mã nhận dạng ngẫu nhiên khác. Hoặc bạn có thể thử tên người dùng của riêng mình để xem tên đó có được chấp nhận hay không. Bạn không thể thay đổi tên này sau bước này và tên này sẽ tồn tại trong suốt thời gian của dự án.
  • Để bạn nắm được thông tin, có một giá trị thứ ba là Số dự án mà một số API sử dụng. Tìm hiểu thêm về cả 3 giá trị này trong tài liệu.
  1. Tiếp theo, bạn cần bật tính năng thanh toán trong Cloud Console để sử dụng các tài nguyên/API trên đám mây. Việc thực hiện lớp học lập trình này sẽ không tốn nhiều chi phí, nếu có. Để tắt các tài nguyên nhằm tránh bị tính phí ngoài phạm vi hướng dẫn này, bạn có thể xoá các tài nguyê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í trị giá 300 USD.

Google Cloud Shell

Mặc dù bạn có thể vận hành Google Cloud và Kubernetes từ xa trên 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

  1. Trong Cloud Console, hãy nhấp vào Kích hoạt Cloud Shell 853e55310c205094.png.

55efc1aaa7a4d3ad.png

Nếu đây là lần đầu tiên bạ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 thấy màn hình trung gian, hãy nhấp vào Tiếp tục.

9c92662c6a846a5c.png

Quá trình cung cấp và kết nối với Cloud Shell chỉ mất vài giây.

9f0e51b578fecce5.png

Máy ảo này được trang bị tất cả các công cụ phát triển cần thiết. Nền tảng này cung cấp một thư mục chính có dung lượng 5 GB và chạy trong Google Cloud, giúp tăng cường đáng kể hiệu suất mạng và hoạt động xác thực. Bạn có thể thực hiện hầu hết, nếu không muốn nói là tất cả, công việc của mình trong lớp học lập trình này bằng trình duyệt.

Sau khi kết nối với Cloud Shell, bạn sẽ thấy rằng mình đã được xác thực và dự án được đặt thành mã dự án của bạn.

  1. Chạy lệnh sau trong Cloud Shell để xác nhận rằng bạn đã được xác thực:
gcloud auth list

Đầu ra của lệnh

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. 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

Đầu ra của lệnh

[core]
project = <PROJECT_ID>

Nếu không, bạn có thể đặt nó bằng lệnh sau:

gcloud config set project <PROJECT_ID>

Đầu ra của lệnh

Updated property [core/project].

3. Tạo một Dịch vụ REST Spring Boot mới

Sau khi Cloud Shell khởi chạy, bạn có thể sử dụng dòng lệnh để tạo một ứng dụng Spring Boot mới bằng Spring Initializr:

$ 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 một bộ đ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ó đúng phiên bản JVM 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 bài kiểm tra 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 3a9b40fafa650b2b.png trong thanh công cụ Cloud Shell rồi chọn xem trước trên cổng 8080.

3aca52f76c6c22a3.png

Sau một thời gian chờ ngắn, bạn sẽ thấy kết quả:

6793a3339447cbb5.png

Trong Cloud Shell, bạn cũng sẽ thấy các thông báo nhật ký có mã nhận dạng dấu vết và mã nhận dạng khoảng thời gian:

18d597c388de1ba.png

4. Sử dụng Cloud Trace

Bật Cloud Trace API

Trước tiên, bạn phải bật Cloud Trace API thì mới có thể dùng Cloud Trace để lưu trữ dữ liệu dấu vết. Để bật API, hãy thực thi:

$ gcloud services enable cloudtrace.googleapis.com

Thiết lập thông tin xác thực mặc định của ứng dụng

Đối với lớp học lập trình này, bạn cần định cấu hình thông tin đăng nhập mặc định của ứng dụng. Thông tin đăng nhập này sẽ được trình khởi động Spring Cloud GCP Trace tự động chọn.

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, rồi nhấp vào Cho phép

85f500de6f5dc0a8.png

Sau đó, sao chép và dán mã xác minh vào Cloud Shell rồi nhấn phím 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 Spring Cloud GCP Trace

Trong dịch vụ này, chúng tôi đã sử dụng Spring Cloud Sleuth để theo dõi. Hãy thêm trình khởi chạy 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. Để việc kiểm thử trở nên dễ dàng hơn, hãy tăng tốc độ lấy mẫu lên 100% trong application.properties để đảm bảo chúng ta thấy dữ liệu dấu vết, cũng như bỏ qua một số URL mà chúng ta 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 tính năng Xem trước trên web của Cloud Shell để xem ứng dụng:

$ export GOOGLE_CLOUD_PROJECT=`gcloud config list --format 'value(core.project)'`
$ ./mvnw -DskipTests spring-boot:run

Theo mặc định, Spring Cloud GCP Trace sẽ phân lô dữ liệu theo dõi và gửi dữ liệu đó đi sau mỗi 10 giây hoặc khi nhận được số lượng dữ liệu theo dõi tối thiểu. Bạn có thể định cấu hình và tham khảo tài liệu tham khảo về Spring Cloud GCP Trace để biết thêm thông tin.

Đưa ra yêu cầu cho dịch vụ:

$ curl localhost:8080

Trong Cloud Console, hãy chuyển đến Operations (Hoạt động) → Trace (Dấu vết) → Trace list (Danh sách dấu vết)

be48cb0f99b5f7c2.png

Ở trên cùng, hãy thu hẹp phạm vi thời gian xuống còn 1 giờ. Theo mặc định, tính năng Tự động nạp tiền sẽ ở trạng thái bật. Vì vậy, khi dữ liệu dấu vết đến, dữ liệu đó sẽ xuất hiện trong bảng điều khiển!

3522eef823df39d8.png

Dữ liệu theo dõi sẽ xuất hiện trong khoảng 30 giây.

9628f6e1d2e75b05.png

Nhấp vào dấu chấm màu xanh dương để xem thông tin chi tiết về dấu vết:

ba9051a8d4f3e725.png

Việc đó khá đơn giản!

5. Tạo Ứng dụng web Spring Boot thứ hai

Mở một phiên Cloud Shell mới bằng cách nhấp vào biểu tượng +:

9799bee5fea95aa6.png

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 một bộ đ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 Spring Cloud GCP Trace vào 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 Sleuth để lấy mẫu 100% 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 để sử dụng Dịch vụ thứ hai

Trong khi bạn đang chạy trace-service-two, hãy quay lại cửa sổ phiên Cloud Shell đầu tiên và sửa đổi trace-service-one.

Trước tiên, hãy khởi tạo 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ụ Meeting.

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 từ 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 các thông báo nhật ký, trong đó 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:

13490977f1638702.png

Bạn có thể nhấp vào dấu chấm màu xanh dương mới và xem chi tiết về dấu vết:

ca69ef9cdd13d4aa.png

Bạn cũng có thể nhấp vào bất kỳ khoảng thời gian nào trong biểu đồ này để xem thông tin chi tiết về khoảng thời gian đó.

7. Báo cáo về hiệu suất và mức phân phối độ trễ

Khi bạn sử dụng Cloud Trace làm bộ nhớ dữ liệu dấu vết, Cloud Trace có thể sử dụng dữ liệu này để tạo báo cáo phân phối độ trễ. Bạn cần hơn 100 dấu vết để tạo báo cáo như sau:

c8713f3d9e51dc25.png

Bạn có thể chạy 100 yêu cầu đầu tiên bằng hey. Công cụ này đượ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ự suy giảm 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 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 cách viết ứng dụng web đầu tiên của mình bằng App Engine!

Tìm hiểu thêm

Giấy phép

Tác phẩm này được cấp phép theo giấy phép Ghi công theo Creative Commons 2.0 Chung.