基于 node.js 的网关设计. - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
qfdk
V2EX    Node.js

基于 node.js 的网关设计.

  •  
  •   qfdk
    PRO
    2020-12-03 22:13:45 +08:00 4770 次点击
    这是一个创建于 1846 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近需要设计一个 node.js 的网关.

    简单来说就是一个 nodejs 的反向代理.

    Spring 全家桶 里面有 Zuul 这个看门口

    网上都看了一圈 有这么几个选择

    • express-gateway
    • http-proxy

    为了避免造轮子,想跟诸位老哥请教一下.

    说一下我们基本的需求:

    • 高性能
    • 可以发送静态页面
    • 可以鉴权认证 初步 准备 JWT + oauth2 (我们 gateway 是有状态的,我们会把 token 给存在 Redis 里面 然后给客户一个 session, 避免用户之间用 token 来调用我们后端)
    • 可以加 CSRF
    • 根据权限来过滤请求

    再次 谢过

    20 条回复    2022-08-30 09:38:59 +08:00
    chogath
        1
    chogath  
       2020-12-04 10:30:57 +08:00   1
    可以参考下 `@acheetahk/request` 的 fastProxy
    chogath
        3
    chogath  
       2020-12-04 10:32:31 +08:00
    有问题可以给我提 issue
    kenshinhu
        4
    kenshinhu  
       2020-12-04 15:01:10 +08:00
    kong gateway
    qfdk
        5
    qfdk  
    OP
    PRO
       2020-12-04 15:33:26 +08:00 via iPhone
    @kenshinhu 这个看到了 不过不是 nodejs 的技术栈 虽然性能厉害
    qfdk
        6
    qfdk  
    OP
    PRO
       2020-12-04 15:39:28 +08:00 via iPhone
    @chogath humm 回头我好好看一下 不想造轮子
    生产环境用一个开源项目要看下后面的生态的 还有文档等等. 感谢
    chogath
        7
    chogath  
       2020-12-07 10:07:12 +08:00   1
    @qfdk node.js 没有单独做网关的开源包,有的只是零散的方法,目前来看方案有三种:

    1. 使用 http request pipe 重写,代理到目标服务器完成请求转发
    2. 使用 websocket 的方式完成请求转发 # https://docs.nestjs.cn/7/websockets # 参考资料来自 nest.js
    3. 使用 grpc 自己实现 interface + 协议 + 传输格式 + 异常信息定义 # https://docs.nestjs.cn/7/microservices?id=grpc #参考资料来自 nest.js
    chogath
        8
    chogath  
       2020-12-07 10:08:50 +08:00
    我是用的 1 + 3,1 适合常规业务直接调用,3 适合服务间调用(指多个服务调用,或者形成了调用链)
    chogath
       
    chogath  
       2020-12-07 10:10:28 +08:00
    @qfdk 我建议你先吧目前你觉得合适的方案跑成 demo,做一下性能压测和各方面的评估。
    qfdk
        10
    qfdk  
    OP
    PRO
       2020-12-09 01:30:59 +08:00 via iPhone
    @chogath 感谢你先 现在看了好几套方案 明天跟同事一起聊一下看看要不要自己做一个. express Gateway 里面坑有些多 开源的大多数不够活跃 最后一次提交都在 1 年多了. 加上一些 redis 的库也没法用. 初步考虑可能用 koa2. 毕竟 Gateway 主要是为了性能来的. 您的建议很好
    qfdk
        11
    qfdk  
    OP
    PRO
       2021-01-26 16:27:17 +08:00
    ∫好了 现在 开始撸轮子了,基于 https://github.com/chimurai/http-proxy-middleware 鉴权用 passport
    qfdk
        12
    qfdk  
    OP
    PRO
       2021-09-14 14:11:03 +08:00
    已经上线了!
    qfdk
        13
    qfdk  
    OP
    PRO
       2021-12-27 17:09:10 +08:00 via iPhone
    @chogath 回来看看,发现还好自己撸了一个…..
    LawlietZ
        14
    LawlietZ  
       2021-12-28 15:21:06 +08:00
    @qfdk 给您发了 github 上标的邮件
    lf978
        15
    lf978  
       2022-08-29 22:14:11 +08:00
    老哥 有啥设计思路可以借鉴借鉴吗? 刚好想搞一个
    lf978
        16
    lf978  
       2022-08-29 22:17:29 +08:00
    希望能咨询下哈哈,TEY5Nzg5NTUwMzM=
    qfdk
        17
    qfdk  
    OP
    PRO
       2022-08-29 22:18:30 +08:00 via iPhone
    @lf978 我这里是 Gateway 也鉴权了, 等于这里是个有状态的. 根据请求来判断 某些人是否有某些权限. 如果 token 快要过期了 也是 gateway 续签,token 还有十秒 就续签. 这样请求不会出奇怪的问题. 还有个好处 这样客户端没有 token.
    lf978
        18
    lf978  
       2022-08-29 22:38:55 +08:00
    @qfdk 是来了一个 http 请求 然后 gateway 在发出去一个 http 请求吗? 然后 gateway 保留状态。
    qfdk
        19
    qfdk  
    OP
    PRO
       2022-08-30 00:47:23 +08:00
    @lf978 #18 不是,是这样的。gateway 的作用 可以把来的流分给不同的 微服务,每个微服务有不同的权限。正常没有状态的做法是每个微服务会鉴权一下。鉴权的方式是通过 token 鉴权的。 思想是 gateway 处理请求的统一鉴权,因为 gateway 相当于一个反向代理,这里收到的 http 请求 你知道 这个请求有没有鉴权。如果你搞过前端,有的是通过访问 /current/user 这样来确定你是否登录。但是用了 gateway 任何请求都知道你有没有登录。因为 gateway 那边会存一个 session 这个 session 用来记录用户的状态。不知道明白了没有 ?
    lf978
        20
    lf978  
       2022-08-30 09:38:59 +08:00
    @qfdk 嗯嗯 我懂你说的, 我是做前端的, 想问下: 可以把来的流分给不同的 “微服务” 这个微服务在这里是指后端的 http 接口是吧
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2942 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 13:45 PVG 21:45 LAX 05:45 JFK 08:45
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86