מעקב מבוזר חשוב כדי לקבל תובנות ולשפר את יכולת הצפייה בארכיטקטורת מיקרו-שירותים מרובת-שכבות. כשמשלבים קריאות משירות לשירות, משירות א' לשירות ב' לשירות ג', חשוב להבין שהקריאות בוצעו בהצלחה וגם את זמן האחזור בכל שלב.
ב-Spring Boot, אפשר להשתמש ב-Spring Cloud Sleuth כדי להוסיף בצורה חלקה את כלי המעקב המבוזר לאפליקציה. כברירת מחדל, הוא יכול להעביר את נתוני המעקב ל-Zipkin.
ב-Google Cloud Platform יש את Stackdriver Trace, שירות מנוהל שמאפשר לכם לאחסן נתוני מעקב בלי שתצטרכו לנהל את מופע Zipkin או את האחסון שלכם. בנוסף, Stackdriver Trace יכול ליצור דוחות על חלוקת זמן האחזור ולזהות אוטומטית רגרסיות בביצועים.
יש שתי אפשרויות לשימוש ב-Stackdriver Trace מאפליקציית Spring Boot:
- משתמשים ב-Stackdriver Trace Zipkin Proxy ומגדירים את Spring Cloud Sleuth כך שישתמש בשרת ה-proxy הזה כנקודת הקצה של Zipkin
- אפשר גם להשתמש ב-Spring Cloud GCP Trace, שמשתלב בצורה חלקה עם Spring Cloud Sleuth ומעביר את נתוני המעקב ישירות אל Stackdriver Trace.
בשיעור הזה תלמדו איך ליצור אפליקציית Spring Boot חדשה ולהשתמש ב-Spring Cloud GCP Trace למעקב מבוזר.
מה תלמדו
- איך יוצרים אפליקציית Java ב-Spring Boot ומגדירים את Stackdriver Trace.
מה צריך להכין
- פרויקט ב-Google Cloud Platform
- דפדפן, כמו Chrome או Firefox
- היכרות עם כלים לעריכת טקסט של Linux, כמו Vim, EMACs או Nano
איך תשתמשו במדריך הזה?
מה מידת שביעות הרצון שלך מחוויית הפיתוח של אפליקציות אינטרנט ב-HTML/CSS?
איזה דירוג מגיע לדעתך לחוויית השימוש שלך בשירותים של Google Cloud Platform?
הגדרת סביבה בקצב אישי
אם עדיין אין לכם חשבון Google (Gmail או Google Apps), אתם צריכים ליצור חשבון. נכנסים ל-Google Cloud Platform Console (console.cloud.google.com) ויוצרים פרויקט חדש:
חשוב לזכור את מזהה הפרויקט, שהוא שם ייחודי בכל הפרויקטים ב-Google Cloud (השם שמופיע למעלה כבר תפוס ולא יתאים לכם, מצטערים!). בהמשך ה-codelab הזה, נתייחס אליו כאל PROJECT_ID
.
בשלב הבא, תצטרכו להפעיל את החיוב ב-Cloud Console כדי להשתמש במשאבים של Google Cloud.
העלות של התרגיל הזה לא אמורה להיות גבוהה, אבל היא יכולה להיות גבוהה יותר אם תחליטו להשתמש ביותר משאבים או אם תשאירו אותם פועלים (ראו את הקטע 'ניקוי' בסוף המסמך הזה).
משתמשים חדשים ב-Google Cloud Platform זכאים לתקופת ניסיון בחינם בשווי 300$.
Google Cloud Shell
אפשר להפעיל את Google Cloud ואת Kubernetes מרחוק מהמחשב הנייד, אבל בסדנת הקוד הזו נשתמש ב-Google Cloud Shell, סביבת שורת פקודה שפועלת בענן.
הפעלת Google Cloud Shell
ב-GCP Console, לוחצים על סמל Cloud Shell בסרגל הכלים שבפינה השמאלית העליונה:
לאחר מכן לוחצים על 'הפעלת Cloud Shell':
יחלפו כמה רגעים עד שההקצאה והחיבור לסביבת העבודה יושלמו:
המכונה הווירטואלית הזו כוללת את כל הכלים הדרושים למפתחים. יש בה ספריית בית בנפח מתמיד של 5GB והיא פועלת ב-Google Cloud, מה שמשפר מאוד את הביצועים והאימות ברשת. את רוב העבודה במעבדה הזו, אם לא את כולה, אפשר לבצע באמצעות דפדפן או Google Chromebook.
אחרי שמתחברים ל-Cloud Shell, אמור להופיע אימות שכבר בוצע ושהפרויקט כבר הוגדר לפי PROJECT_ID.
מריצים את הפקודה הבאה ב-Cloud Shell כדי לוודא שהאימות בוצע:
gcloud auth list
פלט הפקודה
Credentialed accounts: - <myaccount>@<mydomain>.com (active)
gcloud config list project
פלט הפקודה
[core] project = <PROJECT_ID>
אם הוא לא מוגדר, אפשר להגדיר אותו באמצעות הפקודה הבאה:
gcloud config set project <PROJECT_ID>
פלט הפקודה
Updated property [core/project].
אחרי ש-Cloud Shell מופעל, אפשר להשתמש בשורת הפקודה כדי ליצור אפליקציית Spring Boot חדשה באמצעות 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
יוצרים בקר 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!";
}
}
אפשר להפעיל את אפליקציית Spring Boot כרגיל באמצעות הפלאגין Spring Boot. נניח שרוצים לדלג על בדיקות במעבדה הזו:
$ ./mvnw -DskipTests spring-boot:run
אחרי שהאפליקציה מופעלת, לוחצים על סמל התצוגה המקדימה באינטרנט בסרגל הכלים של Cloud Shell ובוחרים באפשרות תצוגה מקדימה ביציאה 8080.
אחרי המתנה קצרה, התוצאה תוצג:
ב-Cloud Shell אמורות להופיע גם הודעות היומן עם מזהה המעקב ומזהה הטווח:
הפעלת Stackdriver Trace API
כדי להשתמש ב-Stackdriver Trace לאחסון נתוני המעקב, קודם צריך להפעיל את Stackdriver Trace API. כדי להפעיל את ה-API, עוברים אל API Services → Library (שירותי API → ספרייה).
מחפשים את Stackdriver Trace
לוחצים על Stackdriver Trace API ואז על Enable אם הוא לא מופעל כבר.
הגדרת 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 כדי להעביר את הנתונים אל Stackdriver Trace.
מוסיפים את יחסי התלות של 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>
כברירת מחדל, 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, עוברים אל Stackdriver → Trace → Trace list
בחלק העליון, מצמצמים את טווח הזמן לשעה אחת. כברירת מחדל, האפשרות טעינה מחדש אוטומטית מופעלת. לכן, כשהנתונים של המעקב מגיעים, הם אמורים להופיע במסוף.
נתוני העקבות אמורים להופיע תוך כ-30 שניות.
לוחצים על הנקודה הכחולה כדי לראות את פרטי העקבות:
זה היה די פשוט!
פותחים סשן חדש ב-Cloud Shell על ידי לחיצה על הסמל +:
בסשן החדש, יוצרים את אפליקציית Spring Boot השנייה:
$ 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
יוצרים בקר 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 Stackdriver Trace starter -->
<dependency>
<groupId>org.springframework.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 -Dserver.port=8081
בזמן ש-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("http://localhost:8081/meet", String.class);
log.info(result);
}
...
}
מפעילים מחדש את השירות ומפעילים את נקודת הקצה בתצוגה המקדימה באינטרנט:
$ export GOOGLE_CLOUD_PROJECT=`gcloud config list --format 'value(core.project)'`
$ ./mvnw -DskipTests spring-boot:run
בשני חלונות הסשן אמורות להופיע הודעות היומן, עם מזהה המעקב שמועבר משירות אחד לשני.
ברשימת המעקב של Stackdriver Trace, אמור להופיע המעקב השני:
אפשר ללחוץ על הנקודה הכחולה החדשה ולראות את פרטי העקבות:
אפשר גם ללחוץ על כל טווח בתרשים הזה כדי לראות את פרטי הטווח.
כשמשתמשים ב-Stackdriver Trace כמקום לאחסון נתוני המעקב, אפשר להשתמש בנתונים כדי ליצור דוח על התפלגות זמן האחזור. כדי ליצור דוח כמו זה שמוצג כאן, צריך יותר מ-100 עקבות:
בנוסף, Stackdriver Trace יכול לזהות באופן אוטומטי נסיגה בביצועים של אותו שירות בשתי תקופות זמן שונות בדוח Analysis Report.
בשיעור ה-Lab הזה יצרתם 2 שירותים פשוטים והוספתם מעקב מבוזר באמצעות Spring Cloud Sleuth, והשתמשתם ב-Spring Cloud GCP כדי להעביר את פרטי המעקב אל Stackdriver Trace.
למדתם איך לכתוב את אפליקציית האינטרנט הראשונה שלכם ב-App Engine.
מידע נוסף
- Stackdriver Trace: https://cloud.google.com/trace/
- פרויקט Spring ב-GCP: http://cloud.spring.io/spring-cloud-gcp/
- מאגר GitHub של Spring ב-GCP: https://github.com/spring-cloud/spring-cloud-gcp
- Java ב-Google Cloud Platform: https://cloud.google.com/java/
רישיון
העבודה הזו בשימוש במסגרת רישיון Creative Commons כללי מגרסה 2.0 המותנה בייחוס.