Web 应用程序中的 apache camel "Jetty vs Servlet"

apache camel "Jetty vs Servlet" in web application

在我们的项目中,我们计划使用 apache camel 进行 Web 请求路由/编排。

它基本上是一个网络项目,与其他几个内部网络服务对话,以准备对请求者的最终响应。

有人可以建议,best/standard 在 camel 网络应用程序中使用网络请求的方式是什么?

我相信在骆驼中有多种选择是可能的:

如果有人曾经这样做过并且可以指导,那将是非常有帮助的。 任何诸如优缺点之类的指针也非常感谢。

注意:正如我上面提到的,我们不希望在项目中有任何spring相关的依赖项。

Jetty 是接收来自给定 URL 的请求的最简单方法。

from("jetty:http://localhost:{{port}}/myapp/myservice")
    .process() // do something with the Exchange

这很容易获得 运行 但是您最终可能会使用一些棘手的路由规则来区分 GET、POST 等。恕我直言,骆驼路线中的多条执行路径(即拆分、选择等)can/will 成为粗心者的陷阱。

Servlets 比较棘手,因为您需要编写 Servlet 实现并将其注册到 Servlet 容器中(例如通过 web.xml),结果是相同的 - 您会收到一个 HTTP 请求交换。

web.xml

<web-app>
  <servlet>
    <servlet-name>CamelServlet</servlet-name>
    <display-name>Camel Http Transport Servlet</display-name>
    <servlet-class>org.apache.camel.component.servlet.CamelHttpTransportServlet</servlet-class>
  </servlet>  
  <servlet-mapping>
    <servlet-name>CamelServlet</servlet-name>
    <url-pattern>/services/*</url-pattern>
  </servlet-mapping> 
</web-app>

RouteBuilder
    from("servlet:///hello?matchOnUriPrefix=true").process(new Processor() {
        // do stuff

我认为这与码头组件相比没有任何优势。

Camel Rest DSL 是我的选择。它是一个简单的 DSL,用于描述具有良好 REST 语义的 HTTP 端点,路由规则一目了然,而且相对简洁。不过,这仅适用于 2.14 以后的版本..

       rest("/say")
            .get("/hello").to("direct:hello")
            .get("/bye").consumes("application/json").to("direct:bye")
            .post("/bye").to("mock:update");

        from("direct:hello")
            .transform().constant("Hello World");
        from("direct:bye")
            .transform().constant("Bye World");