
في هذه المقالة ، سوف أخبركم عن كيفية إنشاء رسم بياني لطريق للتطبيقات باستخدام Apache Camel ، وتتبع حالة هذه المسارات وجمع المقاييس الخاصة بهم.
نحن نستخدم Apache Camel في تطبيقات الربيع وفي Apache ServiceMix. وإذا كانت الطرق في خدمة منفصلة مفهومة ومرئية بسهولة ، ثم داخل ناقل البيانات ، حيث توجد العديد من هذه المسارات ، فليس بهذه البساطة.
ما هو اباتشي ServiceMixيعد Apache Camel إطار عمل مفتوح المصدر لدمج التطبيقات من خلال استخدام dsl البسيط ومجموعة غنية من مكونات الوصول إلى البيانات الجاهزة.
Apache ServiceMix هو حل مفتوح المصدر يعتمد على Apache ActiveMQ و Camel و CXF و Karaf ، والذي يسمح لك ببناء نظام أساسي لحلول التكامل. يمكن استخدام Apache ServiceMix كحافلة خدمة للمؤسسات. في هذه الحالة ، سيُسهل الجمل إنشاء مسارات في الحافلة باستخدام dsl في شكل xml أو java أو scala ، إلخ. على سبيل المثال ، إذا كنا بحاجة إلى نقل الرسائل من قائمة انتظار إلى أخرى (دعونا لا نفكر في سبب حاجتنا لذلك) ، فيمكننا وصف المسار في ملف xml (المثال أدناه) ، وإسقاطه في دليل الخدمة المطلوب وسيتم نشره.
<?xml version="1.0" encoding="UTF-8"?> <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd"> <camelContext xmlns="http://camel.apache.org/schema/blueprint"> <route> <from uri="file:camel/input"/> <log message="Moving ${file:name} to the output directory"/> <to uri="file:camel/output"/> </route> </camelContext> </blueprint>
المسار الموصوف ينقل الملفات من دليل إلى آخر.
على مدار سنوات الاستخدام ، تراكمت الإطارات أكثر من مائة طريق متفاوتة التعقيد ، ولقد أدركنا أنه أصبح من الصعب وأصعب بكثير أن نتذكر كل هذه الروابط. لقد أصبح رسم مخططات الطريق بيديك أو وصفها في شكل جداول حلاً مريحًا ومدعومًا بسهولة. ولكن يبدو أن الإنشاء التلقائي لرسم بياني للطريق سيوفر الجميع.
لبناء رسم بياني ، تحتاج إلى رؤوس وحواف. ومن هؤلاء ، نحن أعمى شيء جميل!
عناصر الطريق
يتم وصف نقطة الدخول (هي نقطة واحدة) للمسار بواسطة العبارة from
مع إشارة إلى نقطة النهاية. أي ل
<from uri="file:camel/input"/>
سوف تكون نقطة النهاية file:camel/input
. يخبرنا أنه في بداية المسار ، سيتم نقل الملفات من دليل camel/input
.
يتم تحديد نقاط الخروج من المسار (هناك العديد منها ، ولهذا السبب أشرت إلى الجمع) بشكل مختلف - اعتمادًا على قالب المراسلة مع الإشارة إلى نقطة النهاية. في المثال أعلاه ، يتم وصف هذه النقطة من قبل to
. أي ل
<to uri="file:camel/output"/>
سوف تكون نقطة النهاية file:camel/output
. يخبرنا أنه في نهاية الطريق ، سيتم حفظ الملفات في دليل camel/output
.
نقاط النهاية هي قمم نحتاجها. ستحدد الأضلاع الطرق نفسها.
الحصول على أوصاف الطريق
يوفر Servicemix القدرة على الوصول إلى المعلومات المختلفة باستخدام JMX وسوف نستخدم jolokia للوصول إلى هذه المعلومات من خلال http.
كمثال ، خذ هذا الوصف للطرق
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd"> <camelContext xmlns="http://camel.apache.org/schema/spring"> <route id="the-clock-is-ticking"> <from uri="timer://foo?fixedRate=true&period=1000"/> <to uri="jms:topic:timer?connectionFactory=demo"/> </route> <route id="service-a"> <from uri="jms:topic:timer?connectionFactory=demo"/> <to uri="jms:queue:service-a?connectionFactory=demo"/> </route> <route id="service-a-log"> <from uri="jms:queue:service-a?connectionFactory=demo"/> <to uri="log:service-a"/> </route> </camelContext> </beans>
قائمة الطريق
الطريقة http://host:8181/jolokia/read/org.apache.camel:type=routes,*
تُرجع قائمة بالطرق مع التفاصيل.
مثال على إرجاع بيانات service-a
مسار:
"org.apache.camel:context=a.xml,name=\"service-a\",type=routes": { "StatisticsEnabled": true, "EndpointUri": "jms:\/\/topic:timer?connectionFactory=demo", "CamelManagementName": "a.xml", "ExchangesCompleted": 173, "LastProcessingTime": 2, "ExchangesFailed": 0, "Description": null, "FirstExchangeCompletedExchangeId": "ID-...", "StartTimestamp": "2018-12-17T07:01:12Z", "FirstExchangeCompletedTimestamp": "2018-12-17T07:01:13Z", "LastExchangeFailureTimestamp": null, "MaxProcessingTime": 35, "LastExchangeCompletedTimestamp": "2018-12-17T07:04:05Z", "Load15": "", "DeltaProcessingTime": -8, "OldestInflightDuration": null, "ExternalRedeliveries": 0, "ExchangesTotal": 173, "ResetTimestamp": "2018-12-17T07:01:12Z", "ExchangesInflight": 0, "MeanProcessingTime": 4, "LastExchangeFailureExchangeId": null, "FirstExchangeFailureExchangeId": null, "Uptime": "2 minutes", "CamelId": "camel-3", "TotalProcessingTime": 827, "FirstExchangeFailureTimestamp": null, "RouteId": "service-a", "RoutePolicyList": "", "FailuresHandled": 0, "MessageHistory": true, "Load05": "", "OldestInflightExchangeId": null, "State": "Started", "InflightExchanges": 0, "Redeliveries": 0, "MinProcessingTime": 0, "LastExchangeCompletedExchangeId": "ID-...", "Tracing": false, "Load01": "" }
هناك الكثير من RouteId
ومن بينها ، RouteId
، Context
، EndpointUri
، State
، Uptime
، وهي ذات أهمية خاصة لبناء الرسم البياني.
من المهم أن نذكر أن الطريقة تُرجع المقاييس على طول المسار: ExchangesTotal
، ExchangesCompleted
، ExchangesFailed
، ExchangesInflight
، إلخ.
تغطي الطريقة المذكورة أعلاه 90٪ من احتياجاتنا من البيانات ، لكن ما لا يتم إرجاعها هو معلومات حول نقاط الخروج من المسار. للحصول على هذه المعلومات ، تحتاج إلى استخدام طريقة الحصول على تفاصيل الطريق وطريقة الحصول على المخطط. إحدى الطرق غير كافية ، حيث في بعض الحالات لا تُرجع الطرق جميع البيانات اللازمة لتشكيل قائمة بنقاط الخروج.
تفاصيل الطريق
يتم الحصول على تفاصيل الطريق من الطريقة.
http://host:8181/jolokia/exec/org.apache.camel:context=a.xml,type=routes,name="service-a"/createRouteStaticEndpointJson(boolean)/true
مثال على البيانات التي تم إرجاعها:
{ "request": { "mbean": "org.apache.camel:context=a.xml,name=\"service-a\",type=routes", "arguments": ["true"], "type": "exec", "operation": "createRouteStaticEndpointJson(boolean)" }, "value": "{\"routes\": { \"service-a\": { \"inputs\": [ { \"uri\": \"jms:\/\/topic:timer?connectionFactory=demo\" } ], \"outputs\": [ { \"uri\": \"jms:\/\/queue:service-a?connectionFactory=demo\" } ] }}\n}\n", "timestamp": 1545040570, "status": 200 }
خريطة الطريق
يتم الحصول على مخطط الطريق من الطريقة
http://host:8181/jolokia/exec/org.apache.camel:context=a.xml,type=routes,name="service-a"/dumpRouteAsXml(boolean)/true
.
تقوم الطريقة بإرجاع مخطط المسار بتنسيق xml فقط إذا تم وضعه فيه. على سبيل المثال ، إذا تم وصف مسار باستخدام org.apache.camel.builder.RouteBuilder
(يستخدم لوصف المسارات في تطبيق نابض) ، فلن تُرجع الطريقة أي شيء.
مثال على البيانات التي تم إرجاعها:
{ "request": { "mbean": "org.apache.camel:context=a.xml,name=\"service-a\",type=routes", "arguments": ["true"], "type": "exec", "operation": "dumpRouteAsXml(boolean)" }, "value": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<route customId=\"true\" id=\"service-a\" xmlns=\"http:\/\/camel.apache.org\/schema\/spring\">\n <from uri=\"jms:topic:timer?connectionFactory=demo\"\/>\n <to uri=\"jms:queue:service-a?connectionFactory=demo\" id=\"to5\"\/>\n<\/route>\n", "timestamp": 1545040727, "status": 200 }
ارسم رسم بياني
عند الجمع بين جميع المعلومات التي تم تلقيها ، يمكنك رسم رسم بياني بأمان ، وقد استخدمت vis.js
وحصلت على هذه النتيجة

النقاط هي نقاط الدخول والخروج ، والحواف عبارة عن طرق ، والأرقام الرمادية على الطرق هي مقياس ExchangesTotal
.
الرسوم البيانية لخدمات متعددة
تعتبر الطريقة الموضحة لبناء الرسم البياني مناسبة أيضًا للحالة عند استخدام الجمل ليس فقط في ناقل البيانات ، ولكن أيضًا في التطبيقات. على سبيل المثال ، وصف المسار في التطبيق كما يلي:
@Component public class EventRoutes extends RouteBuilder { @Override public void configure() throws Exception { from("jms:topic:timer") .inOnly("bean:service?method=handle"); } }
يمكنك الجمع بين جميع البيانات على الطرق من servicemix
والتطبيق ورسم رسم بياني مشترك

لاحظ أن jms:topic:timer
جديدًا من jms:topic:timer
to bean:service
ظهرت على الرسم التخطيطي.
الخاتمة
من خلال تطبيق النهج الموضح لبناء رسم بياني للمسار ، تمكنا من الحصول على صورة شاملة لكل من الحافلة والخدمات المتكاملة. في الواقع الرسم البياني للإطارات لدينا يشبه هذا

دليل تطبيقات مفهوم يمكن أن ينظر إليه هنا - جيثب