1. סקירה כללית
מעקב מבוזר חשוב כדי לקבל תובנות ולשפר את יכולת הצפייה בארכיטקטורת מיקרו-שירותים מרובת-שכבות. כשמשלבים קריאות משירות לשירות, משירות א' לשירות ב' לשירות ג', חשוב להבין שהקריאות בוצעו בהצלחה וגם את זמן האחזור בכל שלב.
ב-Spring Boot, אפשר להשתמש ב-Spring Cloud Sleuth כדי להוסיף בצורה חלקה את אינסטרומנטציית המעקב המבוזר לאפליקציה. כברירת מחדל, הוא יכול להעביר את נתוני המעקב ל-Zipkin.
ב-Google Cloud Platform יש את Cloud Trace, שירות מנוהל שמאפשר לכם לאחסן נתוני מעקב בלי שתצטרכו לנהל את מופע Zipkin או את האחסון שלכם. Cloud Trace יכול גם ליצור דוחות על חלוקת זמן האחזור ולזהות באופן אוטומטי ירידה בביצועים.
יש שתי אפשרויות לשימוש ב-Cloud Trace מאפליקציית Spring Boot:
- משתמשים ב-Stackdriver Trace Zipkin Proxy ומגדירים את Spring Cloud Sleuth כך שישתמש ב-proxy הזה כנקודת הקצה של Zipkin
- אפשר גם להשתמש ב-Spring Cloud GCP Trace, שמשתלב בצורה חלקה עם Spring Cloud Sleuth ומעביר את נתוני המעקב ישירות אל Cloud Trace.
ב-Codelab הזה תלמדו איך ליצור אפליקציית Spring Boot חדשה ולהשתמש ב-Spring Cloud GCP Trace למעקב מבוזר.
מה תלמדו
- איך יוצרים אפליקציית Spring Boot Java ומגדירים את Cloud Trace.
מה תצטרכו
- פרויקט ב-Google Cloud Platform
- דפדפן, כמו Chrome או Firefox
- היכרות עם כלים לעריכת טקסט של Linux, כמו Vim, EMACs או Nano
איך תשתמש במדריך הזה?
מה מידת שביעות הרצון שלך מחוויית השימוש ב-HTML/CSS ליצירת אפליקציות אינטרנט?
איזה דירוג מגיע לדעתך לחוויית השימוש שלך בשירותים של Google Cloud Platform?
2. הגדרה ודרישות
הגדרת סביבה בקצב אישי
- נכנסים ל-מסוף Google Cloud ויוצרים פרויקט חדש או משתמשים בפרויקט קיים. אם עדיין אין לכם חשבון Gmail או Google Workspace, אתם צריכים ליצור חשבון.



- שם הפרויקט הוא השם המוצג של הפרויקט הזה למשתתפים. זו מחרוזת תווים שלא נמצאת בשימוש ב-Google APIs. תמיד אפשר לעדכן את המיקום.
- מזהה הפרויקט הוא ייחודי לכל הפרויקטים ב-Google Cloud ואי אפשר לשנות אותו אחרי שהוא מוגדר. מסוף Cloud יוצר באופן אוטומטי מחרוזת ייחודית, ובדרך כלל לא צריך לדעת מה היא. ברוב ה-Codelabs, תצטרכו להפנות למזהה הפרויקט (בדרך כלל מסומן כ-
PROJECT_ID). אם אתם לא אוהבים את המזהה שנוצר, אתם יכולים ליצור מזהה אקראי אחר. אפשר גם לנסות שם משתמש משלכם ולבדוק אם הוא זמין. אי אפשר לשנות את ההגדרה הזו אחרי השלב הזה, והיא תישאר לאורך הפרויקט. - לידיעתכם, יש ערך שלישי, מספר פרויקט, שחלק מממשקי ה-API משתמשים בו. במאמרי העזרה מפורט מידע נוסף על שלושת הערכים האלה.
- בשלב הבא, תצטרכו להפעיל את החיוב במסוף Cloud כדי להשתמש במשאבי Cloud או בממשקי API של Cloud. השלמת ה-codelab הזה לא תעלה לכם הרבה, אם בכלל. כדי להשבית את המשאבים ולמנוע חיובים נוספים אחרי שתסיימו את המדריך הזה, תוכלו למחוק את המשאבים שיצרתם או למחוק את הפרויקט. משתמשים חדשים ב-Google Cloud זכאים לתוכנית תקופת ניסיון בחינם בשווי 300$.
Google Cloud Shell
אפשר להפעיל את Google Cloud ואת Kubernetes מרחוק מהמחשב הנייד, אבל בסדנת הקוד הזו נשתמש ב-Google Cloud Shell, סביבת שורת פקודה שפועלת בענן.
הפעלת Cloud Shell
- ב-Cloud Console, לוחצים על Activate Cloud Shell
.

אם זו הפעם הראשונה שאתם מפעילים את Cloud Shell, יוצג לכם מסך ביניים עם תיאור של השירות. אם הוצג לכם מסך ביניים, לחצו על המשך.

הקצאת המשאבים והחיבור ל-Cloud Shell נמשכים רק כמה רגעים.

המכונה הווירטואלית הזו כוללת את כל הכלים הדרושים למפתחים. יש בה ספריית בית בנפח מתמיד של 5GB והיא פועלת ב-Google Cloud, מה שמשפר מאוד את הביצועים והאימות ברשת. אפשר לבצע את רוב העבודה ב-codelab הזה, אם לא את כולה, באמצעות דפדפן.
אחרי שמתחברים ל-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 ובוחרים באפשרות תצוגה מקדימה ביציאה 8080.

אחרי המתנה קצרה, התוצאה אמורה להופיע:

ב-Cloud Shell אמורות להופיע גם הודעות היומן עם מזהה המעקב ומזהה הטווח:

4. שימוש ב-Cloud Trace
הפעלה של Cloud Trace API
כדי להשתמש ב-Cloud Trace לאחסון נתוני העקבות, צריך קודם להפעיל את Cloud Trace API. כדי להפעיל את ה-API, מריצים את הפקודה:
$ gcloud services enable cloudtrace.googleapis.com
הגדרת Application Default Credential
כדי לבצע את ה-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 Trace.
שליחת בקשה לשירות:
$ curl localhost:8080
ב-Cloud Console, עוברים אל Operations (פעולות) → Trace (מעקב) → Trace list (רשימת מעקב).

בחלק העליון, מצמצמים את טווח הזמן לשעה אחת. כברירת מחדל, האפשרות הוספה אוטומטית של כסף מופעלת. לכן, כשהנתונים של המעקב מגיעים, הם אמורים להופיע במסוף.

נתוני העקבות אמורים להופיע תוך כ-30 שניות.

לוחצים על הנקודה הכחולה כדי לראות את פרטי העקבות:

זה היה די פשוט!
5. יצירת אפליקציית אינטרנט שנייה של Spring Boot
פותחים סשן חדש ב-Cloud Shell על ידי לחיצה על הסמל +:

בסשן החדש, יוצרים את אפליקציית 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-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.
קודם מאתחלים bean חדש של 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("http://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
בשני חלונות הסשן אמורות להופיע הודעות היומן, עם Trace ID שמועבר משירות אחד לשני.
ברשימת המעקב של Cloud Trace, אמור להופיע המעקב השני:

אפשר ללחוץ על הנקודה הכחולה החדשה ולראות את פרטי העקבות:

אפשר גם ללחוץ על כל יחידה לוגית למעקב בתרשים הזה כדי לראות את פרטי היחידה הלוגית למעקב.
7. דוח ביצועים ודוח על חלוקת זמן האחזור
כשמשתמשים ב-Cloud Trace בתור מאגר נתוני המעקב, המערכת יכולה להשתמש בנתונים כדי ליצור דוח על התפלגות זמן האחזור. כדי ליצור דוח כזה, צריך יותר מ-100 עקבות:

אפשר להריץ את 100 הבקשות הראשונות באמצעות hey, שמותקן מראש ב-Cloud Shell.
$ hey localhost:8080 -n 150
בנוסף, Cloud Trace יכול לזהות באופן אוטומטי נסיגה בביצועים של אותו שירות בשתי תקופות זמן שונות בדוח ניתוח.
8. סיכום
בשיעור ה-Lab הזה יצרתם 2 שירותים פשוטים והוספתם מעקב מבוזר באמצעות Spring Cloud Sleuth, והשתמשתם ב-Spring Cloud GCP כדי להעביר את פרטי המעקב אל Cloud Trace.
9. מעולה!
למדתם איך לכתוב את אפליקציית האינטרנט הראשונה שלכם ב-App Engine.
מידע נוסף
- Cloud Trace: https://cloud.google.com/trace/
- פרויקט Spring ב-GCP: http://cloud.spring.io/spring-cloud-gcp/
- מאגר GitHub של Spring ב-GCP: https://github.com/GoogleCloudPlatform/spring-cloud-gcp
- Java ב-Google Cloud Platform: https://cloud.google.com/java/
רישיון
עבודה זו מורשית תחת רישיון Creative Commons שמותנה בייחוס 2.0 כללי.