Java 在现有的Spring引导应用程序和Jetty Server中使用Camel

Java 在现有的Spring引导应用程序和Jetty Server中使用Camel,java,apache-camel,Java,Apache Camel,我们在嵌入式jetty服务器上部署了一个spring引导应用程序,监听端口X。现在,我通过定义路由将Apache Camel集成到这个现有应用程序中目标是将少数休息端点移动到骆驼路线,这些路线将被代理到其他服务。我无法理解下面的内容 当我使用“jetty:”作为路由端点之一时。它没有任何错误。这是否意味着Camel创建了自己的jetty实例 当我使用“jetty:”-它再次工作,没有给出地址X正在使用的错误 我希望保持对jetty服务器配置的控制,让camel监听已有的rest端点。came

我们在嵌入式jetty服务器上部署了一个spring引导应用程序,监听端口X。现在,我通过定义路由将Apache Camel集成到这个现有应用程序中目标是将少数休息端点移动到骆驼路线,这些路线将被代理到其他服务。我无法理解下面的内容

  • 当我使用“jetty:”作为路由端点之一时。它没有任何错误。这是否意味着Camel创建了自己的jetty实例

  • 当我使用“jetty:”-它再次工作,没有给出地址X正在使用的错误

我希望保持对jetty服务器配置的控制,让camel监听已有的rest端点。

camel不会以您期望的方式监听“已有”端点;它使用指定的方案组件创建自己的方案。您已经创建了一个Jetty端点(即“Jetty:…”),因此Camel启动了一个Camel Jetty组件来处理该端点上的HTTP请求

如果您想使用Camel作为重定向代理(使用网络负载平衡器可能更容易实现),那么您需要启动Camel路由来替换现有端点并将它们路由到新端点。 从(“码头:”)
。至(“码头:”)

如果您可以配置一个servlet映射来匹配所有需要重定向的路径(例如,像
foo/*
这样的路径总是被重定向),那么事情就非常简单了。如果这对您不起作用,我将稍后尝试编辑我的答案

官方文件中的相关页面。您感兴趣的示例是使用的,因为您已经配置并运行了一个servlet容器(Jetty)

首先,需要配置Camel servlet。这取决于现有servlet的配置方式;例如,使用web.xml文件,添加:


骆驼队
org.apache.camel.component.servlet.CamelHttpTransportServlet
1.
骆驼队
/福/*
或者,如果您使用的是spring boot,则只需注册以下bean即可:

@Bean
public ServletRegistrationBean servletRegistrationBean() {
    CamelHttpTransportServlet servlet = new CamelHttpTransportServlet("CamelServlet");
    servlet.setServletName();
    return new ServletRegistrationBean(servlet,"/foo/*");
}
无论如何,一旦您在Jetty实例中注册了Camel servlet,您就可以使用servlet组件并重定向所有内容:

from("servlet:foo?matchOnUriPrefix=true")
.to("http4://new.com/foo?bridgeEndpoint=true&throwExceptionOnFailure=false");
  • http4
    是基于ApacheHttpClient 4.x的。(如果需要,您仍然可以使用HTTPClient 3.x上的base)
  • matchOnUriPrefix=true
    将匹配通配符
  • bridgeEndpoint=true
    表示我们作为代理
  • throweexceptionnfailure=false
    意味着
    new
    服务器返回的错误只会转发给调用者,而不会由Camel处理

请求
http://old.com/foo/some/crazy/path/i/just/made/up
应重定向到
http://new.com/foo/some/crazy/path/i/just/made/up
(可能导致
new.com
服务器出现404错误,该错误将被简单地转发给初始调用者)。

您提到“现有REST端点”我认为您可能会考虑直接将现有的休眠端点与CAMEL集成,而不必使用servlet级别。如果使用JAX-RS和ApacheCXF作为实现(查看CXFRS和CXFBean组件),那么这很容易做到,但也可以在现有控制器中使用Camel-ProducerTemplate将消息发送到Camel路由。如果您提供更多关于您的用例的详细信息(例如,您想重定向广泛的URL路径,还是只重定向一些特定的路径?)以及关于您现有的REST端点,可能会有所帮助。谢谢您的时间。以前我们的应用程序联系了单一后端(比如original.com),现在我们提取了一些功能并为它们创建了微服务。这意味着应将original.com/moved-context-path重定向到新后端new.com/moved-context-path。我们希望使用ApacheCamel作为选定REST API的代理进行部署。我的理解是,同一个应用程序将包含一些REST服务实现(到目前为止尚未提取的实现)和一些到外部REST服务的重定向(新的Camel路由)。您使用什么来公开其余的REST服务?JAX-RS(如果是,是CXF吗?),SpringMVC,Restlet,或者其他什么?另外,您想盲目重定向任何看起来像
original.com/foo/*
的路径,还是只重定向一些特定的路径,比如
original.com/foo/bar1
original.com/foo/bar2
?注意:我问这些问题是因为我怀疑您的问题是这样的一个例子:您询问如何使用Jetty组件,但实际的解决方案可能是完全使用另一个Camel组件。为了回答上述问题-是的,我们想盲目地将original.com/foo/bar1重定向到new.com/foo/bar,而当前使用spring RestController和jetty的其余端点保持不变