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

1. بررسی اجمالی

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

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

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

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

  1. از یک Stackdriver Trace Zipkin Proxy استفاده کنید و به سادگی Spring Cloud Sleuth را برای استفاده از این پراکسی به عنوان نقطه پایانی Zipkin پیکربندی کنید.
  2. یا از 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. راه اندازی و الزامات

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

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

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

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

Google Cloud Shell

در حالی که Google Cloud و Kubernetes را می توان از راه دور از لپ تاپ شما کار کرد، در این کد لبه از Google Cloud Shell استفاده خواهیم کرد، یک محیط خط فرمان که در Cloud اجرا می شود.

Cloud Shell را فعال کنید

  1. از Cloud Console، روی Activate Cloud Shell کلیک کنید 853e55310c205094.png .

55efc1aaa7a4d3ad.png

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

9c92662c6a846a5c.png

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

9f0e51b578fecce5.png

این ماشین مجازی با تمام ابزارهای توسعه مورد نیاز بارگذاری شده است. این یک فهرست اصلی 5 گیگابایتی دائمی ارائه می‌کند و در Google Cloud اجرا می‌شود، که عملکرد و احراز هویت شبکه را بسیار افزایش می‌دهد. بسیاری از کارهای شما، اگر نه همه، در این کد لبه با مرورگر قابل انجام است.

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

  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].

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 کلیک کنید 3a9b40fafa650b2b.png در نوار ابزار Cloud Shell و پیش نمایش در پورت 8080 را انتخاب کنید.

3aca52f76c6c22a3.png

پس از مدت کوتاهی باید نتیجه را مشاهده کنید:

6793a3339447cbb5.png

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

18d597c388de1ba.png

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 کلیک کنید

85f500de6f5dc0a8.png

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

be48cb0f99b5f7c2.png

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

3522eef823df39d8.png

داده های ردیابی باید در 30 ثانیه یا بیشتر نشان داده شوند.

9628f6e1d2e75b05.png

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

ba9051a8d4f3e725.png

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

5. دومین برنامه وب 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 را برای نمونه برداری از 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، باید رد دوم را مشاهده کنید:

13490977f1638702.png

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

ca69ef9cdd13d4aa.png

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

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

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

c8713f3d9e51dc25.png

می‌توانید 100+ درخواست اول را با استفاده از hey ، که از قبل روی پوسته ابری نصب شده است، اجرا کنید!

$ hey localhost:8080 -n 150

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

8. خلاصه

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

9. تبریک می گویم!

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

بیشتر بدانید

مجوز

این اثر تحت مجوز Creative Commons Attribution 2.0 Generic مجوز دارد.