1. بررسی اجمالی
ردیابی توزیع شده برای به دست آوردن بینش و مشاهده پذیری در معماری میکروسرویس های چند لایه مهم است. هنگامی که تماسهای سرویس به سرویس، از سرویس A تا سرویس B تا سرویس C را زنجیرهای میکنید، مهم است که درک کنید که تماسها موفقیتآمیز بوده و همچنین تاخیر در هر مرحله وجود دارد.
در 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 را برای استفاده از این پراکسی به عنوان نقطه پایانی Zipkin پیکربندی کنید.
- یا از Spring Cloud GCP Trace استفاده کنید که به طور یکپارچه با Spring Cloud Sleuth ادغام می شود و داده های ردیابی را مستقیماً به Cloud Trace ارسال می کند.
در این کد لبه، یاد خواهید گرفت که چگونه یک اپلیکیشن Spring Boot جدید بسازید و از Spring Cloud GCP Trace برای ردیابی توزیع شده استفاده کنید.
چیزی که یاد خواهید گرفت
- نحوه ایجاد برنامه Spring Boot Java و پیکربندی Cloud Trace.
آنچه شما نیاز دارید
- یک پروژه Google Cloud Platform
- یک مرورگر، مانند کروم یا فایرفاکس
- آشنایی با ویرایشگرهای متن استاندارد لینوکس مانند Vim، EMACs یا Nano
چگونه از این آموزش استفاده خواهید کرد؟
تجربه خود را با ساختن برنامه های وب HTML/CSS چگونه ارزیابی می کنید؟
تجربه خود را در استفاده از سرویسهای پلتفرم ابری Google چگونه ارزیابی میکنید؟
2. راه اندازی و الزامات
تنظیم محیط خود به خود
- به Google Cloud Console وارد شوید و یک پروژه جدید ایجاد کنید یا از یک موجود استفاده مجدد کنید. اگر قبلاً یک حساب Gmail یا Google Workspace ندارید، باید یک حساب ایجاد کنید .
- نام پروژه نام نمایشی برای شرکت کنندگان این پروژه است. این یک رشته کاراکتری است که توسط API های Google استفاده نمی شود. همیشه می توانید آن را به روز کنید.
- شناسه پروژه در تمام پروژههای Google Cloud منحصربهفرد است و تغییرناپذیر است (پس از تنظیم نمیتوان آن را تغییر داد). Cloud Console به طور خودکار یک رشته منحصر به فرد تولید می کند. معمولاً برای شما مهم نیست که چیست. در اکثر کدها، باید شناسه پروژه خود را ارجاع دهید (معمولاً با نام
PROJECT_ID
شناخته می شود). اگر شناسه تولید شده را دوست ندارید، ممکن است یک شناسه تصادفی دیگر ایجاد کنید. از طرف دیگر، میتوانید خودتان را امتحان کنید، و ببینید آیا در دسترس است یا خیر. پس از این مرحله نمی توان آن را تغییر داد و در طول مدت پروژه باقی می ماند. - برای اطلاع شما، یک مقدار سوم وجود دارد، یک شماره پروژه ، که برخی از API ها از آن استفاده می کنند. در مورد هر سه این مقادیر در مستندات بیشتر بیاموزید.
- در مرحله بعد، برای استفاده از منابع Cloud/APIها باید صورتحساب را در کنسول Cloud فعال کنید . اجرا کردن از طریق این کد لبه هزینه زیادی نخواهد داشت. برای خاموش کردن منابع برای جلوگیری از تحمیل صورتحساب فراتر از این آموزش، میتوانید منابعی را که ایجاد کردهاید حذف کنید یا پروژه را حذف کنید. کاربران جدید Google Cloud واجد شرایط برنامه آزمایشی رایگان 300 دلاری هستند.
Google Cloud Shell
در حالی که Google Cloud و Kubernetes را می توان از راه دور از لپ تاپ شما کار کرد، در این کد لبه از Google Cloud Shell استفاده خواهیم کرد، یک محیط خط فرمان که در Cloud اجرا می شود.
Cloud Shell را فعال کنید
- از Cloud Console، روی Activate Cloud Shell کلیک کنید .
اگر این اولین باری است که Cloud Shell را راه اندازی می کنید، با یک صفحه میانی روبرو می شوید که آن را توصیف می کند. اگر با یک صفحه میانی مواجه شدید، روی Continue کلیک کنید.
تهیه و اتصال به Cloud Shell فقط باید چند لحظه طول بکشد.
این ماشین مجازی با تمام ابزارهای توسعه مورد نیاز بارگذاری شده است. این یک فهرست اصلی 5 گیگابایتی دائمی ارائه میکند و در Google Cloud اجرا میشود، که عملکرد و احراز هویت شبکه را بسیار افزایش میدهد. بسیاری از کارهای شما، اگر نه همه، در این کد لبه با مرورگر قابل انجام است.
پس از اتصال به Cloud Shell، باید ببینید که احراز هویت شده اید و پروژه به ID پروژه شما تنظیم شده است.
- برای تایید احراز هویت، دستور زیر را در 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. یک سرویس 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
پس از شروع برنامه، روی نماد Web Preview کلیک کنید در نوار ابزار Cloud Shell و پیش نمایش در پورت 8080 را انتخاب کنید.
پس از مدت کوتاهی باید نتیجه را مشاهده کنید:
در Cloud Shell، همچنین باید پیامهای گزارش را با شناسه ردیابی و شناسه دهانه مشاهده کنید:
4. استفاده از Cloud Trace
Cloud Trace API را فعال کنید
قبل از استفاده از Cloud Trace برای ذخیره داده های ردیابی، ابتدا باید Cloud Trace API را فعال کنید. برای فعال کردن API، اجرا کنید:
$ gcloud services enable cloudtrace.googleapis.com
راه اندازی اعتبار پیش فرض برنامه
برای این آزمایشگاه، باید یک اعتبار پیش فرض برنامه را پیکربندی کنید. این اعتبارنامه بهطور خودکار توسط آغازگر Spring Cloud GCP Trace دریافت میشود.
ابتدا وارد شوید:
$ 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: ...
روی پیوند کلیک کنید تا یک برگه مرورگر جدید باز شود و سپس روی Allow کلیک کنید
سپس، کد تایید را دوباره در Cloud Shell کپی و جایگذاری کنید و اینتر را فشار دهید. باید ببینید:
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 را اضافه کنیم تا داده ها را به 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
به 100% افزایش دهید تا مطمئن شوید که دادههای ردیابی را میبینیم، و همچنین برخی URLها را که به آنها اهمیت نمیدهیم نادیده میگیریم:
$ echo "
spring.sleuth.sampler.probability=1.0
spring.sleuth.web.skipPattern=(^cleanup.*|.+favicon.*)
" > src/main/resources/application.properties
برنامه را دوباره اجرا کنید و از Cloud Shell Web Preview برای مشاهده برنامه استفاده کنید:
$ 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 بروید
در بالا، محدوده زمانی را به 1 ساعت کاهش دهید. به طور پیش فرض، بارگذاری مجدد خودکار روشن است. بنابراین با رسیدن داده های ردیابی، باید در کنسول نشان داده شود!
داده های ردیابی باید در 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()
با سرویس 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 که از یک سرویس به سرویس دیگر منتشر می شود.
در فهرست ردیابی Cloud Trace، باید رد دوم را مشاهده کنید:
می توانید روی نقطه آبی جدید کلیک کنید و جزئیات ردیابی را مشاهده کنید:
همچنین می توانید روی هر دهانه در این نمودار کلیک کنید تا جزئیات دهانه را ببینید.
7. تأخیر توزیع و گزارش عملکرد
وقتی از Cloud Trace به عنوان ذخیرهسازی داده ردیابی استفاده میکنید، Cloud Trace میتواند از دادهها برای ایجاد گزارش توزیع تأخیر استفاده کند. برای ساخت این گزارش به بیش از 100 ردیابی نیاز دارید:
میتوانید 100+ درخواست اول را با استفاده از hey ، که از قبل روی پوسته ابری نصب شده است، اجرا کنید!
$ hey localhost:8080 -n 150
علاوه بر این، Cloud Trace می تواند به طور خودکار رگرسیون عملکرد یک سرویس را در دو دوره زمانی مختلف تحت گزارش تجزیه و تحلیل تشخیص دهد.
8. خلاصه
در این آزمایشگاه، 2 سرویس ساده ایجاد کردید و ردیابی توزیع شده را با Spring Cloud Sleuth اضافه کردید و از Spring Cloud GCP برای ارسال اطلاعات ردیابی به Cloud Trace استفاده کردید.
9. تبریک می گویم!
شما یاد گرفتید که چگونه اولین برنامه وب App Engine خود را بنویسید!
بیشتر بدانید
- Cloud Trace: https://cloud.google.com/trace/
- پروژه Spring on GCP: http://cloud.spring.io/spring-cloud-gcp/
- Spring در مخزن GCP GitHub: https://github.com/GoogleCloudPlatform/spring-cloud-gcp
- جاوا در Google Cloud Platform: https://cloud.google.com/java/
مجوز
این اثر تحت مجوز Creative Commons Attribution 2.0 Generic مجوز دارد.