تتبُّع المعاملات الموزّعة مهم للحصول على إحصاءات وإمكانية مراقبة بنية الخدمات الدقيقة المتعددة المستويات. عندما يكون لديك سلسلة من طلبات الخدمة، من الخدمة "أ" إلى الخدمة "ب" إلى الخدمة "ج"، من المهم أن تفهم أنّ الطلبات قد تمت بنجاح وأنّ هناك أيضًا وقت استجابة في كل خطوة.
في Spring Boot، يمكنك استخدام Spring Cloud Sleuth لإضافة أداة تتبُّع موزّعة إلى تطبيقك بسلاسة. ويمكنه تلقائيًا إعادة توجيه بيانات التتبُّع إلى Zipkin.
تتضمّن Google Cloud Platform خدمة Stackdriver Trace، وهي خدمة مُدارة تتيح لك تخزين بيانات التتبُّع بدون الحاجة إلى إدارة مثيل Zipkin أو مساحة التخزين الخاصة بك. يمكن أن تنتج Stackdriver Trace أيضًا تقارير حول توزيع وقت الاستجابة وترصد تلقائيًا حالات تراجع الأداء.
يتوفّر لك خياران لاستخدام Stackdriver Trace من تطبيق Spring Boot:
- استخدِم خادم وكيل Stackdriver Trace Zipkin واضبط Spring Cloud Sleuth ببساطة لاستخدام هذا الخادم الوكيل كنقطة نهاية Zipkin.
- أو يمكنك استخدام Spring Cloud GCP Trace، الذي يتكامل بسلاسة مع Spring Cloud Sleuth ويرسل بيانات التتبُّع مباشرةً إلى Stackdriver Trace.
في هذا الدرس التطبيقي حول الترميز، ستتعرّف على كيفية إنشاء تطبيق Spring Boot جديد واستخدام Spring Cloud GCP Trace لتتبُّع العمليات الموزّعة.
ما ستتعرّف عليه
- كيفية إنشاء تطبيق Java Spring Boot وضبط Stackdriver Trace
المتطلبات
- مشروع على Google Cloud Platform
- متصفّح، مثل Chrome أو Firefox
- الإلمام بمحرّرات النصوص القياسية في Linux، مثل Vim أو EMACs أو Nano
كيف ستستخدم هذا البرنامج التعليمي؟
ما هو تقييمك لتجربة إنشاء تطبيقات ويب باستخدام HTML/CSS؟
ما هو تقييمك لتجربة استخدام خدمات Google Cloud Platform؟
إعداد البيئة بالسرعة التي تناسبك
إذا لم يكن لديك حساب على Google (Gmail أو Google Apps)، عليك إنشاء حساب. سجِّل الدخول إلى "وحدة تحكّم Google Cloud Platform" (console.cloud.google.com) وأنشِئ مشروعًا جديدًا:
تذكَّر معرّف المشروع، وهو اسم فريد في جميع مشاريع Google Cloud (الاسم أعلاه مستخدَم حاليًا ولن يكون متاحًا لك، نأسف لذلك). سيتم الإشارة إليه لاحقًا في هذا الدرس العملي باسم PROJECT_ID
.
بعد ذلك، عليك تفعيل الفوترة في Cloud Console من أجل استخدام موارد Google Cloud.
لن تكلفك تجربة هذا الدرس البرمجي أكثر من بضعة دولارات، ولكن قد تكون التكلفة أعلى إذا قررت استخدام المزيد من الموارد أو إذا تركتها قيد التشغيل (راجِع قسم "التنظيف" في نهاية هذا المستند).
يمكن للمستخدمين الجدد في Google Cloud Platform الاستفادة من فترة تجريبية مجانية بقيمة 300 دولار أمريكي.
Google Cloud Shell
على الرغم من إمكانية تشغيل Google Cloud وKubernetes عن بُعد من الكمبيوتر المحمول، سنستخدم في هذا الدرس العملي Google Cloud Shell، وهي بيئة سطر أوامر تعمل في السحابة الإلكترونية.
تفعيل Google Cloud Shell
من وحدة تحكّم Google Cloud Platform، انقر على رمز Cloud Shell في شريط الأدوات العلوي الأيسر:
ثم انقر على "بدء Cloud Shell":
ينبغي ألا تستغرق إدارة الحسابات والاتصال بالبيئة أكثر من بضع لحظات.
يتم تحميل هذه الآلة الافتراضية مزوّدة بكل أدوات التطوير التي ستحتاج إليها. وتوفِّر هذه الآلة دليلاً رئيسيًا دائمًا بسعة 5 غيغابايت ويتمّ تشغيله على Google Cloud، ما يحسّن كثيرًا أداء الشبكة والمصادقة. ويمكن إتمام معظم عملك إن لم يكن كلّه في هذا الدرس ببساطة من خلال متصفّح أو جهاز Google Chromebook فقط.
بعد الاتصال بـ Cloud Shell، من المفترض أن ترى أنّه تم إثبات هويتك وأنّ المشروع تم ضبطه على PROJECT_ID.
نفِّذ الأمر التالي في Cloud Shell للتأكّد من إكمال عملية المصادقة:
gcloud auth list
ناتج الأمر
Credentialed accounts: - <myaccount>@<mydomain>.com (active)
gcloud config list project
ناتج الأمر
[core] project = <PROJECT_ID>
إذا لم يكن كذلك، يمكنك تعيينه من خلال هذا الأمر:
gcloud config set project <PROJECT_ID>
ناتج الأمر
Updated property [core/project].
بعد تشغيل Cloud Shell، يمكنك استخدام سطر الأوامر لإنشاء تطبيق Spring Boot جديد باستخدام Spring Initializr:
$ curl https://start.spring.io/starter.tgz -d packaging=jar \
-d dependencies=web,lombok,cloud-gcp,cloud-starter-sleuth \
-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!";
}
}
يمكنك بدء تشغيل تطبيق Spring Boot بشكل عادي باستخدام مكوّن Spring Boot الإضافي. لننتقل إلى تخطّي الاختبارات لهذا الدرس التطبيقي:
$ ./mvnw -DskipTests spring-boot:run
بعد بدء تشغيل التطبيق، انقر على رمز "معاينة الويب" في شريط أدوات Cloud Shell واختَر المعاينة على المنفذ 8080.
بعد فترة قصيرة، من المفترض أن تظهر لك النتيجة:
في Cloud Shell، من المفترض أن تظهر لك أيضًا رسائل السجلّ التي تتضمّن رقم تعريف التتبُّع ورقم تعريف الامتداد:
تفعيل واجهة برمجة التطبيقات Stackdriver Trace API
عليك تفعيل واجهة برمجة التطبيقات Stackdriver Trace أولاً لاستخدامها في تخزين بيانات التتبُّع. لتفعيل واجهة برمجة التطبيقات، انتقِل إلى خدمات واجهة برمجة التطبيقات → المكتبة
ابحث عن Stackdriver Trace
انقر على واجهة برمجة التطبيقات Stackdriver Trace، ثم انقر على تفعيل إذا لم تكن مفعّلة من قبل.
إعداد "بيانات الاعتماد التلقائية للتطبيق"
في هذا المختبر، عليك ضبط بيانات اعتماد تلقائية للتطبيق. سيتم اختيار بيانات الاعتماد هذه تلقائيًا من خلال أداة بدء 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 لإعادة توجيه البيانات إلى Stackdriver Trace.
أضِف تبعية Spring Cloud GCP Trace:
pom.xml
<project>
...
<dependencies>
...
<!-- Add Stackdriver Trace Starter -->
<dependency>
<groupId>org.springframework.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، انتقِل إلى Stackdriver → Trace → قائمة عمليات التتبُّع.
في أعلى الصفحة، ضيّق النطاق الزمني إلى ساعة واحدة. يكون خيار إعادة التحميل التلقائي مفعّلاً تلقائيًا. وبالتالي، عند وصول بيانات التتبُّع، من المفترض أن تظهر في وحدة التحكّم.
من المفترض أن تظهر بيانات التتبُّع في غضون 30 ثانية تقريبًا.
انقر على النقطة الزرقاء للاطّلاع على تفاصيل التتبُّع:
كان ذلك بسيطًا جدًا.
افتح جلسة Cloud Shell جديدة من خلال النقر على الرمز +:
في الجلسة الجديدة، أنشئ تطبيق Spring Boot الثاني:
$ curl https://start.spring.io/starter.tgz -d packaging=jar \
-d dependencies=web,lombok,cloud-gcp,cloud-starter-sleuth \
-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 Stackdriver Trace starter -->
<dependency>
<groupId>org.springframework.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 -Dserver.port=8081
أثناء تشغيل 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)'`
$ ./mvnw -DskipTests spring-boot:run
في كلتا نافذتَي الجلسة، من المفترض أن تظهر لك رسائل السجلّ، مع نشر معرّف التتبُّع من خدمة إلى أخرى.
في "قائمة عمليات التتبُّع" في Stackdriver Trace، من المفترض أن تظهر لك عملية التتبُّع الثانية:
يمكنك النقر على النقطة الزرقاء الجديدة والاطّلاع على تفاصيل التتبُّع:
يمكنك أيضًا النقر على أي فترة في هذا الرسم البياني للاطّلاع على تفاصيل الفترة.
عند استخدام Stackdriver Trace كمساحة تخزين لبيانات التتبُّع، يمكن أن تستخدم Stackdriver Trace البيانات لإنشاء تقرير توزيع وقت الاستجابة. يجب أن يتضمّن التقرير أكثر من 100 عملية تتبُّع لإنشاء تقرير على النحو التالي:
بالإضافة إلى ذلك، يمكن لخدمة Stackdriver Trace رصد انخفاض الأداء تلقائيًا للخدمة نفسها خلال فترتين زمنيتين مختلفتين ضمن تقرير التحليل.
في هذا المختبر، أنشأت خدمتَين بسيطتَين وأضفت تتبُّعًا موزّعًا باستخدام Spring Cloud Sleuth، واستخدمت Spring Cloud GCP لإعادة توجيه معلومات التتبُّع إلى Stackdriver Trace.
لقد تعلّمت كيفية كتابة أول تطبيق ويب لك على App Engine.
مزيد من المعلومات
- Stackdriver Trace: https://cloud.google.com/trace/
- مشروع Spring on GCP: http://cloud.spring.io/spring-cloud-gcp/
- مستودع Spring on GCP GitHub: https://github.com/spring-cloud/spring-cloud-gcp
- Java على Google Cloud Platform: https://cloud.google.com/java/
الترخيص
يخضع هذا العمل لترخيص Creative Commons Attribution 2.0 Generic License.