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

Java 如何在Netty中基于URI路由请求?,java,netty,Java,Netty,我是Netty的新手,为了更熟悉它,我正在构建一个简单的HTTP服务器。我想做的一件事是处理基于URI的路由。我四处寻找例子,找到了一些方法,想看看哪种方法最有意义 拥有一个“路由”处理程序,该处理程序将根据HTTPMessage中的URI添加/删除其他处理程序。如果我必须为每一个请求都这样做,那么这似乎效率低下 让“路由”处理程序将HTTPMessage和HTTPContent包装在另一个对象中,然后将其传递给相应的处理程序。例如,我可以有一个扩展SimpleChannelInboundHan

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

  • 拥有一个“路由”处理程序,该处理程序将根据HTTPMessage中的URI添加/删除其他处理程序。如果我必须为每一个请求都这样做,那么这似乎效率低下

  • 让“路由”处理程序将HTTPMessage和HTTPContent包装在另一个对象中,然后将其传递给相应的处理程序。例如,我可以有一个扩展SimpleChannelInboundHandler和router InfoHTTPRequest对象的InfoHandler。通过这种方式,管道保持固定,我不会动态地改变它——尽管我正在创建更多的对象

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


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

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

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

    public interface RequestResolver<T> {
        void execute(@Nonnull ChannelHandlerContext ctx, @Nonnull T req);
    }
    
    公共接口请求解析程序{
    void execute(@Nonnull ChannelHandlerContext ctx,@Nonnull T req);
    }
    
    请求解析器负责决定如何处理请求(如有必要,路由),通常会传递到已在其上注册的一个或多个操作,或返回404。它与管道没有太多关系,只是需要一个ctx来排队响应


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

    感谢分享-这似乎与我列表中的#3最为相似,但肯定是一种更普遍的方法。你的实现是公开的吗?如果是的话,我很想看看。恐怕代码属于我的客户,而不是开源的。如果将来情况有所改变,我会告诉你的。