1. نظرة عامة
تُعدّ ميزة "التتبُّع الموزّع" مهمة للحصول على إحصاءات وإمكانية مراقبة بنية الخدمات الدقيقة المتعدّدة المستويات. عندما يكون لديك سلسلة من طلبات الخدمة، من الخدمة "أ" إلى الخدمة "ب" إلى الخدمة "ج"، من المهم معرفة ما إذا كانت الطلبات ناجحة، بالإضافة إلى وقت الاستجابة في كل خطوة.
في Spring Boot، يمكنك استخدام Spring Cloud Sleuth لإضافة أداة تتبُّع موزّعة إلى تطبيقك بسلاسة. ويمكنه تلقائيًا إعادة توجيه بيانات التتبُّع إلى Zipkin.
تتضمّن Google Cloud Platform خدمة 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 لتتبُّع العمليات الموزّعة.
ما ستتعلمه
- كيفية إنشاء تطبيق Java Spring Boot وإعداد Cloud Trace
المتطلبات
- مشروع على Google Cloud Platform
- متصفّح، مثل Chrome أو Firefox
- الإلمام بأدوات تحرير النصوص العادية في Linux، مثل Vim أو EMACs أو Nano
كيف ستستخدم هذا البرنامج التعليمي؟
ما هو تقييمك لتجربة إنشاء تطبيقات ويب باستخدام HTML/CSS؟
ما هو تقييمك لتجربة استخدام خدمات Google Cloud Platform؟
2. الإعداد والمتطلبات
إعداد البيئة بالسرعة التي تناسبك
- سجِّل الدخول إلى Google Cloud Console وأنشِئ مشروعًا جديدًا أو أعِد استخدام مشروع حالي. إذا لم يكن لديك حساب على Gmail أو Google Workspace، عليك إنشاء حساب.



- اسم المشروع هو الاسم المعروض للمشاركين في هذا المشروع. وهي سلسلة أحرف لا تستخدمها Google APIs. ويمكنك تعديلها في أي وقت.
- رقم تعريف المشروع هو معرّف فريد في جميع مشاريع Google Cloud ولا يمكن تغييره بعد ضبطه. تنشئ Cloud Console تلقائيًا سلسلة فريدة، ولا يهمّك عادةً ما هي. في معظم دروس البرمجة، عليك الرجوع إلى رقم تعريف مشروعك (يُشار إليه عادةً باسم
PROJECT_ID). إذا لم يعجبك رقم التعريف الذي تم إنشاؤه، يمكنك إنشاء رقم تعريف عشوائي آخر. يمكنك بدلاً من ذلك تجربة اسم مستخدم من اختيارك ومعرفة ما إذا كان متاحًا. لا يمكن تغيير هذا الخيار بعد هذه الخطوة وسيظل ساريًا طوال مدة المشروع. - للعلم، هناك قيمة ثالثة، وهي رقم المشروع، تستخدمها بعض واجهات برمجة التطبيقات. يمكنك الاطّلاع على مزيد من المعلومات عن كل هذه القيم الثلاث في المستندات.
- بعد ذلك، عليك تفعيل الفوترة في Cloud Console لاستخدام موارد/واجهات برمجة تطبيقات Cloud. لن تكلفك تجربة هذا الدرس التطبيقي حول الترميز الكثير، إن وُجدت أي تكلفة على الإطلاق. لإيقاف الموارد وتجنُّب تحمّل تكاليف تتجاوز هذا البرنامج التعليمي، يمكنك حذف الموارد التي أنشأتها أو حذف المشروع. يمكن لمستخدمي Google Cloud الجدد الاستفادة من برنامج الفترة التجريبية المجانية بقيمة 300 دولار أمريكي.
Google Cloud Shell
على الرغم من إمكانية تشغيل Google Cloud وKubernetes عن بُعد من الكمبيوتر المحمول، سنستخدم في هذا الدرس العملي Google Cloud Shell، وهي بيئة سطر أوامر تعمل في السحابة الإلكترونية.
تفعيل Cloud Shell
- من Cloud Console، انقر على تفعيل Cloud Shell
.

إذا كانت هذه هي المرة الأولى التي تبدأ فيها Cloud Shell، ستظهر لك شاشة وسيطة توضّح ماهية هذه الخدمة. إذا ظهرت لك شاشة وسيطة، انقر على متابعة.

يستغرق توفير Cloud Shell والاتصال به بضع لحظات فقط.

يتم تحميل هذا الجهاز الافتراضي بجميع أدوات التطوير اللازمة. توفّر هذه الخدمة دليلًا رئيسيًا دائمًا بسعة 5 غيغابايت وتعمل في Google Cloud، ما يؤدي إلى تحسين أداء الشبكة والمصادقة بشكل كبير. يمكن إنجاز معظم عملك في هذا الدرس التطبيقي حول الترميز، إن لم يكن كله، باستخدام متصفح.
بعد الاتصال بـ 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].
3- إنشاء خدمة REST جديدة في Spring Boot
بعد تشغيل 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 واختَر المعاينة على المنفذ 8080.

بعد فترة قصيرة، من المفترض أن تظهر لك النتيجة:

في Cloud Shell، من المفترض أن تظهر لك أيضًا رسائل السجلّ التي تتضمّن رقم تعريف التتبُّع ورقم تعريف الامتداد:

4. استخدام Cloud Trace
تفعيل Cloud Trace API
يجب تفعيل واجهة برمجة التطبيقات Cloud Trace API أولاً قبل استخدام Cloud Trace لتخزين بيانات التتبُّع. لتفعيل واجهة برمجة التطبيقات، نفِّذ ما يلي:
$ 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: ...
انقر على الرابط لفتح علامة تبويب جديدة في المتصفّح، ثم انقر على السماح.

بعد ذلك، انسخ رمز التحقّق والصقه في 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 لإعادة توجيه البيانات إلى 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 عيّنات من كل طلب بشكلٍ تلقائي. لتسهيل عملية الاختبار، يمكنك زيادة معدّل أخذ العيّنات إلى% 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، انتقِل إلى العمليات → Trace → قائمة عمليات التتبُّع.

في أعلى الصفحة، ضيّق النطاق الزمني إلى ساعة واحدة. يكون خيار إعادة التحميل تلقائيًا مفعَّلاً تلقائيًا. لذا، عند وصول بيانات التتبُّع، من المفترض أن تظهر في وحدة التحكّم.

من المفترض أن تظهر بيانات التتبُّع في غضون 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.
أولاً، ابدأ بإنشاء عنصر 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)'`
# 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، من المفترض أن تظهر لك عملية التتبُّع الثانية:

يمكنك النقر على النقطة الزرقاء الجديدة والاطّلاع على تفاصيل التتبُّع:

يمكنك أيضًا النقر على أي فترة في هذا الرسم البياني للاطّلاع على تفاصيل الفترة.
7. تقرير "توزيع وقت الاستجابة والأداء"
عند استخدام Cloud Trace كمساحة تخزين لبيانات التتبُّع، يمكن أن تستخدم Cloud Trace البيانات لإنشاء تقرير توزيع وقت الاستجابة. يجب توفّر أكثر من 100 عملية تتبُّع لإنشاء التقرير على النحو التالي:

يمكنك تنفيذ أول 100 طلب أو أكثر باستخدام hey، الذي يأتي مثبّتًا مسبقًا على Cloud Shell.
$ hey localhost:8080 -n 150
بالإضافة إلى ذلك، يمكن لأداة Cloud Trace رصد انخفاض أداء الخدمة نفسها تلقائيًا خلال فترتين زمنيتين مختلفتين ضمن تقرير التحليل.
8. ملخّص
في هذا المختبر، أنشأت خدمتَين بسيطتَين وأضفت تتبُّعًا موزّعًا باستخدام 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 on GCP GitHub: https://github.com/GoogleCloudPlatform/spring-cloud-gcp
- Java على Google Cloud Platform: https://cloud.google.com/java/
الترخيص
يخضع هذا العمل لترخيص المشاع الإبداعي مع نسب العمل إلى مؤلفه 2.0 Generic License.