1. نظرة عامة
يُعد التتبع الموزَّع أمرًا مهمًا للحصول على الإحصاءات وإمكانية الملاحظة في بنية الخدمات الدقيقة متعددة المستويات. عند تنفيذ سلسلة من الخدمات إلى استدعاءات الخدمة، من الخدمة أ إلى الخدمة ب إلى الخدمة ج، من المهم إدراك أن الاتصالات كانت ناجحة وكذلك وقت الاستجابة في كل خطوة.
في 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 Trace Trace، الذي يتكامل بسلاسة مع Spring Cloud Sleuth، ويعيد توجيه بيانات التتبُّع مباشرةً إلى Cloud Trace.
في هذا الدرس التطبيقي، ستتعلم كيفية إنشاء تطبيق Spring Boot جديد واستخدام أداة Spring Cloud Cloud Trace لإجراء عمليات التتبع الموزعة.
المعلومات التي ستطّلع عليها
- كيفية إنشاء تطبيق Spring Boot Java وإعداد Cloud Trace.
المتطلبات
- مشروع Google Cloud Platform
- متصفح، مثل Chrome أو Firefox
- الإلمام بأدوات تحرير النصوص القياسية في Linux مثل Vim أو EMAC أو 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
في هذه الخدمة، استخدمنا بالفعل Spring Cloud Sleuth للتتبع. يمكننا إضافة إجراء تفعيل Spring Cloud Trace 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. لتسهيل عملية الاختبار، يمكنك زيادة معدّل العيّنة إلى 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 ثوانٍ، أو عند تلقّي حد أدنى من بيانات التتبُّع. يمكنك ضبط هذا الإعداد ويمكنك الرجوع إلى المستندات المرجعية لتتبُّع Google Cloud Platform للحصول على مزيد من المعلومات.
تقديم طلب إلى الخدمة:
$ curl localhost:8080
في Cloud Console، انتقِل إلى العمليات ← التتبُّع ← قائمة التتبُّع.
في أعلى الصفحة، يمكنك تضييق النطاق الزمني إلى ساعة واحدة. تكون ميزة إعادة التحميل التلقائي مفعَّلة بشكلٍ تلقائي. لذا فور وصول بيانات التتبع، يجب أن تظهر في وحدة التحكم!
من المفترض أن تظهر بيانات التتبُّع خلال 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";
}
}
إضافة تتبع GCP Cloud Spring إلى 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 طلب باستخدام مرحبًا، التي يتم تثبيتها مسبقًا على Cloud Shell.
$ hey localhost:8080 -n 150
بالإضافة إلى ذلك، يمكن لخدمة Cloud Trace رصد تراجع أداء الخدمة نفسها تلقائيًا في فترتين زمنيتين مختلفتين ضمن تقرير التحليل.
8. ملخّص
في هذا التمرين، تم إنشاء خدمتين بسيطتين وإضافة عمليات التتبع الموزعة باستخدام Spring Cloud Sleuth، كما استخدمت Spring Cloud GCP لإعادة توجيه معلومات التتبع إلى Cloud Trace.
9. تهانينا!
لقد تعلمت كيفية كتابة أول تطبيق ويب لـ App Engine!
مزيد من المعلومات
- تتبّع السحابة الإلكترونية: https://cloud.google.com/trace/
- بدء مشروع Google Cloud Platform: http://cloud.spring.io/spring-cloud-gcp/
- الانتقال إلى مستودع GitHub في Google Cloud Platform: https://github.com/GoogleCloudPlatform/spring-cloud-gcp
- Java على Google Cloud Platform: https://cloud.google.com/java/
الترخيص
هذا العمل مرخّص بموجب رخصة المشاع الإبداعي 2.0 مع نسب العمل إلى مؤلف عام.