2016-05-07 4 views
2

Wir haben eine Spring-Boot-Anwendung im eingebetteten Jetty-Server auf Port X installiert. Jetzt integriere ich Apache Camel in diese bestehende Anwendung, indem ich Routen definiere. Ziel ist es, einige Rest-Endpunkte auf Kamel-Routen zu verschieben, die mit einem anderen Dienst verknüpft werden. Ich bin nicht in der Lage folgendenVerwenden von Camel in der vorhandenen Spring Boot-Anwendung mit Jetty Server

  • zu verstehen, wenn ich „Anlegesteg: http://localhost:Y/myapp“ verwenden als eine der Route Endpunkte. Es hat ohne Fehler funktioniert. Bedeutet das, dass Camel eine eigene Steginstanz erstellt hat?

  • Wenn ich „Anlegesteg: http://localhost:X/myapp“ - es funktionierte wieder ohne Fehler zu geben, die Adresse X im Einsatz

ist, würde ich die Kontrolle über Anlegesteg-Server-Konfiguration halten mag, wie sie Kamel waren und lassen Sie hören zu bereits vorhandenen Ruhe-Endpunkten.

+0

Sie erwähnen "existierende REST-Endpunkte": Ich denke, Sie sollten in Betracht ziehen, Ihre vorhandenen REST-Endpunkte direkt in Camel zu integrieren, ohne auf die Servlet-Ebene zu gehen. Das ist ziemlich einfach, wenn Sie JAX-RS mit Apache CXF als Implementierung verwenden (überprüfen Sie die CXFRS- und CXF-Bean-Komponenten), aber Sie können auch eine Camel ProducerTemplate in Ihrem vorhandenen Controller verwenden, um eine Nachricht an eine Camel-Route zu senden. Es könnte hilfreich sein, wenn Sie detailliertere Informationen zu Ihrem Anwendungsfall (z. B. möchten Sie eine breite Palette von URL-Pfaden oder nur einige spezifische URL-Pfade umleiten) und zu Ihren vorhandenen REST-Endpunkten angeben. –

+0

Danke für Ihre Zeit. Zuvor hatte sich unsere Anwendung mit einem einzelnen Backend in Verbindung gesetzt (zB original.com). Nun haben wir einige Funktionen extrahiert und einen Micro-Service für sie erstellt. Dies bedeutet, dass original.com/moved-context-path auf das neue Backend new.com/moved-context-path umgeleitet werden sollte. Wir möchten mit Apache Camel als Proxy für ausgewählte REST API – DanglingPointer

+0

bereitstellen. Ich verstehe, dass die gleiche Anwendung sowohl einige Implementierungen von REST-Diensten (die bisher nicht extrahiert wurden) als auch einige Umleitungen auf externe REST-Dienste (das neue Kamelrouten). Was verwenden Sie, um die verbleibenden REST-Services verfügbar zu machen? JAX-RS (wenn ja, ist es CXF?), Spring-Mvc, Restlet, vielleicht noch etwas? Willst du auch jeden Pfad blind umleiten, der aussieht wie 'original.com/foo/*' oder nur bestimmte Pfade wie 'original.com/foo/bar1' und' original.com/foo/bar2'? –

Antwort

1

Camel hört auf "bereits existierende" Endpunkte nicht so, wie Sie es erwarten; es erstellt seine eigene, indem es die systemangezeigte Komponente verwendet. Sie haben einen Jetty-Endpunkt erstellt (d. H. "Anlegestelle: ..."), sodass Camel eine Camel Jetty-Komponente zum Verarbeiten von HTTP-Anforderungen an diesem Endpunkt hochspinnt.

Wenn Sie als Proxy Kamel verwenden, um zu umleiten (was leichter mit einem Netzwerk zum Lastenausgleich erreicht werden könnte), dann würden Sie spin up Kamelrouten zu ersetzen die bestehenden Endpunkte und sie an die neue Endpunkte. von ("Anlegesteg: http://oldendpoint.com") .to ("Anlegesteg: http://newendpoint.com");

2

Wenn Sie ein Servlet-Mapping konfigurieren können, das allen Pfaden entspricht, die umgeleitet werden müssen (zum Beispiel werden Pfade wie foo/* immer umgeleitet), dann ist es ziemlich einfach. Wenn Ihnen das nicht gelingt, werde ich später versuchen, meine Antwort zu bearbeiten.

Die entsprechende Seite aus der offiziellen Dokumentation is here. Das interessante Beispiel für Sie ist das, das die servlet component verwendet, weil Sie bereits einen Servlet-Container (Jetty) konfiguriert und ausgeführt haben.

Zuerst muss das Camel-Servlet konfiguriert werden. Es hängt davon ab, wie Ihre vorhandenen Servlet (s) konfiguriert sind; zum Beispiel eine web.xml-Datei hinzufügen:

<servlet> 
    <servlet-name>CamelServlet</servlet-name> 
    <servlet-class>org.apache.camel.component.servlet.CamelHttpTransportServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

<servlet-mapping> 
    <servlet-name>CamelServlet</servlet-name> 
    <url-pattern>/foo/*</url-pattern> 
</servlet-mapping> 

Oder, wenn Sie feder Boot verwenden, können Sie registrieren die folgende Bohne:

@Bean 
public ServletRegistrationBean servletRegistrationBean() { 
    CamelHttpTransportServlet servlet = new CamelHttpTransportServlet("CamelServlet"); 
    servlet.setServletName(); 
    return new ServletRegistrationBean(servlet,"/foo/*"); 
} 

Wie auch immer, wenn Sie die haben Kamel-Servlet mit Jetty-Instanz registriert, können Sie die Servlet-Komponente verwenden, und leiten alles:

from("servlet:foo?matchOnUriPrefix=true") 
.to("http4://new.com/foo?bridgeEndpoint=true&throwExceptionOnFailure=false"); 
  • http4 ist die 012., basierend auf Apache HTTPClient 4.x. (Sie können immer noch die HTTP component Basis auf HTTPClient 3.x verwenden, wenn Sie möchten).
  • matchOnUriPrefix=true wird übereinstimmen Platzhalter
  • bridgeEndpoint=true bedeutet, dass wir als Proxy handeln
  • throwExceptionOnFailure=false vom new Server zurückgegeben Fehler bedeutet, wird nur an den Anrufer weitergeleitet werden, ohne von Camel gehandhabt wird.

Eine Anforderung an http://old.com/foo/some/crazy/path/i/just/made/up sollte (und wahrscheinlich zu einem Fehler 404 von dem new.com Server, der einfach auf die anfänglichen Anrufer übermittelt wird) zu http://new.com/foo/some/crazy/path/i/just/made/up weitergeleitet.