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.
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. –
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
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'? –