Routendiagramm für Apache Camel


In diesem Artikel werde ich Ihnen erklären, wie Sie ein Routendiagramm für Anwendungen mit Apache Camel erstellen, den Status dieser Routen verfolgen und Metriken für sie sammeln können.
Wir verwenden Apache Camel in Frühjahrsanwendungen und in Apache ServiceMix. Und wenn die Routen in einem separaten Dienst verständlich und leicht sichtbar sind, ist dies innerhalb des Datenbusses, wo es viele solcher Routen gibt, nicht so einfach.


Was ist Apache ServiceMix?

Apache Camel ist ein Open-Source-Framework für die Integration von Anwendungen mithilfe von einfachem DSL und einer Vielzahl vorgefertigter Datenzugriffskomponenten.


Apache ServiceMix ist eine Open Source-Lösung, die auf Apache ActiveMQ, Camel, CXF und Karaf basiert und es Ihnen ermöglicht, eine Plattform für Integrationslösungen zu erstellen. Apache ServiceMix kann als Enterprise Service Bus verwendet werden. In diesem Fall vereinfacht Camel die Erstellung von Routen im Bus mithilfe von DSL in Form von XML, Java, Scala usw. Wenn wir beispielsweise Nachrichten von einer Warteschlange in eine andere übertragen müssen (überlegen wir nicht, warum wir dies benötigen), können wir die Route in der XML-Datei beschreiben (Beispiel unten), sie in das gewünschte Dienstverzeichnis ablegen und sie wird bereitgestellt.


<?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> 

Die beschriebene Route überträgt Dateien von einem Verzeichnis in ein anderes.


Im Laufe der Jahre hat der Reifen mehr als hundert Strecken unterschiedlicher Komplexität angesammelt, und wir haben verstanden, dass es immer schwieriger wird, sich an all diese Verbindungen zu erinnern. Das Zeichnen von Routenschemata mit Ihren Händen oder das Beschreiben in Form von Tabellen scheint keine bequeme und einfach zu unterstützende Lösung mehr zu sein. Aber es schien, als würde die automatische Erstellung eines Routendiagramms alle retten.


Um ein Diagramm zu erstellen, benötigen Sie Scheitelpunkte und Kanten. Und von diesen blenden wir etwas Schönes!


Routenelemente


Der Einstiegspunkt (es ist einer) für die Route wird durch die from Anweisung mit einer Angabe des Endpunkts beschrieben. Das heißt, für


 <from uri="file:camel/input"/> 

Endpunkt ist file:camel/input . Er sagt uns, dass zu Beginn der Route die Dateien aus dem camel/input Verzeichnis entnommen werden.


Die Austrittspunkte von der Route (es gibt viele davon, weshalb ich den Plural angegeben habe) werden unterschiedlich bestimmt - abhängig von der Nachrichtenvorlage auch mit dem angegebenen Endpunkt. Im obigen Beispiel wird ein solcher Punkt durch to . Das heißt, für


 <to uri="file:camel/output"/> 

Endpunkt ist file:camel/output . Er sagt uns, dass am Ende der Route Dateien im camel/output gespeichert werden.


Endpunkte sind die Spitzen, die wir brauchen. Die Rippen bestimmen die Routen selbst.


Routenbeschreibungen abrufen


Servicemix bietet die Möglichkeit, mit JMX auf verschiedene Informationen zuzugreifen, und wir werden jolokia verwenden , um über http auf diese Informationen zuzugreifen.


Nehmen Sie als Beispiel diese Routenbeschreibung


 <?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&amp;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> 

Routenliste


Die Methode http://host:8181/jolokia/read/org.apache.camel:type=routes,* gibt eine Liste von Routen mit Details zurück.


Beispiel für Rückgabedaten für die service-a Route:


 "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": "" } 

Es gibt viele RouteId darunter RouteId , Context , EndpointUri , State und Uptime die für die Diagrammkonstruktion von besonderem Interesse sind.


Es ist wichtig zu erwähnen, dass die Methode Metriken entlang der Route zurückgibt: ExchangesTotal , ExchangesCompleted , ExchangesFailed , ExchangesInflight usw.


Die oben beschriebene Methode deckt 90% unseres Datenbedarfs ab. Es werden jedoch keine Informationen zu den Ausstiegspunkten der Route zurückgegeben. Um diese Informationen zu erhalten, müssen Sie die Methode zum Abrufen von Routendetails und die Methode zum Abrufen des Schemas verwenden. Eine der Methoden reicht nicht aus, da die Methoden in einigen Fällen nicht alle Daten zurückgeben, die zum Erstellen einer Liste von Austrittspunkten erforderlich sind.


Routendetails


Routendetails werden aus der Methode erhalten.
http://host:8181/jolokia/exec/org.apache.camel:context=a.xml,type=routes,name="service-a"/createRouteStaticEndpointJson(boolean)/true


Beispiel für zurückgegebene Daten:


 { "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 } 

Streckenkarte


Das Routendiagramm ergibt sich aus der Methode
http://host:8181/jolokia/exec/org.apache.camel:context=a.xml,type=routes,name="service-a"/dumpRouteAsXml(boolean)/true .


Die Methode gibt das Routendiagramm nur dann in XML-Form zurück, wenn es darin erstellt wurde. Wenn eine Route beispielsweise mit org.apache.camel.builder.RouteBuilder (zur Beschreibung von Routen in einer Spring-Anwendung) beschrieben wird, gibt die Methode nichts zurück.


Beispiel für zurückgegebene Daten:


 { "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 } 

Zeichnen Sie ein Diagramm


Wenn Sie alle empfangenen Informationen vis.js , können Sie sicher ein Diagramm zeichnen. Ich habe vis.js und dieses Ergebnis erhalten

Punkte sind Ein- und Ausstiegspunkte, Kanten sind Routen und graue Zahlen auf Routen sind die ExchangesTotal Metrik.


Grafik für mehrere Dienste


Der beschriebene Ansatz zur Graphkonstruktion eignet sich auch für den Fall, dass Kamel nicht nur im Datenbus, sondern auch in Anwendungen eingesetzt wird. Beschreiben Sie beispielsweise die Route in der Anwendung wie folgt:


 @Component public class EventRoutes extends RouteBuilder { @Override public void configure() throws Exception { from("jms:topic:timer") .inOnly("bean:service?method=handle"); } } 

Sie können alle Daten auf Routen von servicemix und der Anwendung kombinieren und ein gemeinsames Diagramm zeichnen

Beachten Sie, dass im Diagramm eine neue Route von jms:topic:timer zu bean:service angezeigt wurde.


Fazit


Durch die Implementierung des beschriebenen Ansatzes zur Erstellung eines Routendiagramms konnten wir ein Gesamtbild sowohl für den Bus als auch für die integrierten Dienste erhalten. Eigentlich sieht die Grafik unseres Reifens so aus

Proof-of-Concept-Apps finden Sie hier - Github

Source: https://habr.com/ru/post/de435594/


All Articles