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 đó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:

  1. 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
  2. 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?

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

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

Người mới tập Trung cấp Thành thạo

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?

Người mới tập 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 tiến độ riêng

  1. Đă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.

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ự 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.
  1. 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

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

55efc1aaa7a4d3ad.pngS

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.

9c92662c6a846a5c.pngS

Quá trình cấp phép và kết nối với Cloud Shell chỉ mất vài phút.

9f0e51b578fecce5.pngs

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.

  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

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`
  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

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 3a9b40fafa650b2b.png.trong thanh công cụ Cloud Shell rồi chọn xem trước trên cổng 8080.

3aca52f76c6c22a3.pngS

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

6793a3339447cbb5.pngS

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:

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 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

85f500de6f5dc0a8.png.

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 độngTheo dõiDanh sách theo dõi

be48cb0f99b5f7c2.png

Ở 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!

3522eef823df39d8.pngs

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

9628f6e1d2e75b05.pngS

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

ba9051a8d4f3e725.png

Đ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 +:

9799bee5fea95aa6.pngS

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:

13490977f1638702.pngS

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:

ca69ef9cdd13d4aa.png

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:

c8713f3d9e51dc25.png

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

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.