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 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 với nhau, 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 tính năng đo từ xa 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ó Stackdriver 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. Stackdriver 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 Stackdriver Trace từ mộ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 để dùng proxy này làm điểm cuối Zipkin
- 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 theo dõi trực tiếp đến Stackdriver 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 Stackdriver 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?
Bạn đánh giá thế nào về trải nghiệm xây dựng ứng dụng web HTML/CSS?
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?
Thiết lập môi trường theo tốc độ của riêng bạn
Nếu chưa có Tài khoản Google (Gmail hoặc Google Apps), bạn phải tạo một tài khoản. Đăng nhập vào bảng điều khiển Google Cloud Platform (console.cloud.google.com) rồi tạo một dự án mới:
Hãy nhớ mã dự án, một tên duy nhất trong tất cả các dự án trên Google Cloud (tên ở trên đã được sử dụng và sẽ không hoạt động đối với bạn, xin lỗi!). Sau này trong lớp học lập trình này, chúng ta sẽ gọi nó là PROJECT_ID
.
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 của Google Cloud.
Việc thực hiện lớp học lập trình này sẽ không tốn của bạn quá vài đô la, nhưng có thể tốn nhiều 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 đó chạy (xem phần "dọn dẹp" ở 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ử miễn phí 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 Google Cloud Shell
Trên 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 đó, hãy nhấp vào "Start Cloud Shell" (Bắt đầu Cloud Shell):
Quá trình cung cấp và kết nối với môi trường chỉ mất vài phút:
Máy ảo này được trang bị tất cả các công cụ phát triển mà bạn cần. Nó cung cấp một thư mục chính có dung lượng 5 GB và chạy trên 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 trong phòng thí nghiệm này 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 mình đã được xác thực và dự án đã được đặt thành PROJECT_ID.
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: - <myaccount>@<mydomain>.com (active)
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].
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 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 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 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 chờ ngắn, bạn sẽ thấy kết quả:
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:
Bật Stackdriver Trace API
Trước tiên, bạn cần bật Stackdriver Trace API để sử dụng Stackdriver Trace nhằm lưu trữ dữ liệu dấu vết. Để bật API này, hãy chuyển đến phầ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 API này chưa được bật.
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
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 động Spring Cloud GCP Trace để chuyển tiếp dữ liệu đến Stackdriver Trace.
Thêm phần phụ thuộc Spring Cloud GCP Trace:
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 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 Stackdriver → Trace → Trace list (Danh sách dấu vết)
Ở 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, chế độ Tự động tải lại sẽ ở trạng thái bật. Vì vậy, khi dữ liệu theo dõi đế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 trong khoảng 30 giây.
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:
Thật đơn giản!
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 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 GCP Trace 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
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 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ụ Meet.
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ừ Bản 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 các thông báo 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 Stackdriver Trace, 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 chi tiết về dấu vết:
Bạn cũng có thể nhấp vào bất kỳ khoảng thời gian nào trong sơ đồ này để xem thông tin chi tiết về khoảng thời gian đó.
Khi bạn sử dụng Stackdriver Trace làm bộ nhớ dữ liệu dấu vết, 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 tình trạng giảm hiệu suất của cùng một dịch vụ trong 2 khoảng thời gian khác nhau trong Báo cáo phân tích.
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 Stackdriver Trace.
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
- Stackdriver Trace: https://cloud.google.com/trace/
- Dự án Spring trên GCP: http://cloud.spring.io/spring-cloud-gcp/
- Kho lưu trữ Spring trên GitHub của GCP: https://github.com/spring-cloud/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ả theo Creative Commons 2.0.