98.8. 例子
在以下路由中,我们使用 Netty HTTP 作为 HTTP 服务器,它会返回硬编码的"Bye World"消息。
from("netty-http:http://0.0.0.0:8080/foo")
.transform().constant("Bye World");
from("netty-http:http://0.0.0.0:8080/foo")
.transform().constant("Bye World");
我们也可以使用 Camel 调用此 HTTP 服务器,并使用 ProducerTemplate 调用,如下所示:
String out = template.requestBody("netty-http:http://0.0.0.0:8080/foo", "Hello World", String.class);
System.out.println(out);
String out = template.requestBody("netty-http:http://0.0.0.0:8080/foo", "Hello World", String.class);
System.out.println(out);
我们返回"Bye World"作为输出。
98.8.1. 如何让 Netty 匹配通配符 复制链接链接已复制到粘贴板!
默认情况下,Netty HTTP 仅匹配精确的 uri。但是,您可以指示 Netty 与前缀匹配。例如:
from("netty-http:http://0.0.0.0:8123/foo").to("mock:foo");
from("netty-http:http://0.0.0.0:8123/foo").to("mock:foo");
在以上 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");
from("netty-http:http://0.0.0.0:8123/foo?matchOnUriPrefix=true").to("mock:foo");
现在,Netty 与任何以 foo 开头的端点匹配。
要匹配 任何 端点,您可以:
from("netty-http:http://0.0.0.0:8123?matchOnUriPrefix=true").to("mock:foo");
from("netty-http:http://0.0.0.0:8123?matchOnUriPrefix=true").to("mock:foo");
98.8.2. 使用具有相同端口的多个路由 复制链接链接已复制到粘贴板!
在同一个 CamelContext 中,您可以有多个来自 Netty HTTP 的路由,它们共享相同的端口(如 io.netty.bootstrap.ServerBootstrap 实例)。这样做需要路由中的多个 bootstrap 选项相同,因为路由将共享相同的 io.netty.bootstrap.ServerBootstrap 实例。该实例将配置有第一个路由的选项。
路由的选项必须相同,这是 org.apache.camel.component.netty.NettyServerBootstrapConfiguration 配置类中定义的所有选项。如果您使用不同的选项配置了另一个路由,则 Camel 会在启动时抛出异常,表示选项不相同。要缓解这个问题,请确保所有选项都相同。
下面是一个共享同一端口的两个路由的示例。
共享同一端口的两个路由
下面是一个错误配置的 2 个路由示例,它没有与 1st 路由相同的 org.apache.camel.component.netty.NettyServerBootstrapConfiguration 选项。这将导致 Camel 在启动时失败。
共享同一端口的两个路由,但第 2 个路由配置错误
在启动时,和 将失败
98.8.3. 使用多个路由重复使用相同的服务器 bootstrap 配置 复制链接链接已复制到粘贴板!
通过在 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>
<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>
在路由中,您可以引用这个选项,如下所示
98.8.4. 在 OSGi 容器中使用多个捆绑包间使用多个路由重复使用相同的服务器 bootstrap 配置 复制链接链接已复制到粘贴板!
如需了解更多详细信息和示例,请参阅上述 Netty HTTP Server Example。
98.8.5. 实现反向代理 复制链接链接已复制到粘贴板!
Netty HTTP 组件可以充当反向代理,在这种情况下,Exchange.HTTP_SCHEME、Exchange.HTTP_HOST 和 Exchange.HTTP_PORT 标头是从 HTTP 请求请求行上收到的绝对 URL 填充的。
以下是 HTTP 代理的示例,只是将响应从原始服务器转换为大写。