ردیابی توزیع شده با Spring Cloud Sleuth و Cloud Trace

۱. مرور کلی

ردیابی توزیع‌شده برای کسب بینش و مشاهده‌پذیری در معماری میکروسرویس‌های چندلایه مهم است. وقتی فراخوانی‌های سرویس به سرویس را از سرویس A به سرویس B و سپس به سرویس C زنجیر کرده‌اید، درک موفقیت‌آمیز بودن فراخوانی‌ها و همچنین میزان تأخیر در هر مرحله مهم است.

در Spring Boot، می‌توانید از Spring Cloud Sleuth برای افزودن یکپارچه‌ی ابزار ردیابی توزیع‌شده به برنامه‌ی خود استفاده کنید. به‌طور پیش‌فرض، می‌تواند داده‌های ردیابی را به Zipkin ارسال کند.

پلتفرم ابری گوگل دارای Cloud Trace است که یک سرویس مدیریت‌شده است و به شما امکان می‌دهد داده‌های ردیابی را بدون نیاز به مدیریت نمونه Zipkin یا فضای ذخیره‌سازی خود ذخیره کنید. Cloud Trace همچنین می‌تواند گزارش‌های توزیع تأخیر را تولید کند و به‌طور خودکار رگرسیون عملکرد را تشخیص دهد.

شما دو گزینه برای استفاده از Cloud Trace از یک برنامه Spring Boot دارید:

  1. از یک پروکسی Stackdriver Trace Zipkin استفاده کنید و به سادگی Spring Cloud Sleuth را پیکربندی کنید تا از این پروکسی به عنوان نقطه پایانی Zipkin استفاده کند.
  2. یا از Spring Cloud GCP Trace استفاده کنید که به طور یکپارچه با Spring Cloud Sleuth ادغام می‌شود و داده‌های ردیابی را مستقیماً به Cloud Trace ارسال می‌کند.

در این آزمایشگاه کد، شما یاد خواهید گرفت که چگونه یک برنامه Spring Boot جدید بسازید و از Spring Cloud GCP Trace برای ردیابی توزیع‌شده استفاده کنید.

آنچه یاد خواهید گرفت

  • نحوه ایجاد یک برنامه جاوا Spring Boot و پیکربندی Cloud Trace.

آنچه نیاز دارید

  • یک پروژه پلتفرم ابری گوگل
  • یک مرورگر، مانند کروم یا فایرفاکس
  • آشنایی با ویرایشگرهای متن استاندارد لینوکس مانند Vim، EMACs یا Nano

چگونه از این آموزش استفاده خواهید کرد؟

فقط تا انتها بخوانید آن را بخوانید و تمرین‌ها را انجام دهید

تجربه خود را در ساخت برنامه‌های وب HTML/CSS چگونه ارزیابی می‌کنید؟

تازه کار متوسط ماهر

تجربه خود را در استفاده از خدمات پلتفرم ابری گوگل چگونه ارزیابی می‌کنید؟

تازه کار متوسط ماهر

۲. تنظیمات و الزامات

تنظیم محیط خودتنظیم

  1. وارد کنسول گوگل کلود شوید و یک پروژه جدید ایجاد کنید یا از یک پروژه موجود دوباره استفاده کنید. اگر از قبل حساب جیمیل یا گوگل ورک اسپیس ندارید، باید یکی ایجاد کنید .

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

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

پوسته ابری گوگل

اگرچه می‌توان از راه دور و از طریق لپ‌تاپ، گوگل کلود و کوبرنتیز را مدیریت کرد، اما در این آزمایشگاه کد، از گوگل کلود شل ، یک محیط خط فرمان که در فضای ابری اجرا می‌شود، استفاده خواهیم کرد.

فعال کردن پوسته ابری

  1. از کنسول ابری، روی فعال کردن پوسته ابری کلیک کنید 853e55310c205094.png .

55efc1aaa7a4d3ad.png

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

9c92662c6a846a5c.png

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

9f0e51b578fecce5.png

این ماشین مجازی مجهز به تمام ابزارهای توسعه مورد نیاز است. این ماشین یک دایرکتوری خانگی پایدار ۵ گیگابایتی ارائه می‌دهد و در فضای ابری گوگل اجرا می‌شود که عملکرد شبکه و احراز هویت را تا حد زیادی افزایش می‌دهد. بخش عمده‌ای از کار شما در این آزمایشگاه کد، اگر نگوییم همه، را می‌توان با یک مرورگر انجام داد.

پس از اتصال به Cloud Shell، باید ببینید که احراز هویت شده‌اید و پروژه روی شناسه پروژه شما تنظیم شده است.

  1. برای تأیید احراز هویت، دستور زیر را در 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`
  1. دستور زیر را در 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

پس از شروع برنامه، روی نماد پیش‌نمایش وب کلیک کنید 3a9b40fafa650b2b.png در نوار ابزار Cloud Shell و پیش‌نمایش روی پورت ۸۰۸۰ را انتخاب کنید.

3aca52f76c6c22a3.png

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

6793a3339447cbb5.png

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

18d597c388de1ba.png

۴. استفاده از ردیابی ابری

فعال کردن 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: ...

برای باز کردن یک برگه مرورگر جدید، روی پیوند کلیک کنید و سپس روی «مجاز» کلیک کنید

85f500de6f5dc0a8.png

سپس، کد تأیید را کپی کرده و دوباره در 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

در کنسول ابری، به مسیر OperationsTraceTrace list بروید.

be48cb0f99b5f7c2.png

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

3522eef823df39d8.png

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

۹۶۲۸f6e1d2e75b05.png

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

ba9051a8d4f3e725.png

این که خیلی ساده بود!

۵. یک برنامه وب Spring Boot دوم ایجاد کنید

با کلیک روی آیکون یک جلسه جدید Cloud Shell باز کنید:

9799bee5fea95aa6.png

در جلسه جدید، دومین برنامه 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، باید دومین ردیابی را ببینید:

۱۳۴۹۰۹۷۷f۱۶۳۸۷۰۲.png

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

ca69ef9cdd13d4aa.png

همچنین می‌توانید روی هر دهانه در این نمودار کلیک کنید تا جزئیات دهانه را مشاهده کنید.

۷. گزارش توزیع تأخیر و عملکرد

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

c8713f3d9e51dc25.png

شما می‌توانید بیش از ۱۰۰ درخواست اول را با استفاده از hey که از قبل روی Cloud Shell نصب شده است، اجرا کنید!

$ hey localhost:8080 -n 150

علاوه بر این، Cloud Trace می‌تواند به طور خودکار رگرسیون عملکرد یک سرویس مشابه را در دو دوره زمانی مختلف در گزارش تحلیل تشخیص دهد.

۸. خلاصه

در این آزمایش، شما دو سرویس ساده ایجاد کردید و ردیابی توزیع‌شده را با Spring Cloud Sleuth اضافه کردید و از Spring Cloud GCP برای ارسال اطلاعات ردیابی به Cloud Trace استفاده کردید.

۹. تبریک می‌گویم!

شما یاد گرفتید که چگونه اولین برنامه وب App Engine خود را بنویسید!

اطلاعات بیشتر

مجوز

این اثر تحت مجوز عمومی Creative Commons Attribution 2.0 منتشر شده است.