API 网关设计 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wangxiaoaer
V2EX    问与答

API 网关设计

  •  
  •   wangxiaoaer 2019-01-02 21:08:00 +08:00 3089 次点击
    这是一个创建于 2542 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前后端分离应用,后端提供接口供 web mobile 使用,这些接口又分为两大类,一部分由应用本身使用,另外一部分可能供第三方调用。

    目前看到很多对外提供接口的都是通过 api.example.com 这种二级域名的方式。

    所以想问下需要把对第三方提供的 api 接口剥离出来,建立一个应用,专门映射到 api.example.com 吗?然后在这个应用内部在转发到接口的具体实现?

    另外,还有几个问题想确认:

    1 API 应用的版本怎么处理?比如 api.example.com/user/v1.... ,是不同版本转发到不同实现,还是在具体的 API 实现里面进行区分?

    2 API 的流量控制、授权感觉集中做比较好,但是一些涉及到粒度比较细的权限控制必须有具体的 API 实现来控制,怎么办?

    我们目前的应用是一个大的应用,基于 spring boot,还有部分基于 node 的,主流怎么应对这种需求?

    18 条回复    2019-01-03 12:14:55 +08:00
    lhx2008
        1
    lhx2008  
       2019-01-02 21:16:03 +08:00 via Android
    可以参考 rest 的设计方法,
    一般版本号就 api.example.com/v1/user
    公开接口的要提前想好,只加不改,要么就全改。自己的接口就可以随便点。
    如果是 spring 栈的话就接过去 zuul 或者别的 spring cloud 网关来搞,包括鉴权和流控
    spring 和 node 服务也是统一走网关
    ibegyourpardon
        2
    ibegyourpardon  
       2019-01-02 21:17:16 +08:00
    我们现在的 api 也还是直接 laravel 走起。
    但已经在前面的 nginx 层开始做一些处理了,今后会把 nginx 作为 api.example.com 的直接输出,后端再具体分发到不同的后端服务去。

    版本的话处理方法很多的,但我还是倾向于把版本处理交给更后层处理而不是集中在前面。
    因为我的理解中,除了授权等控制行为外,API 网关还有个重要的事是第一层路由。
    我个人目前工作中是试图把 API 网关作为纯路由,至于那种控制和集中处理的事应该由另外一个配置中心来处理,对 API 网关进行操作。
    yidinghe
        3
    yidinghe  
       2019-01-02 21:22:04 +08:00 via Android
    1、版本可以考虑独立部署(每个版本独立部署一套)、代理分流( Nginx 根据版本号转发到各自的服务)。
    2、授权方面建议参考 OAuth 的概念。

    不管服务是 Java 还是 nodejs 实现的,神圣的 HTTP 连接着我们每一个服务。
    wangxiaoaer
        4
    wangxiaoaer  
    OP
       2019-01-02 21:23:52 +08:00
    @ibegyourpardon #2 就是说具体的 api 实现还是在原本应用,api.example.com 只是通过 nginx 把一些 api 抽取出来,暴露到外面吗?这样的话,怎么对这些 api 做控制、限流等?
    wangxiaoaer
        5
    wangxiaoaer  
    OP
       2019-01-02 21:25:16 +08:00
    @yidinghe #3 我也觉得一个版本一个服务应该是很清晰的。
    ibegyourpardon
        6
    ibegyourpardon  
       2019-01-02 21:29:52 +08:00
    @wangxiaoaer 目前我这只是第一步,先做一个拆分,把路由层和应用分开。

    之后会考虑用 lua 进行对 nginx 的控制,有一个专门的应用用于将后端的限流控制等注入进 nginx。
    sipbw
        7
    sipbw  
       2019-01-02 21:33:37 +08:00
    请教一下,刚创建的主题怎么在问与答的列表中找不到。
    楼主不好意思,借贴问一下。。
    wangxiaoaer
        8
    wangxiaoaer  
    OP
       2019-01-02 21:33:45 +08:00
    @ibegyourpardon #6 lua 是基于 nginx 的一种方案,看来我的理解也差不多,就是路由层也是需要有逻辑的。

    我们目前还在考虑慢慢把服务容器化,可以部署多个实例,并且是动态的,这就涉及到服务发现,感觉还是有点繁琐。

    zuul 没用过,不知道对非 spring 的应用支不支持,而且也感觉 jvm 太重,想找个轻量点的实现。
    lincanbin
        9
    lincanbin  
       2019-01-02 21:33:48 +08:00
    专门做一个 API 网关应用。
    另外我个人不喜欢 restful,做监控的时候要对 restful 的 api 的 path 专门做一次合并,麻烦。
    wangxiaoaer
        10
    wangxiaoaer  
    OP
       2019-01-02 21:35:59 +08:00
    @lincanbin #9 我也倾向于专门做,看 8 楼回复,但是实现方案呢?涉及到服务转发,负载均衡调度算法、服务监控、流量统计等。
    whileFalse
        11
    whileFalse  
       2019-01-02 21:38:52 +08:00
    一套也可以。一套就是官方客户端和第三方授权之后拿到的权限列表不同。
    ibegyourpardon
        12
    ibegyourpardon  
       2019-01-02 21:39:44 +08:00
    @wangxiaoaer 对,本质上肯定会有逻辑处理。不过我是参考了若干大公司的方案后,然后……全部抛开。

    小公司,小项目,不需要还搞专门的服务配置和注册中心。

    裸 nginx 先上了看看好不好再说。
    wangxiaoaer
        13
    wangxiaoaer  
    OP
       2019-01-02 21:41:09 +08:00
    @ibegyourpardon #12 哈哈,关键是 lua 我们一点都不熟悉。
    ibegyourpardon
        14
    ibegyourpardon  
       2019-01-02 22:38:23 +08:00
    @wangxiaoaer 同不熟悉,毫无基础。

    但我想明白了这么两件事。(至少我自以为想明白了)

    1 不管你怎么个 API 网关,用什么语言写,用什么控制,对我这样的小公司,在最前端这件事上,找不到任何比 Nginx 还要靠谱和适合我的工具了。 对,我是可以直接拿应用顶上去,要什么 Nginx,反正我们流量也不大……但我不敢,也不想。

    2 Lua 我一点都不熟悉,但分析之后觉得我在这个层面上,并不需要让 Nginx 负责太多的逻辑,对我而言我更需要的是 Lua 给我实现接口,我可以由其他工具把我要的 Nginx 配置规则给塞过去并加载。我觉得从这个层面而言,并不需要我有太强的 Lua 方面的知识储备……

    就……艺不高人也胆大吧……
    ooh
        15
    ooh  
       2019-01-03 00:06:19 +08:00   1
    wangxiaoaer
        16
    wangxiaoaer  
    OP
       2019-01-03 09:47:45 +08:00
    @ooh #15 试了试,docker 安装了好几次跑不起来,作罢。
    ooh
        17
    ooh  
       2019-01-03 11:29:16 +08:00
    @wangxiaoaer

    https://gist.github.com/40robber/71965e9e4146c523d71c0b4aaa30c3ca

    这个可以,最新的 1.0 测试版本好像有些变化,kong-dashboard 好像还没支持
    wangxiaoaer
        18
    wangxiaoaer  
    OP
       2019-01-03 12:14:55 +08:00
    @ooh #17 多谢,我试一试
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2747 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 14:49 PVG 22:49 LAX 06:49 JFK 09:49
    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