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

时间:2014-03-03 17:07:31

标签: java netty

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

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

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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

public interface RequestResolver<T> {
    void execute(@Nonnull ChannelHandlerContext ctx, @Nonnull T req);
}

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

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