1. ภาพรวม
การติดตามแบบกระจายมีความสำคัญต่อการได้รับข้อมูลเชิงลึกและความสามารถในการสังเกตการณ์สถาปัตยกรรมไมโครเซอร์วิสแบบหลายระดับ เมื่อคุณมีการเรียกบริการแบบลูกโซ่จากบริการหนึ่งไปยังอีกบริการหนึ่ง เช่น จากบริการ A ไปยังบริการ B และไปยังบริการ C คุณควรทราบว่าการเรียกสำเร็จหรือไม่ รวมถึงเวลาในการตอบสนองในแต่ละขั้นตอน
ใน Spring Boot คุณสามารถใช้ Spring Cloud Sleuth เพื่อเพิ่มการตรวจสอบการติดตามแบบกระจายไปยังแอปพลิเคชันได้อย่างราบรื่น โดยค่าเริ่มต้น จะส่งต่อข้อมูลการติดตามไปยัง Zipkin ได้
Google Cloud Platform มี Cloud Trace ซึ่งเป็นบริการที่มีการจัดการที่ช่วยให้คุณจัดเก็บข้อมูลการติดตามได้โดยไม่ต้องจัดการอินสแตนซ์หรือพื้นที่เก็บข้อมูล Zipkin ของคุณเอง นอกจากนี้ Cloud Trace ยังสร้างรายงานการแจกแจงเวลาในการตอบสนองและตรวจหาการถดถอยของประสิทธิภาพโดยอัตโนมัติได้ด้วย
คุณมี 2 ตัวเลือกในการใช้ Cloud Trace จากแอปพลิเคชัน Spring Boot ดังนี้
- ใช้ Stackdriver Trace Zipkin Proxy และกำหนดค่า Spring Cloud Sleuth ให้ใช้พร็อกซีนี้เป็นปลายทาง Zipkin
- หรือใช้ Spring Cloud GCP Trace ซึ่งผสานรวมกับ Spring Cloud Sleuth ได้อย่างราบรื่นและส่งต่อข้อมูลการติดตามไปยัง Cloud Trace โดยตรง
ในโค้ดแล็บนี้ คุณจะได้เรียนรู้วิธีสร้างแอปพลิเคชัน Spring Boot ใหม่และใช้ Spring Cloud GCP Trace สำหรับการติดตามแบบกระจาย
สิ่งที่คุณจะได้เรียนรู้
- วิธีสร้างแอปพลิเคชัน Java ของ Spring Boot และกำหนดค่า Cloud Trace
สิ่งที่คุณต้องมี
- โปรเจ็กต์ Google Cloud Platform
- เบราว์เซอร์ เช่น Chrome หรือ Firefox
- คุ้นเคยกับโปรแกรมแก้ไขข้อความมาตรฐานของ Linux เช่น Vim, EMAC หรือ Nano
คุณจะใช้บทแนะนำนี้อย่างไร
คุณจะให้คะแนนประสบการณ์ในการสร้างเว็บแอป HTML/CSS เท่าใด
คุณจะให้คะแนนประสบการณ์การใช้บริการ Google Cloud Platform เท่าใด
2. การตั้งค่าและข้อกำหนด
การตั้งค่าสภาพแวดล้อมแบบเรียนรู้ด้วยตนเอง
- ลงชื่อเข้าใช้ Google Cloud Console แล้วสร้างโปรเจ็กต์ใหม่หรือใช้โปรเจ็กต์ที่มีอยู่ซ้ำ หากยังไม่มีบัญชี Gmail หรือ Google Workspace คุณต้องสร้างบัญชี
- ชื่อโปรเจ็กต์คือชื่อที่แสดงสำหรับผู้เข้าร่วมโปรเจ็กต์นี้ ซึ่งเป็นสตริงอักขระที่ Google APIs ไม่ได้ใช้ คุณอัปเดตได้ทุกเมื่อ
- รหัสโปรเจ็กต์จะไม่ซ้ำกันในโปรเจ็กต์ Google Cloud ทั้งหมดและเปลี่ยนแปลงไม่ได้ (เปลี่ยนไม่ได้หลังจากตั้งค่าแล้ว) Cloud Console จะสร้างสตริงที่ไม่ซ้ำกันโดยอัตโนมัติ ซึ่งโดยปกติแล้วคุณไม่จำเป็นต้องสนใจว่าสตริงนั้นคืออะไร ใน Codelab ส่วนใหญ่ คุณจะต้องอ้างอิงรหัสโปรเจ็กต์ (โดยทั่วไปจะระบุเป็น
PROJECT_ID) หากไม่ชอบรหัสที่สร้างขึ้น คุณอาจสร้างรหัสแบบสุ่มอีกรหัสหนึ่งได้ หรือคุณอาจลองใช้ชื่อของคุณเองและดูว่ามีชื่อนั้นหรือไม่ คุณจะเปลี่ยนแปลงรหัสนี้หลังจากขั้นตอนนี้ไม่ได้ และรหัสจะคงอยู่ตลอดระยะเวลาของโปรเจ็กต์ - โปรดทราบว่ายังมีค่าที่ 3 ซึ่งคือหมายเลขโปรเจ็กต์ที่ API บางตัวใช้ ดูข้อมูลเพิ่มเติมเกี่ยวกับค่าทั้ง 3 นี้ได้ในเอกสารประกอบ
- จากนั้นคุณจะต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากร/API ของ Cloud การทำตาม Codelab นี้จะไม่มีค่าใช้จ่ายมากนัก หรืออาจไม่มีค่าใช้จ่ายเลย หากต้องการปิดทรัพยากรเพื่อหลีกเลี่ยงการเรียกเก็บเงินนอกเหนือจากบทแนะนำนี้ คุณสามารถลบทรัพยากรที่สร้างขึ้นหรือลบโปรเจ็กต์ได้ ผู้ใช้ Google Cloud รายใหม่มีสิทธิ์เข้าร่วมโปรแกรมช่วงทดลองใช้ฟรีมูลค่า$300 USD
Google Cloud Shell
แม้ว่าคุณจะใช้งาน Google Cloud และ Kubernetes จากแล็ปท็อประยะไกลได้ แต่ใน Codelab นี้เราจะใช้ Google Cloud Shell ซึ่งเป็นสภาพแวดล้อมบรรทัดคำสั่งที่ทำงานในระบบคลาวด์
เปิดใช้งาน Cloud Shell
- จาก Cloud Console ให้คลิกเปิดใช้งาน Cloud Shell
หากคุณเริ่มใช้ Cloud Shell เป็นครั้งแรก คุณจะเห็นหน้าจอระดับกลางที่อธิบายว่า Cloud Shell คืออะไร หากเห็นหน้าจอระดับกลาง ให้คลิกต่อไป
การจัดสรรและเชื่อมต่อกับ Cloud Shell จะใช้เวลาไม่นาน
เครื่องเสมือนนี้โหลดเครื่องมือพัฒนาซอฟต์แวร์ทั้งหมดที่จำเป็นไว้แล้ว โดยมีไดเรกทอรีหลักแบบถาวรขนาด 5 GB และทำงานใน Google Cloud ซึ่งช่วยเพิ่มประสิทธิภาพเครือข่ายและการตรวจสอบสิทธิ์ได้อย่างมาก คุณสามารถทำงานส่วนใหญ่หรือทั้งหมดในโค้ดแล็บนี้ได้ด้วยเบราว์เซอร์
เมื่อเชื่อมต่อกับ Cloud Shell แล้ว คุณควรเห็นว่าคุณได้รับการตรวจสอบสิทธิ์และระบบได้ตั้งค่าโปรเจ็กต์เป็นรหัสโปรเจ็กต์ของคุณ
- เรียกใช้คำสั่งต่อไปนี้ใน Cloud Shell เพื่อยืนยันว่าคุณได้รับการตรวจสอบสิทธิ์แล้ว
gcloud auth list
เอาต์พุตของคำสั่ง
Credentialed Accounts
ACTIVE ACCOUNT
* <my_account>@<my_domain.com>
To set the active account, run:
$ gcloud config set account `ACCOUNT`
- เรียกใช้คำสั่งต่อไปนี้ใน Cloud Shell เพื่อยืนยันว่าคำสั่ง gcloud รู้จักโปรเจ็กต์ของคุณ
gcloud config list project
เอาต์พุตของคำสั่ง
[core] project = <PROJECT_ID>
หากไม่ได้ตั้งค่าไว้ คุณตั้งค่าได้ด้วยคำสั่งนี้
gcloud config set project <PROJECT_ID>
เอาต์พุตของคำสั่ง
Updated property [core/project].
3. สร้างบริการ REST ของ Spring Boot ใหม่
หลังจากเปิดใช้ Cloud Shell แล้ว คุณสามารถใช้บรรทัดคำสั่งเพื่อสร้างแอปพลิเคชัน Spring Boot ใหม่ด้วย 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
สร้างตัวควบคุม REST ใหม่โดยเพิ่มคลาสใหม่
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!";
}
}
ตรวจสอบว่าคุณมี JVM เวอร์ชันที่ถูกต้องสำหรับแอปพลิเคชัน
$ export JAVA_HOME=/usr/lib/jvm/java-1.17.0-openjdk-amd64
คุณสามารถเริ่มแอปพลิเคชัน Spring Boot ได้ตามปกติด้วยปลั๊กอิน Spring Boot มาข้ามการทดสอบสำหรับห้องทดลองนี้กัน
$ ./mvnw -DskipTests spring-boot:run
เมื่อแอปพลิเคชันเริ่มทำงานแล้ว ให้คลิกไอคอนแสดงตัวอย่างเว็บ 
หลังจากรอสักครู่ คุณจะเห็นผลลัพธ์ดังนี้
ใน Cloud Shell คุณควรเห็นข้อความบันทึกที่มีรหัสการติดตามและรหัสช่วงด้วย
4. การใช้ Cloud Trace
เปิดใช้ Cloud Trace API
คุณต้องเปิดใช้ Cloud Trace API ก่อนจึงจะใช้ Cloud Trace เพื่อจัดเก็บข้อมูลการติดตามได้ หากต้องการเปิดใช้ API ให้ดำเนินการดังนี้
$ gcloud services enable cloudtrace.googleapis.com
ตั้งค่าข้อมูลรับรองเริ่มต้นของแอปพลิเคชัน
สำหรับ Lab นี้ คุณจะต้องกำหนดค่าข้อมูลเข้าสู่ระบบเริ่มต้นของแอปพลิเคชัน Spring Cloud GCP Trace starter จะเลือกข้อมูลเข้าสู่ระบบนี้โดยอัตโนมัติ
ก่อนอื่น ให้เข้าสู่ระบบโดยทำดังนี้
$ 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: ...
คลิกลิงก์เพื่อเปิดแท็บเบราว์เซอร์ใหม่ แล้วคลิกอนุญาต
จากนั้นคัดลอกและวางรหัสยืนยันกลับลงใน Cloud Shell แล้วกด Enter คุณควรเห็นข้อมูลต่อไปนี้
Credentials saved to file: [/tmp/tmp.jm9bnQ4R9Q/application_default_credentials.json]
These credentials will be used by any library that requests
Application Default Credentials.
เพิ่ม Spring Cloud GCP Trace
ในบริการนี้ เราใช้ Spring Cloud Sleuth สำหรับการติดตามอยู่แล้ว มาเพิ่ม Spring Cloud GCP Trace Starter เพื่อส่งต่อข้อมูลไปยัง Cloud Trace กัน
เพิ่มการอ้างอิง 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>
โดยค่าเริ่มต้น Spring Cloud Sleuth จะไม่สุ่มตัวอย่างทุกคำขอ เพื่อช่วยให้การทดสอบง่ายขึ้นเล็กน้อย ให้เพิ่มอัตราการสุ่มตัวอย่างเป็น 100% ใน application.properties เพื่อให้เราเห็นข้อมูลการติดตาม รวมถึงละเว้น URL บางรายการที่เราไม่สนใจ
$ echo "
spring.sleuth.sampler.probability=1.0
spring.sleuth.web.skipPattern=(^cleanup.*|.+favicon.*)
" > src/main/resources/application.properties
เรียกใช้แอปพลิเคชันอีกครั้ง แล้วใช้ตัวอย่างเว็บของ Cloud Shell เพื่อดูแอปพลิเคชัน
$ export GOOGLE_CLOUD_PROJECT=`gcloud config list --format 'value(core.project)'`
$ ./mvnw -DskipTests spring-boot:run
โดยค่าเริ่มต้น Spring Cloud GCP Trace จะจัดกลุ่มข้อมูลการติดตามและส่งออกทุกๆ 10 วินาที หรือเมื่อได้รับข้อมูลการติดตามขั้นต่ำ คุณกำหนดค่าได้และดูข้อมูลเพิ่มเติมได้ในเอกสารอ้างอิงการติดตาม Spring Cloud GCP
ส่งคำขอไปยังบริการ
$ curl localhost:8080
ใน Cloud Console ให้ไปที่การดำเนินการ → Trace → รายการ Trace
ที่ด้านบน ให้จำกัดช่วงเวลาเป็น 1 ชั่วโมง โดยค่าเริ่มต้น Auto Reload จะเปิดอยู่ ดังนั้นเมื่อข้อมูลการติดตามมาถึง ข้อมูลดังกล่าวควรแสดงในคอนโซล
ข้อมูลการติดตามควรปรากฏในเวลาประมาณ 30 วินาที
คลิกจุดสีน้ำเงินเพื่อดูรายละเอียดการติดตาม
ง่ายมากเลยใช่ไหม
5. สร้างเว็บแอปพลิเคชัน Spring Boot ที่ 2
เปิดเซสชัน Cloud Shell ใหม่โดยคลิกไอคอน +
ในเซสชันใหม่ ให้สร้างแอปพลิเคชัน Spring Boot ที่ 2 โดยทำดังนี้
$ 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
สร้างตัวควบคุม REST ใหม่โดยเพิ่มคลาสใหม่
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";
}
}
เพิ่ม Spring Cloud GCP Trace ลงใน 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>
กำหนดค่า Sleuth ให้สุ่มตัวอย่างคำขอ 100% ดังนี้
src/main/resources/application.properties
$ echo "
spring.sleuth.sampler.probability=1.0
spring.sleuth.web.skipPattern=(^cleanup.*|.+favicon.*)
" > src/main/resources/application.properties
สุดท้าย คุณสามารถเริ่มแอปพลิเคชัน Spring Boot ในพอร์ต 8081 ด้วยปลั๊กอิน 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. อัปเดตบริการแรกเพื่อใช้บริการที่สอง
ขณะที่ trace-service-two ทำงานอยู่ ให้กลับไปที่หน้าต่างเซสชัน Cloud Shell แรกและแก้ไข trace-service-one
ก่อนอื่น ให้เริ่มต้น RestTemplate ใหม่
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);
}
}
ใน WorkController.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("https://localhost:8081/meet", String.class);
log.info(result);
}
...
}
เริ่มบริการอีกครั้งและทริกเกอร์ปลายทางจากบรรทัดคำสั่ง
$ 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
ในทั้ง 2 หน้าต่างเซสชัน คุณควรเห็นข้อความบันทึกที่มีการส่งต่อรหัสการติดตามจากบริการหนึ่งไปยังอีกบริการหนึ่ง
ในรายการการติดตามของ Cloud Trace คุณควรเห็นการติดตามที่ 2 ดังนี้
คุณคลิกจุดสีน้ำเงินใหม่เพื่อดูรายละเอียดการติดตามได้
นอกจากนี้ คุณยังคลิกช่วงใดก็ได้ในไดอะแกรมนี้เพื่อดูรายละเอียดช่วงได้ด้วย
7. รายงานการกระจายเวลาในการตอบสนองและประสิทธิภาพ
เมื่อใช้ Cloud Trace เป็นที่เก็บข้อมูลการติดตาม Cloud Trace จะใช้ข้อมูลเพื่อสร้างรายงานการกระจายเวลาในการตอบสนองได้ คุณจะต้องมีร่องรอยมากกว่า 100 รายการจึงจะสร้างรายงานเช่นนี้ได้
คุณเรียกใช้คำขอ 100 รายการแรกได้โดยใช้ hey ซึ่งติดตั้งไว้ล่วงหน้าใน Cloud Shell
$ hey localhost:8080 -n 150
นอกจากนี้ Cloud Trace ยังตรวจหาการถดถอยของประสิทธิภาพของบริการเดียวกันโดยอัตโนมัติในช่วงเวลา 2 ช่วงที่แตกต่างกันได้ในรายงานการวิเคราะห์
8. สรุป
ในแล็บนี้ คุณได้สร้างบริการอย่างง่าย 2 รายการและเพิ่มการติดตามแบบกระจายด้วย Spring Cloud Sleuth รวมถึงใช้ Spring Cloud GCP เพื่อส่งต่อข้อมูลการติดตามไปยัง Cloud Trace
9. ยินดีด้วย
คุณได้เรียนรู้วิธีเขียนเว็บแอปพลิเคชัน App Engine แรกแล้ว
ดูข้อมูลเพิ่มเติม
- Cloud Trace: https://cloud.google.com/trace/
- โปรเจ็กต์ Spring บน GCP: https://cloud.spring.io/spring-cloud-gcp/
- ที่เก็บ Spring บน GCP ใน GitHub: https://github.com/GoogleCloudPlatform/spring-cloud-gcp
- Java ใน Google Cloud Platform: https://cloud.google.com/java/
ใบอนุญาต
ผลงานนี้ได้รับอนุญาตภายใต้สัญญาอนุญาตครีเอทีฟคอมมอนส์สำหรับยอมรับสิทธิของผู้สร้าง (Creative Commons Attribution License) 2.0 แบบทั่วไป


















