如何在Netty中基于URI路由请求?

Dan*_*din 6 java netty

我是Netty的新手,为了更熟悉它,我正在构建一个简单的HTTP服务器.我想做的一件事是处理基于URI的路由.我四处寻找示例并找到了一些方法,并希望看到最有意义的方法.

  1. 有一个"路由"处理程序,它将根据HTTPMessage中的URI添加/删除其他人.如果我必须为每个请求执行此操作,这似乎效率低下.

  2. 让"route"处理程序将HTTPMessage和HTTPContent包装在另一个对象中,然后将该对象传递给适当的处理程序.例如,我可以拥有一个扩展SimpleChannelInboundHandler和路由器InfoHTTPRequest对象的InfoHandler.这样管道保持固定,我不会动态改变它 - 我创造了更多的物体.

  3. 拥有一个只有处理不同端点的方法的路由处理程序.我可以有一个handleInfo方法,一个handleUpdate方法等,每个方法都有自己的实现并引用它们自己的依赖项.

PS - 我正在使用Netty 4.0,我的大部分理解来自各种在线研究和阅读Netty In Action一书.

Der*_*est 2

我使用固定管道,仅负责解码/编码请求/响应(以及可选的聚合、压缩、静态标头等)。

管道中的最终处理程序传递给可配置的 RequestResolver(通用以支持除 HTTP 之外的类型),它看起来有点像:

public interface RequestResolver<T> {
    void execute(@Nonnull ChannelHandlerContext ctx, @Nonnull T req);
}
Run Code Online (Sandbox Code Playgroud)

请求解析器负责决定如何处理请求(即必要时进行路由),并且通常会传递给已在其上注册的一个或多个操作,或者返回 404。它与管道没有任何关系除了需要一个 ctx 来对响应进行排队之外,就这么多了。

我在 Netty 4 是 alpha-01 时就开始使用它,当时没有可用的路由框架插件,所以我用 Java 编写了自己的 RequestResolver,最近我又用 Clojure 编写了另一个,它重新使用了 Compojure 中的 Clout 路由。