تحية ، الخبروفيت! في غضون أسبوع ، ستبدأ الدروس في المجموعة الجديدة من الدورة التدريبية
"Developer on the Spring Framework" . في هذا الصدد ، نشارككم مواد مفيدة تخبرنا ما هو محرك الربيع وكيف يمكن أن تكون مفيدة.

- ما هو المحرك الربيع؟
- كيف تضيف Spring Actuator إلى مشروع Maven أو Gradle؟
- إنشاء مشروع Spring Boot مع تبعية Spring Actuator.
- رصد التطبيق مع نقاط نهاية المحرك الربيع.
ما هو المحرك الربيع؟بعد قيامك بتطوير التطبيق ونشره في الإنتاج ، من المهم للغاية مراقبة أدائه. هذا صحيح بشكل خاص بالنسبة للتطبيقات المهمة ، مثل الأنظمة المصرفية ، حيث يؤثر فشل التطبيق بشكل مباشر على العمل.
تقليديا ، قبل المشغل الربيعي ، كنا نحتاج إلى كتابة الكود لاختبار صحة التطبيق ، لكن مع المشغل الربيعي لم نكن بحاجة إلى كتابة الكود. يوفر Spring Actuator العديد من نقاط النهاية التي يمكن أن تكون مفيدة لمراقبة التطبيق.
كيف تضيف Spring Actuator إلى مشروع Maven أو Gradle؟مخضرم<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> </dependencies>
Gradle dependencies { compile("org.springframework.boot:spring-boot-starter-actuator") }
إنشاء مشروع إقلاع الربيع مع مشغل الربيعدعونا نمضي قدمًا وننشئ مشروع Spring Boot باستخدام تبعيات Spring Actuator و Web و DevTools باستخدام
Spring Initializer .
يرجى ملاحظة أنه في وقت كتابة هذا التقرير ، كان إصدار Spring Boot هو 2.1.0.

استيراد المشروع إلى Eclipse أو أي IDE آخر وتشغيل
SpringActuatorApplication.java
.
في وحدة التحكم ، سترى ما يلي:

يمكنك أن ترى أن Tomcat المدمجة تعمل على المنفذ 8080 ، وأن
SpringActuatorApplication
يعمل على Tomcat. يمكنك أيضًا رؤية أن نقاط النهاية الخاصة بالمشغل متوفرة في
/actuator.
018-11-09 20:00:29.346 INFO 8338 --- [ restartedMain] osbwembedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' 2018-11-09 20:00:29.354 INFO 8338 --- [ restartedMain] nbjsSpringActuatorApplication : Started SpringActuatorApplication in 9.273 seconds (JVM running for 11.823) 2018-11-09 20:00:29.190 INFO 8338 --- [ restartedMain] osbaeweb.EndpointLinksResolver : Exposing 2 endpoint(s) beneath base path '/actuator'.
رصد التطبيق مع نقاط نهاية المحرك الربيعكما قلنا أعلاه ، يوفر Spring Actuator العديد من نقاط النهاية التي يمكننا استخدامها لمراقبة صحة التطبيق.
تمكين نقاط النهايةافتراضيًا ، يتم تمكين جميع نقاط النهاية باستثناء
shutdown
. لتمكين نقطة النهاية ، استخدم الخاصية التالية في ملف
application.properties
.
management.endpoint.<code><</code>id<code>></code>.enabled
ملاحظة المترجم: بشكل افتراضي ، لا يمكن الوصول إلى جميع نقاط النهاية إلا من خلال JMX ، ولا يمكن الوصول عبر HTTP إلى جميع نقاط النهاية (انظر أدناه).
مثال:لتمكين نقطة نهاية
shutdown
، نحتاج إلى إدخال الإدخال التالي في ملف
application.properties
:
management.endpoint.shutdown.enabled=true
يمكننا تعطيل جميع نقاط النهاية ومن ثم تضمين فقط تلك التي نحتاجها. في التكوين التالي ، سيتم تعطيل جميع نقاط النهاية باستثناء
info
.
management.endpoints.enabled-by-default=false management.endpoint.info.enabled=true
الوصول إلى نقاط النهاية عبر HTTPدعنا نذهب إلى عنوان URL
المضيف المحلي : 8080 / مشغل وننظر في نقاط النهاية المتاحة.
ملاحظة: أستخدم
Postman للاختبار لأنه يعرض JSON بتنسيق جيد التنظيم. يمكنك استخدام أي أداة أخرى أو مجرد متصفح.

كما لاحظت بالفعل ، تظهر فقط نقاط النهاية الخاصة
health
info
هنا. لأن هذه هي نقاط النهاية الوحيدة التي يمكن الوصول إليها بشكل افتراضي عبر http. يتم إغلاق الوصول عبر http إلى نقاط النهاية الأخرى افتراضيًا لأسباب أمنية ، لأنها قد تحتوي على معلومات سرية ، وبالتالي قد يتم اختراقها.
الوصول إلى نقاط نهاية محددةإذا أردنا توفير الوصول عبر الويب (http) إلى نقاط النهاية الأخرى ، فسنحتاج إلى إدخال الإدخالات التالية في ملف
application.properties
.
management.endpoints.web.exposure.include=< ><a href="http://localhost:8080/actuator"></a>
مثال :
management.endpoints.web.exposure.include= health,info,env
الآن ، بعد إضافة الإدخال أعلاه إلى
application.properties
، دعنا نذهب مرة أخرى إلى
http: // localhost: 8080 / actuatorكما نرى في لقطة الشاشة أدناه ، يتم تضمين نقطة النهاية
env
أيضًا.
الوصول إلى جميع نقاط النهايةإذا أردنا تضمين جميع نقاط النهاية ، فيمكننا استخدام علامة
*
كما هو موضح أدناه.
management.endpoints.web.exposure.include=*
الوصول إلى جميع ما عدا بضع نقاط النهايةيقوم المدخلان أدناه بتنشيط جميع نقاط النهاية ، ولكن تعطيل نقطة النهاية env.
management.endpoints.web.exposure.include=* management.endpoints.web.exposure.exclude=env

تعطيل جميع نقاط النهاية HTTPإذا كنت لا ترغب في تقديم نقاط النهاية عبر HTTP ، يمكنك القيام بذلك عن طريق تعيين ما يلي في ملف
application.properties
:
management.server.port=-1
او نحو ذلك:
management.endpoints.web.exposure.exclude=*
قم بتكوين عناوين URL للوصول إلى نقاط النهايةبشكل افتراضي ، يمكن الوصول إلى جميع نقاط النهاية عن طريق URL
/actuator
في عناوين النموذج
/actuator/{id}
. ومع ذلك ، يمكنك تغيير المسار الأساسي
/actuator
باستخدام الخاصية التالية في
application.properties
.
management.endpoints.web.base-path
على سبيل المثال ، إذا كنت ترغب في جعل URL الأساسي مثل
/monitor
بدلاً من
/actuator
يمكنك القيام بذلك على النحو التالي:
management.endpoints.web.base-path=/monitor

في هذه الحالة ، ستكون جميع نقاط النهاية متاحة كـ
/monitor/{id}
بدلاً من
/actuator/{id}
نقاط النهاية الحذاء الربيع المحركلنناقش بعضًا من أهم نقاط النهاية.
/ الصحةتعطي نقطة النهاية الخاصة
health
الحالة العامة للتطبيق: هل هو قيد التشغيل أم لا. هذا مهم جدًا لمراقبة حالة التطبيق عندما يكون قيد الإنتاج. يمكن دمج نقطة النهاية هذه مع تطبيقات المراقبة وستكون مفيدة للغاية لتحديد صحة التطبيقات في الوقت الفعلي.
يعتمد مقدار المعلومات التي توفرها نقطة النهاية
health
على خاصية
management.endpoint.health.show-details
في ملف
application.properties
.
إذا كانت
management.endpoint.health.show-details=never
، فلن يتم عرض أي معلومات إضافية. في هذه الحالة ، سترى فقط ما يلي (هذا هو السلوك الافتراضي).

إذا كانت
management.endpoint.health.show-details=always
، فسيتم عرض معلومات إضافية لجميع المستخدمين. كما نرى في الإجابة أدناه ، لدينا معلومات حول مساحة القرص (diskSpace). إذا كان التطبيق الخاص بك متصلاً بقاعدة بيانات ، فستظهر لك أيضًا معلومات حول حالة قاعدة البيانات.

إذا كانت
management.endpoint.health.show-details=when-authorized
، فسيتم عرض معلومات إضافية فقط للمستخدمين المصرح لهم. يمكن تكوين التفويض باستخدام خاصية
management.endpoint.health.roles
.
مؤشرات محددة مسبقايحتوي مشغّل Spring Boot على العديد من "المؤشرات الصحية" التي تم تكوينها تلقائيًا (HeathIndicators) لاختبار صحة أجزاء مختلفة من التطبيق. على سبيل المثال ، يوفر
DiskspaceHealthIndicator
معلومات مساحة القرص. إذا كنت تستخدم
MongoHealthIndicator
،
MongoHealthIndicator
بفحص قاعدة بيانات Mongo (ما إذا كان الخادم يعمل أم لا) ويعرض المعلومات ذات الصلة. بشكل افتراضي ، يتم تحديد الحالة النهائية للتطبيق بواسطة
HealthAggregator
، والذي يقوم ببساطة بفرز قائمة الحالات التي يوفرها كل
HealthIndicator
. يتم استخدام الحالة الأولى في القائمة التي تم فرزها كحالة نهائية للتطبيق.
تعطيل جميع المؤشرات التي تم تكوينها مسبقايتم تمكين "مؤشرات الصحة" الموضحة أعلاه افتراضيًا ، ومع ذلك ، يمكنك إيقافها باستخدام الخاصية التالية:
management.health.defaults.enabled=false
تعطيل مؤشر واحدبدلاً من ذلك ، يمكنك تعطيل
HealthIndicator
منفصل ، كما هو موضح أدناه ، على سبيل المثال ، لتعطيل التحقق من مساحة القرص:
management.health.diskspace.enabled=false
ملاحظة: سيكون معرف أي
HealthIndicator
هو اسم الحبة بدون لاحقة
HealthIndicator
.
على سبيل المثال :
DiskSpaceHealthIndicator diskspace MongoHealthIndicator mongo CassandraHealthIndicator cassandra DataSourceHealthIndicator datasource
وهلم جرا ...
كتابة المؤشرات الخاصة بك (HealthIndicator)جنبا إلى جنب مع
HealthIndicator
المدمج الذي يوفره Spring Boot Actuator ، يمكننا إنشاء مؤشرات حالة مخصصة. للقيام بذلك ، تحتاج إلى إنشاء فصل يقوم بتنفيذ واجهة
HealthIndicator
، وتطبيق طريقة
health()
وإرجاع
Health
كإجابة بالمعلومات ذات الصلة ، كما هو موضح أدناه:
import org.springframework.boot.actuate.health.Health; import org.springframework.boot.actuate.health.HealthIndicator; import org.springframework.stereotype.Component; @Component public class CustomHealthIndicator implements HealthIndicator { @Override public Health health() { int errorCode = 0;
دعنا نذهب إلى نقطة النهاية الصحية مرة أخرى ونرى ما إذا كان مؤشرنا ينعكس أم لا.

نرى مؤشرنا.
حالة مكون واحديمكنك أيضًا التحقق من حالة المكون الفردي. في المثال أعلاه ، رأينا المؤشر الذي كتبناه و diskSpace.
إذا كنا نريد أن نرى فقط حالة القرص ، يمكننا استخدام عنوان URL التالي:
http: // localhost: 8080 / مشغل / صحة / diskSpace
/ معلوماتتوفر نقطة نهاية
info
عامة حول التطبيق الذي يتلقاه من ملفات مثل
build-info.properties
أو
git.properties
أو من الخصائص المحددة في
application.properties
.
نظرًا لعدم وجود مثل هذا الملف في مشروعنا ، ستكون الإجابة فارغة ، كما هو موضح أدناه:

يعرض Spring Boot Actuator معلومات
META-INF/build-info.properties
حالة وجود
META-INF/build-info.properties
. يتم إنشاء ملف معلومات المشروع هذا في وقت الإنشاء بواسطة هدف
build-info
. هنا يمكنك أيضًا إضافة عدد عشوائي من الخصائص الإضافية.
دعنا نضيف هدف
build-info
عن
spring-boot-maven-plugin
pom.xm
spring-boot-maven-plugin
إلى
pom.xm
l.
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.1.0.RELEASE</version> <executions> <execution> <goals> <goal>build-info</goal> </goals> <configuration> <additionalProperties> <encoding.source>UTF-8</encoding.source> <encoding.reporting>UTF-8</encoding.reporting> <java.source>${maven.compiler.source}</java.source> <java.target>${maven.compiler.target}</java.target> </additionalProperties> </configuration> </execution> </executions> </plugin>
الآن ، دعونا نلقي نظرة على نقطة نهاية
info
مرة أخرى ونرى معلومات التجميع ، كما هو موضح أدناه:

بالإضافة إلى ذلك ، يمكننا إضافة معلومات التطبيق باستخدام مفتاح
info
إلى
application.properties
، كما هو موضح أدناه ، وسيتم عرضها في نقطة النهاية
/info
.
info.application.name=spring-actuator info.application.description=spring boot actuator application info.application.version=0.0.1-SNAPSHOT
/ الفاصولياتُظهر نقطة نهاية
beans
جميع
beans
المعرفة في حاوية الزنبرك بالمعلومات التالية عن كل حبة:
aliases : scope : type : resource : (), dependencies :
على سبيل المثال ، قمت بإنشاء RestController باسم
TestController
وحقن مكونًا يسمى
TestService
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class TestController { @Autowired private TestService testService; @GetMapping("/messages") public String getMessage() { return "Hello"; } } import org.springframework.context.annotation.Configuration; @Configuration public class TestService { }
يمكنك أن ترى كيف يظهر هذا ل testController في الصورة أدناه.
/ configpropsتُظهر
configProps
جميع
@ConfigurationProperties
المشروحة بواسطة
@ConfigurationProperties
.

في لقطة الشاشة أعلاه ، نرى فاصوليا معرّفتين في إطار الربيع نفسه ويتم
@ConfigurationProperties
بتعليقات
@ConfigurationProperties
وبالتالي يتم عرضها في هذه النقطة النهائية.
تُظهر لقطة الشاشة أدناه شفرة مصدر
HttpTraceProperties
المشروحة بواسطة
@ConfigurationProperties
.
/ envتوفر نقطة النهاية
env
جميع المعلومات البيئية بالترتيب التالي:
/ heapdumpنقطة النهاية heapdump تفريغ كومة التطبيق. تقوم نقطة النهاية هذه بإرجاع البيانات الثنائية بتنسيق HPROF. نظرًا لأنه يتم عادةً إرجاع الكثير من البيانات ، يجب عليك حفظها وتحليلها.
/ قطع الاشجارتوفر
loggers
التطبيق معلومات حول مستوى السجل الذي تم تكوينه (ConfigLevel) والمستوى الفعال (الفعال المستوى). إذا لم يتم تحديد المستوى الذي تم تكوينه للمسجل ولأصله (فارغ) ، فسيكون مستوى مسجل الجذر مستوى فعال.
تشير خاصية
level
إلى مستويات التسجيل التي يدعمها إطار التسجيل.

للحصول على معلومات عن مسجل معين ، مرر اسم (معرف) المسجل في عنوان URL بعد
/loggers
، كما هو موضح أدناه:
http: // localhost: 8080 / مشغل / قطع الاشجار / nl.blogpsot.javasolutionsguide.springactuator.SpringActuatorApplication
/ المقاييستُظهر نقطة نهاية
metrics
جميع المقاييس التي يمكنك تتبعها لتطبيقك.
التحقق من المقاييس الفرديةيمكنك مشاهدة مقياس واحد عن طريق تمريره في url after
/metrics
، كما هو موضح أدناه:
http: // localhost: 8080 / المحرك / المقاييس / jvm.memory.used
مراجعdocs.spring.io/spring-boot/docs/current/reference/html/production-ready-endpoints.htmldocs.spring.io/spring-boot/docs/current/actuator-api/htmlوفقًا للتقاليد المعمول بها ، ننتظر تعليقاتكم وندعو الجميع إلى
اليوم المفتوح ، الذي سيعقد في 23 مايو.