V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
wangxiaoaer
V2EX  ›  问与答

API 网关设计

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

    前后端分离应用,后端提供接口供 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   ·   实用小工具   ·   5513 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 01:42 · PVG 09:42 · LAX 17:42 · JFK 20:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.