۱. مرور کلی
ردیابی توزیعشده برای کسب بینش و مشاهدهپذیری در معماری میکروسرویسهای چندلایه مهم است. وقتی فراخوانیهای سرویس به سرویس را از سرویس A به سرویس B و سپس به سرویس C زنجیر کردهاید، درک موفقیتآمیز بودن فراخوانیها و همچنین میزان تأخیر در هر مرحله مهم است.
در Spring Boot، میتوانید از Spring Cloud Sleuth برای افزودن یکپارچهی ابزار ردیابی توزیعشده به برنامهی خود استفاده کنید. بهطور پیشفرض، میتواند دادههای ردیابی را به Zipkin ارسال کند.
پلتفرم ابری گوگل دارای Cloud Trace است که یک سرویس مدیریتشده است و به شما امکان میدهد دادههای ردیابی را بدون نیاز به مدیریت نمونه Zipkin یا فضای ذخیرهسازی خود ذخیره کنید. Cloud Trace همچنین میتواند گزارشهای توزیع تأخیر را تولید کند و بهطور خودکار رگرسیون عملکرد را تشخیص دهد.
شما دو گزینه برای استفاده از Cloud Trace از یک برنامه Spring Boot دارید:
- از یک پروکسی Stackdriver Trace Zipkin استفاده کنید و به سادگی Spring Cloud Sleuth را پیکربندی کنید تا از این پروکسی به عنوان نقطه پایانی Zipkin استفاده کند.
- یا از Spring Cloud GCP Trace استفاده کنید که به طور یکپارچه با Spring Cloud Sleuth ادغام میشود و دادههای ردیابی را مستقیماً به Cloud Trace ارسال میکند.
در این آزمایشگاه کد، شما یاد خواهید گرفت که چگونه یک برنامه Spring Boot جدید بسازید و از Spring Cloud GCP Trace برای ردیابی توزیعشده استفاده کنید.
آنچه یاد خواهید گرفت
- نحوه ایجاد یک برنامه جاوا Spring Boot و پیکربندی Cloud Trace.
آنچه نیاز دارید
- یک پروژه پلتفرم ابری گوگل
- یک مرورگر، مانند کروم یا فایرفاکس
- آشنایی با ویرایشگرهای متن استاندارد لینوکس مانند Vim، EMACs یا Nano
چگونه از این آموزش استفاده خواهید کرد؟
تجربه خود را در ساخت برنامههای وب HTML/CSS چگونه ارزیابی میکنید؟
تجربه خود را در استفاده از خدمات پلتفرم ابری گوگل چگونه ارزیابی میکنید؟
۲. تنظیمات و الزامات
تنظیم محیط خودتنظیم
- وارد کنسول گوگل کلود شوید و یک پروژه جدید ایجاد کنید یا از یک پروژه موجود دوباره استفاده کنید. اگر از قبل حساب جیمیل یا گوگل ورک اسپیس ندارید، باید یکی ایجاد کنید .



- نام پروژه، نام نمایشی برای شرکتکنندگان این پروژه است. این یک رشته کاراکتری است که توسط APIهای گوگل استفاده نمیشود. شما همیشه میتوانید آن را بهروزرسانی کنید.
- شناسه پروژه در تمام پروژههای گوگل کلود منحصر به فرد است و تغییرناپذیر است (پس از تنظیم، قابل تغییر نیست). کنسول کلود به طور خودکار یک رشته منحصر به فرد تولید میکند؛ معمولاً برای شما مهم نیست که چیست. در اکثر آزمایشگاههای کد، باید شناسه پروژه خود را (که معمولاً با عنوان
PROJECT_IDشناخته میشود) ارجاع دهید. اگر شناسه تولید شده را دوست ندارید، میتوانید یک شناسه تصادفی دیگر ایجاد کنید. به عنوان یک جایگزین، میتوانید شناسه خودتان را امتحان کنید و ببینید که آیا در دسترس است یا خیر. پس از این مرحله قابل تغییر نیست و در طول پروژه باقی میماند. - برای اطلاع شما، یک مقدار سوم، شماره پروژه ، وجود دارد که برخی از APIها از آن استفاده میکنند. برای کسب اطلاعات بیشتر در مورد هر سه این مقادیر، به مستندات مراجعه کنید.
- در مرحله بعد، برای استفاده از منابع/API های ابری، باید پرداخت صورتحساب را در کنسول ابری فعال کنید . اجرای این آزمایشگاه کد هزینه زیادی نخواهد داشت، اگر اصلاً هزینهای داشته باشد. برای خاموش کردن منابع به منظور جلوگیری از پرداخت صورتحساب پس از این آموزش، میتوانید منابعی را که ایجاد کردهاید یا پروژه را حذف کنید. کاربران جدید Google Cloud واجد شرایط برنامه آزمایشی رایگان ۳۰۰ دلاری هستند.
پوسته ابری گوگل
اگرچه میتوان از راه دور و از طریق لپتاپ، گوگل کلود و کوبرنتیز را مدیریت کرد، اما در این آزمایشگاه کد، از گوگل کلود شل ، یک محیط خط فرمان که در فضای ابری اجرا میشود، استفاده خواهیم کرد.
فعال کردن پوسته ابری
- از کنسول ابری، روی فعال کردن پوسته ابری کلیک کنید
.

اگر این اولین باری است که Cloud Shell را اجرا میکنید، یک صفحه میانی برای توضیح آن به شما نمایش داده میشود. اگر با یک صفحه میانی مواجه شدید، روی ادامه کلیک کنید.

آمادهسازی و اتصال به Cloud Shell فقط چند لحظه طول میکشد.

این ماشین مجازی مجهز به تمام ابزارهای توسعه مورد نیاز است. این ماشین یک دایرکتوری خانگی پایدار ۵ گیگابایتی ارائه میدهد و در فضای ابری گوگل اجرا میشود که عملکرد شبکه و احراز هویت را تا حد زیادی افزایش میدهد. بخش عمدهای از کار شما در این آزمایشگاه کد، اگر نگوییم همه، را میتوان با یک مرورگر انجام داد.
پس از اتصال به 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].
۳. یک سرویس Spring Boot REST جدید ایجاد کنید
پس از راهاندازی 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 و پیشنمایش روی پورت ۸۰۸۰ را انتخاب کنید.

پس از کمی انتظار، نتیجه را خواهید دید:

در Cloud Shell، باید پیامهای لاگ را با شناسه ردیابی و شناسه دهانه نیز مشاهده کنید:

۴. استفاده از ردیابی ابری
فعال کردن API ردیابی ابری
قبل از استفاده از Cloud Trace برای ذخیره دادههای ردیابی خود، ابتدا باید Cloud Trace API را فعال کنید. برای فعال کردن API، دستور زیر را اجرا کنید:
$ gcloud services enable cloudtrace.googleapis.com
اعتبارنامه پیشفرض برنامه راهاندازی
برای این آزمایش، باید یک اعتبارنامه پیشفرض برای برنامه پیکربندی کنید. این اعتبارنامه به طور خودکار توسط 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
در این سرویس، ما قبلاً از Spring Cloud Sleuth برای ردیابی استفاده کردهایم. بیایید شروعکننده Spring Cloud GCP Trace را برای ارسال دادهها به 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 از هر درخواستی نمونهبرداری نمیکند. برای اینکه آزمایش ما کمی آسانتر شود، نرخ نمونهبرداری را در 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
در کنسول ابری، به مسیر Operations → Trace → Trace list بروید.

در بالا، محدوده زمانی را به ۱ ساعت محدود کنید. به طور پیشفرض، بارگذاری مجدد خودکار روشن است. بنابراین به محض رسیدن دادههای ردیابی، باید در کنسول نمایش داده شود!

دادههای ردیابی باید ظرف حدود ۳۰ ثانیه یا بیشتر نمایش داده شوند.

برای مشاهده جزئیات ردیابی، روی نقطه آبی کلیک کنید:

این که خیلی ساده بود!
۵. یک برنامه وب 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 را طوری پیکربندی کنید که ۱۰۰٪ درخواستها را نمونهبرداری کند:
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 را روی پورت ۸۰۸۱ با افزونه 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"
۶. بهروزرسانی سرویس اول برای استفاده از سرویس دوم
در حالی که 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() ، سرویس 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
در هر دو پنجرهی جلسه، باید پیامهای لاگ را ببینید، به همراه شناسهی ردیابی که از یک سرویس به سرویس دیگر منتقل شده است.
در فهرست ردیابی Cloud Trace، باید دومین ردیابی را ببینید:

میتوانید روی نقطه آبی جدید کلیک کنید و جزئیات مسیر را ببینید:

همچنین میتوانید روی هر دهانه در این نمودار کلیک کنید تا جزئیات دهانه را مشاهده کنید.
۷. گزارش توزیع تأخیر و عملکرد
وقتی از Cloud Trace به عنوان محل ذخیرهسازی دادههای ردیابی استفاده میکنید، Cloud Trace میتواند از دادهها برای ساخت گزارش توزیع تأخیر استفاده کند. برای ساخت گزارشی مانند این، به بیش از ۱۰۰ ردیابی نیاز دارید:

شما میتوانید بیش از ۱۰۰ درخواست اول را با استفاده از hey که از قبل روی Cloud Shell نصب شده است، اجرا کنید!
$ hey localhost:8080 -n 150
علاوه بر این، Cloud Trace میتواند به طور خودکار رگرسیون عملکرد یک سرویس مشابه را در دو دوره زمانی مختلف در گزارش تحلیل تشخیص دهد.
۸. خلاصه
در این آزمایش، شما دو سرویس ساده ایجاد کردید و ردیابی توزیعشده را با Spring Cloud Sleuth اضافه کردید و از Spring Cloud GCP برای ارسال اطلاعات ردیابی به Cloud Trace استفاده کردید.
۹. تبریک میگویم!
شما یاد گرفتید که چگونه اولین برنامه وب App Engine خود را بنویسید!
اطلاعات بیشتر
- ردیابی ابری: https://cloud.google.com/trace/
- پروژه اسپرینگ روی GCP: http://cloud.spring.io/spring-cloud-gcp/
- مخزن گیتهاب اسپرینگ روی GCP: https://github.com/GoogleCloudPlatform/spring-cloud-gcp
- جاوا در پلتفرم ابری گوگل: https://cloud.google.com/java/
مجوز
این اثر تحت مجوز عمومی Creative Commons Attribution 2.0 منتشر شده است.