V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hulk
V2EX  ›  程序员

lua-resty-router 实现

  •  
  •   hulk ·
    git-hulk · 2017-04-22 21:06:08 +08:00 · 2984 次点击
    这是一个创建于 2773 天前的主题,其中的信息可能已经有所发展或是发生改变。

    简单的 nginx-lua 路由实现,欢迎一起来玩玩: https://github.com/git-hulk/lua-resty-router

    6 条回复    2017-05-03 00:01:56 +08:00
    artandlol
        1
    artandlol  
       2017-04-22 21:24:59 +08:00 via Android
    早上还有人要搞这个来着 。。。
    hulk
        2
    hulk  
    OP
       2017-04-22 21:40:42 +08:00
    @artandlol 哈哈,抢先一步
    spacewander
        3
    spacewander  
       2017-04-24 00:54:22 +08:00
    仔细看了下代码。
    随便说几点肤浅的想法~
    1. 这个 router 并不依赖于 cosocket 吧……刚打开的时候看到一句 ` based on the cosocket API`,我还以为这个 router 是不是会动态更新路由。
    2. 创建 router 和 使用 router 的场景可以分离。毕竟 router 在响应请求时一般不会再修改内部的配置,无需每次请求都创建一遍。我觉得有必要在 README 中展示这一点。当然 `throw` 函数就要备两份,不能创建和使用 router 都使用同一个。
    3. 如果存在 `get /a/:b/:c`,就不能再定义 `get /a/:b`。但其实这应该是两种路由。感觉节点树的实现还可以更精细些。
    4. 路由没有实现 normalize ,比如我在路由里加个 `../`,就不能正常处理了。而 Nginx 自身的路由是可以处理这种情况的。当然这个就吹毛求疵啦。
    5. router 的匹配里面,如果已知当前节点只有一个子节点(或少数几个子节点),是否可以改用正则匹配的方式去比较呢?这样就可以节省继续解析 token 的花销了。
    spacewander
        4
    spacewander  
       2017-04-24 09:42:46 +08:00   ❤️ 1
    我上面说的第 4 点是错的……
    Nginx 的 `$uri` 本身就已经 normalize 了,是我看代码的时候想当然了。
    hulk
        5
    hulk  
    OP
       2017-05-02 23:21:50 +08:00
    1. 这个是 README 格式 copy 没有去掉,已经 FIX
    2. 是的,例子上可能是有些误导,实际上使用应该是在 init 的时候添加路由,实际使用就不用再关心
    3. 这个是实现的 bug, 如果先添加 `get /a/:b/` 就可以添加 `get /a/:b/:c`, 这个我会 FIX
    5. 这点我后面对比压测下当前的实现和正则的性能差别,如果差别不大,不会去做特殊优化。

    最后以上建议都很棒,感谢回馈~
    hulk
        6
    hulk  
    OP
       2017-05-03 00:01:56 +08:00
    3. 如果存在 `get /a/:b/:c`,就不能再定义 `get /a/:b`。 最新版本已经 FIX
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5544 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 09:24 · PVG 17:24 · LAX 01:24 · JFK 04:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.