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

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

Thông tin về lớp học lập trình này

subjectLần cập nhật gần đây nhất: thg 2 10, 2020
account_circleTác giả: Một nhân viên của Google

1. Tổng quan

Theo dõi phân bổ là yếu tố quan trọng để có được thông tin chi tiết và khả năng quan sát đối với cấu trúc dịch vụ vi mô nhiều tầng. Khi bạn đã liên kết dịch vụ để 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 cuộc gọi đã thành công cũng như độ trễ ở mọi bước.

Trong Spring Boot, bạn có thể sử dụng Spring Cloud Sleuth để thêm khả năng theo dõi phân phối liền mạch vào ứng dụng của mình. Theo mặc định, ứng dụng này có thể chuyển tiếp dữ liệu theo dõi tới Zipkin.

Google Cloud Platform có Stackdriver Trace, 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 phải quản lý phiên bản Zipkin của riêng bạn cũng như không phải lưu trữ. Stackdriver Trace cũng có thể tạo báo cáo phân phối độ trễ và tự động phát hiện hồi quy hiệu suất.

Bạn có hai tùy chọn để sử dụng Stackdriver Trace từ ứng dụng Spring Boot:

  1. Sử dụng StackProxy 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. Bạn cũng có thể sử dụng tính năng Theo dõi dữ liệu theo dõi trên Spring Cloud (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 Stackdriver Trace.

Trong lớp học lập trình này, bạn sẽ tìm hiểu cách xây dựng ứng dụng mới Khởi động mùa xuân và sử dụng tính năng Theo dõi bằng Cloud Platform của Cloud để theo dõi được phân phối.

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 Stackdriver Trace.

Bạn cần có

  • Một dự á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 chỉnh sửa văn bản Linux tiêu chuẩn, 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?

Bạn xếp hạng trải nghiệm như thế nào khi xây dựng các ứng dụng web HTML/CSS?

Bạn đánh giá trải nghiệm sử dụng các dịch vụ Google Cloud Platform của mình 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

Nếu chưa có Tài khoản Google (Gmail hoặc Google Apps), thì bạn phải tạo một tài khoản. Đăng nhập vào bảng điều khiển của Google Cloud Platform (console.cloud.google.com) và tạo một dự án mới:

Ảnh chụp màn hình từ 2016-02-10 12:45:26.png

Hãy ghi nhớ mã dự án, một tên duy nhất trên tất cả các dự án Google Cloud (tên ở trên đã được sử dụng và sẽ không hoạt động cho bạn!). Lớp học này sẽ được gọi sau này trong lớp học lập trình này là PROJECT_ID.

Tiếp theo, bạn sẽ cần bật tính năng thanh toán trong Cloud Console để sử dụng tài nguyên của Google Cloud.

Nếu tham gia lớp học lập trình này, bạn sẽ không mất quá vài đô la, nhưng có thể sẽ hiệu quả hơn nếu bạn quyết định sử dụng nhiều tài nguyên hơn hoặc nếu bạn để các tài nguyên đó hoạt động (xem "cleanup" ở cuối tài liệu này).

Người dùng mới của Google Cloud Platform đủ điều kiện dùng thử 300 đô la dùng thử miễn phí.

Google Cloud Shell

Mặc dù Google Cloud và Kubernetes có thể hoạt động từ máy tính xách tay từ xa, nhưng trong lớp học lập trình này, chúng ta sẽ dùng Google Cloud Shell, một môi trường dòng lệnh chạy trong Cloud.

Kích hoạt Google Cloud Shell

Từ bảng điều khiển GCP, hãy nhấp vào biểu tượng Cloud Shell trên thanh công cụ trên cùng bên phải:

Sau đó nhấp vào "Start Cloud Shell":

Bạn chỉ cần dành vài phút để cấp phép và kết nối với môi trường:

Máy ảo này được tải bằng tất cả các công cụ phát triển mà bạn cần. cung cấp một thư mục gốc 5GB cố định và chạy trên Google Cloud, qua đó nâng cao đáng kể hiệu suất và khả năng xác thực mạng. Phần lớn công việc của bạn trong phòng thí nghiệm này có thể thực hiện chỉ bằng một trình duyệt hoặc Google Chromebook.

Sau khi kết nối với Cloud Shell, bạn sẽ thấy rằng bạn đã được xác thực và dự án này đã được đặt thành PROJECT_ID của bạ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

Đầu ra lệnh

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
gcloud config list project

Đầu ra lệnh

[core]
project = <PROJECT_ID>

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

gcloud config set project <PROJECT_ID>

Đầu ra lệnh

Updated property [core/project].

3. Tạo một dịch vụ REST mới cho mùa xuân

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 với Spring Initializr:

$ curl https://start.spring.io/starter.tgz -d packaging=jar \
 
-d dependencies=web,lombok,cloud-gcp,cloud-starter-sleuth \
 
-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!";
 
}
}

Bạn có thể khởi động ứng dụng Spring Spring thông thường bằng trình bổ trợ Spring Boot. Hãy bỏ qua 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 thời gian ngắn, 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ó ID theo dõi và ID khoảng:

4. Sử dụng Stackdriver Trace

Bật API Stackdriver Trace

Bạn cần bật API Stackdriver Trace trước để sử dụng Stackdriver Trace để lưu trữ dữ liệu theo dõi của bạn. Để bật API này, hãy chuyển đến Dịch vụ API → Thư viện

Tìm kiếm Stackdriver Trace

Nhấp vào Stackdriver Trace API, sau đó nhấp vào Bật nếu tùy chọn này chưa được bật.

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 lấy từ bộ khởi động Dấu vết GCP đám mây vào mùa xuâ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, sau đó nhấp vào Cho phép

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

Trong dịch vụ này, chúng tôi đã sử dụng Spring Cloud Sleuth để truy vết. Hãy thêm bộ khởi động Dấu vết GCP đám mây vào mùa xuân để chuyển tiếp dữ liệu đến Dấu vết ngăn xếp.

Thêm phần phụ thuộc Dấu vết GCP Cloud Spring:

pom.xml

<project>
  ...
 
<dependencies>
    ...
   
<!-- Add Stackdriver Trace Starter -->
   
<dependency>
     
<groupId>org.springframework.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 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 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, Spring Cloud GCP Trace gửi lô dữ liệu theo dõi và gửi dữ liệu này 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. Bạn có thể thiết lập cấu hình này và tham khảo tài liệu tham khảo về Cloud Trace GCP.

Yêu cầu dịch vụ:

$ curl localhost:8080

Trong Cloud Console, hãy chuyển đến Stackdriver TraceDanh sách dấu vết

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

Dữ liệu dấu vết sẽ hiển thị sau khoảng 30 giây.

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

Điều đó khá đơn giản!

5. Tạo Ứng dụng web mùa xuân thứ hai

Mở 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 dependencies=web,lombok,cloud-gcp,cloud-starter-sleuth \
 
-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 Trace truy cập vào pom.xml

pom.xml

<project>
  ...
 
<dependencies>
    ...
   
<!-- Add Stackdriver Trace starter -->
   
<dependency>
     
<groupId>org.springframework.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 -Dserver.port=8081

6. Cập nhật dịch vụ đầu tiên để sử dụng dịch vụ thứ hai

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 thành trace-service-one.

Trước tiên, hãy bắt đầu một hạt 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 từ tính năng Xem trước trên web:

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

Trong cả hai cửa sổ phiên, bạn sẽ thấy thông điệp nhật ký, với ID dấu vết được truyền từ dịch vụ này sang dịch vụ khác.

Trong Danh sách dấu vết ngăn xếp của Stackdriver, bạn sẽ thấy dấu vết thứ hai:

Bạn có thể nhấp vào dấu chấm màu xanh dương mới và 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ỳ khoảng nào trong sơ đồ này để xem thông tin chi tiết về khoảng.

7. &Phân phối độ trễ; Báo cáo hiệu suất

Khi bạn dùng Stackdriver Trace làm bộ nhớ dữ liệu theo dõi, Stackdriver 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 có hơn 100 dấu vết để tạo báo cáo như sau:

Ngoài ra, Stackdriver Trace có thể tự động phát hiện hồi quy hiệu suất của cùng một dịch vụ trên 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 phối 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 Stackdriver Trace.

9. Xin chúc mừng!

Bạn đã tìm hiểu 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ài liệu này được cấp phép theo Giấy phép chung Creative Commons 2.0.