98.8. 例子


在以下路由中,我们使用 Netty HTTP 作为 HTTP 服务器,它会返回硬编码的"Bye World"消息。

    from("netty-http:http://0.0.0.0:8080/foo")
      .transform().constant("Bye World");
Copy to Clipboard Toggle word wrap

我们也可以使用 Camel 调用此 HTTP 服务器,并使用 ProducerTemplate 调用,如下所示:

    String out = template.requestBody("netty-http:http://0.0.0.0:8080/foo", "Hello World", String.class);
    System.out.println(out);
Copy to Clipboard Toggle word wrap

我们返回"Bye World"作为输出。

98.8.1. 如何让 Netty 匹配通配符

默认情况下,Netty HTTP 仅匹配精确的 uri。但是,您可以指示 Netty 与前缀匹配。例如:

from("netty-http:http://0.0.0.0:8123/foo").to("mock:foo");
Copy to Clipboard Toggle word wrap

在以上 Netty HTTP 的路由中,只有 uri 是完全匹配,因此如果您输入 http://0.0.0.0:8123/foo 但没有匹配,它将匹配。http://0.0.0.0:8123/foo/bar

因此,如果要启用通配符匹配,如下所示:

from("netty-http:http://0.0.0.0:8123/foo?matchOnUriPrefix=true").to("mock:foo");
Copy to Clipboard Toggle word wrap

现在,Netty 与任何以 foo 开头的端点匹配。

要匹配 任何 端点,您可以:

from("netty-http:http://0.0.0.0:8123?matchOnUriPrefix=true").to("mock:foo");
Copy to Clipboard Toggle word wrap

98.8.2. 使用具有相同端口的多个路由

在同一个 CamelContext 中,您可以有多个来自 Netty HTTP 的路由,它们共享相同的端口(如 io.netty.bootstrap.ServerBootstrap 实例)。这样做需要路由中的多个 bootstrap 选项相同,因为路由将共享相同的 io.netty.bootstrap.ServerBootstrap 实例。该实例将配置有第一个路由的选项。

路由的选项必须相同,这是 org.apache.camel.component.netty.NettyServerBootstrapConfiguration 配置类中定义的所有选项。如果您使用不同的选项配置了另一个路由,则 Camel 会在启动时抛出异常,表示选项不相同。要缓解这个问题,请确保所有选项都相同。

下面是一个共享同一端口的两个路由的示例。

共享同一端口的两个路由

from("netty-http:http://0.0.0.0:{{port}}/foo")
  .to("mock:foo")
  .transform().constant("Bye World");

from("netty-http:http://0.0.0.0:{{port}}/bar")
  .to("mock:bar")
  .transform().constant("Bye Camel");
Copy to Clipboard Toggle word wrap

下面是一个错误配置的 2 个路由示例,它没有与 1st 路由相同的 org.apache.camel.component.netty.NettyServerBootstrapConfiguration 选项。这将导致 Camel 在启动时失败。

共享同一端口的两个路由,但第 2 个路由配置错误

在启动时,和 将失败

from("netty-http:http://0.0.0.0:{{port}}/foo")
  .to("mock:foo")
  .transform().constant("Bye World");

// we cannot have a 2nd route on same port with SSL enabled, when the 1st route is NOT
from("netty-http:http://0.0.0.0:{{port}}/bar?ssl=true")
  .to("mock:bar")
  .transform().constant("Bye Camel");
Copy to Clipboard Toggle word wrap

通过在 org.apache.camel.component.netty.NettyServerBootstrapConfiguration 类型的单一实例中配置 common server bootstrap 选项,我们可以在 Netty HTTP 用户中使用 bootstrapConfiguration 选项来引用并重复使用所有消费者中的相同选项。

<bean id="nettyHttpBootstrapOptions" class="org.apache.camel.component.netty.NettyServerBootstrapConfiguration">
  <property name="backlog" value="200"/>
  <property name="connectionTimeout" value="20000"/>
  <property name="workerCount" value="16"/>
</bean>
Copy to Clipboard Toggle word wrap

在路由中,您可以引用这个选项,如下所示

<route>
  <from uri="netty-http:http://0.0.0.0:{{port}}/foo?bootstrapConfiguration=#nettyHttpBootstrapOptions"/>
  ...
</route>

<route>
  <from uri="netty-http:http://0.0.0.0:{{port}}/bar?bootstrapConfiguration=#nettyHttpBootstrapOptions"/>
  ...
</route>

<route>
  <from uri="netty-http:http://0.0.0.0:{{port}}/beer?bootstrapConfiguration=#nettyHttpBootstrapOptions"/>
  ...
</route>
Copy to Clipboard Toggle word wrap

如需了解更多详细信息和示例,请参阅上述 Netty HTTP Server Example。

98.8.5. 实现反向代理

Netty HTTP 组件可以充当反向代理,在这种情况下,Exchange.HTTP_SCHEMEExchange.HTTP_HOSTExchange.HTTP_PORT 标头是从 HTTP 请求请求行上收到的绝对 URL 填充的。

以下是 HTTP 代理的示例,只是将响应从原始服务器转换为大写。

from("netty-http:proxy://0.0.0.0:8080")
    .toD("netty-http:"
        + "${headers." + Exchange.HTTP_SCHEME + "}://"
        + "${headers." + Exchange.HTTP_HOST + "}:"
        + "${headers." + Exchange.HTTP_PORT + "}")
    .process(this::processResponse);

void processResponse(final Exchange exchange) {
    final NettyHttpMessage message = exchange.getIn(NettyHttpMessage.class);
    final FullHttpResponse response = message.getHttpResponse();

    final ByteBuf buf = response.content();
    final String string = buf.toString(StandardCharsets.UTF_8);

    buf.resetWriterIndex();
    ByteBufUtil.writeUtf8(buf, string.toUpperCase(Locale.US));
}
Copy to Clipboard Toggle word wrap
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat