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

API 网关到底适用于什么场景

  •  1
     
  •   wangxiaoaer · 2021-08-10 09:05:40 +08:00 · 4486 次点击
    这是一个创建于 962 天前的主题,其中的信息可能已经有所发展或是发生改变。

    类似 KONG APISIX 等,各种文档的说法基本都一致,作为后端服务(微服务)的流量入口,进行转发、鉴权、流控等等,看起来是一个跟业务系统相对独立的组建。

    但是又想想,网关如果要做到认证、鉴权、流控等等,必须要跟业务深度绑定啊。拿认证鉴权来说,几乎每个主流网关都提供主流认证方式比如 http 、OAuth2 、JWT 等,可是看完后一脸懵逼,这有啥用?业务系统原本就有自己的用户体系啊,怎么结合起来呢?总不能让用户直接到网关注册吧。

    以聚合数据为例,他提供了众多的 API 供用户调用,肯定涉及到鉴权、流控等等功能:

    https://i.imgur.com/ZtRvE31.png

    如上图,这是聚合数据某个接口的请求地址,需要携带一个”key“的参数,这个 key 也是业务系统用户在业务系统中申请了这个接口后产生的,在这种情况下,能否采用 APISIX 这种网关呢?如果可以的话问题来了:

    1 网关怎么判断这个 key 是否合法

    2 如何根据 key 获得用户信息,进而针对性的进行流控?

    网关和业务系统必然要有个机制进行信息同步,比如业务系统有一个新的 key 产生,这个 key 对应的调用次数、访问频率等信息跟 key 是绑定的,是否都要把这些信息同步到网关? 如果同步的话,网关的最细粒度都是路由级别,难道每个路由、每个 key 都同步对应的规则过去?感觉这个量很大啊。

    网关这一块很早就在关注,但一直没有用起来,希望大佬指点指点。

    另外,感觉 KONG 太重了,而且基于 lua 开发插件(虽然 2.0 好像支持 golang 了?)也不擅长,有没有轻量级点的?

    28 条回复    2022-05-24 11:17:47 +08:00
    dilu
        1
    dilu  
       2021-08-10 09:27:34 +08:00   ❤️ 2
    当然是你想晋升但是没啥 kpi 的场景下用咯
    wangxiaoaer
        2
    wangxiaoaer  
    OP
       2021-08-10 09:29:49 +08:00
    @dilu #1 你说的是开发一个网关然后开源那 KPI ?

    我考虑的是这个网关跟业务具体是怎么衔接起来的,比如 KONG 这种比较知名的,应该不是 KPI 产物吧。
    joesonw
        3
    joesonw  
       2021-08-10 10:07:17 +08:00
    鉴权认证又不是注册. 注册正常去自己业务页面注册, 业务系统通过 oidc 协议(或其他网关所支持的协议)暴露给网关就好了. 只是 api 鉴权需要走这里.
    Rwing
        4
    Rwing  
       2021-08-10 10:12:15 +08:00
    这个怎么说的,真的是说来话长
    des
        5
    des  
       2021-08-10 10:27:15 +08:00 via iPhone
    鉴权和注册都分不清吗?
    你把鉴权、授权、认证这三者分清就容易理解了
    至于你问的两个问题,可以去找找 OAuth2 和 JWT 的说明就知道是怎么做的的了
    nvkou
        6
    nvkou  
       2021-08-10 10:28:53 +08:00 via Android
    用户为啥要注册?给你 openid 直接用就是,甲,乙不搞混就行了。这个 ID 代表什么才是你的业务
    fkdtz
        7
    fkdtz  
       2021-08-10 10:48:33 +08:00
    没有什么是通过分层解决不了的,如果不能,那就再分一层。
    xwayway
        8
    xwayway  
       2021-08-10 11:00:44 +08:00   ❤️ 6
    针对你说的这几点,做一个个人浅显的回答:
    1. 转发,比如说你一个微服务架构,支持一个 app 需要用到好几十个系统,你不可能给 app 开发人员几十个域名吧,这不得被骂死。app 统一通过一个域名(流量入口),在网关层,进行请求的转发,然后再返回给 app 端,是不是就友好很多了;
    2. 流量控制,不说灰度什么的,就说个蓝绿发布。你上线的时候,总不可能不做控制吧,刚起来的应用,立马就收到大量流量了,或者还在请求你已经 [杀死] 的服务,但注册中心还没下线的服务,这不得大量异常;
    3. 鉴权,api 网关的鉴权指的是请求用户对请求资源时候有访问权限,而不是业务上的 key,sign 验证。鉴权统一放在网关做,到了业务系统的流量,都认为是有访问权限的,这样业务系统只关注业务。而且有什么升级改造,都可以在网关统一进行。
    以上个人愚见,希望能有所帮助。
    abcbuzhiming
        9
    abcbuzhiming  
       2021-08-10 11:04:33 +08:00
    @joesonw
    @des
    请教,如何解决数据访问权问题,授权和鉴权往往只能解决角色(你是谁)和一般性授权问题(你能访问这个接口吗),但是实际业务中,往往要解决“你访问的数据是属于你的吗”这个问题,这个问题严格说也是鉴权,但是是业务强相关的。业务强相关的东西,网关做不了
    des
        10
    des  
       2021-08-10 11:11:50 +08:00 via iPhone
    @abcbuzhiming 权限控制是应用做的呀,网关做这个,不就成了“应用”了吗
    而且网关上面做这种业务开发,不累吗
    wangxiaoaer
        11
    wangxiaoaer  
    OP
       2021-08-10 11:22:41 +08:00
    @xwayway #8

    1 没问题
    2 我知道流控的目的,我的意思是假设流控策略是跟用户绑定的呢?如果我理解无误,是不是业务系统每个用户都要添加到网关里面作为 consumer,并且设置不同的流控(通过插件配置不同参数)策略?
    3 这个鉴权到什么颗粒度?如果像你说的业务上的 key sign 验证不是网关来负责的,那么网关那个鉴权还有什么意义?有哪些使用场景?
    A555
        12
    A555  
       2021-08-10 11:23:18 +08:00   ❤️ 1
    @abcbuzhiming #9 数据权限在业务系统自己实现
    网关鉴权做的事应用的访问授权,不是对于用户的业务数据的授权
    wangxiaoaer
        13
    wangxiaoaer  
    OP
       2021-08-10 11:23:41 +08:00
    @des #10 那网关这个鉴权的意义是什么?他跟业务系统权限控制的边界在哪里?
    zoharSoul
        14
    zoharSoul  
       2021-08-10 11:27:41 +08:00
    @wangxiaoaer #13 网关鉴权一般只做基础的, 比如是否是已登录用户, token 是否合法之类的.
    liuidetmks
        15
    liuidetmks  
       2021-08-10 11:36:38 +08:00
    @wangxiaoaer 网关鉴权,我理解就是做个格式校验,比如把参数 sort 一下计算下 hmac,通过就放行,不通过就拒绝,最多加个时间戳或者 nonce 的校验防止重放,其他的就管不了了,直接发给后面的 app 了
    ila
        16
    ila  
       2021-08-10 12:07:28 +08:00 via Android
    api 调用统计之类的放在网关?
    joesonw
        17
    joesonw  
       2021-08-10 12:16:29 +08:00
    @abcbuzhiming #9 “你访问的数据是属于你的吗”, 一般是请求带着 token/ticket, 由业务方判断. 如果要在不改变业务的前提下的话就需要更灵活的权限控制, 例如 OPA.
    wangxiaoaer
        18
    wangxiaoaer  
    OP
       2021-08-10 14:55:15 +08:00 via iPhone
    @liuidetmks 但是看很多文档说的鉴权不仅仅这些。什么 http key oauth2 jwt 等,我寻思着假如网关做不了深层次的鉴权,二是像楼上说的那种只做一般鉴权,那么他的用户体系是什么?肯定要跟业务系统一致的吧。
    ytmsdy
        19
    ytmsdy  
       2021-08-10 15:55:19 +08:00
    当你整体业务的 api 总量上升到 200 以上的时候,就需要考虑起来了。
    iweisi
        20
    iweisi  
       2021-08-10 19:15:12 +08:00   ❤️ 1
    举个例子,你搭地铁,网关鉴权就是看二维码,绿码通行,具体你去哪里,是不同的地铁线路做的事情,你能不能去也是内部再做一次判断,但是进来了就表示你是正常的,无害
    akira
        21
    akira  
       2021-08-10 22:55:23 +08:00
    如果你有多个程序在提供 api 接口服务,
    并且都有一堆类似的,但是和 业务无关的需求,
    抽象出来的那个东西,就叫做 api 网关
    SSang
        22
    SSang  
       2021-09-02 09:40:20 +08:00
    对于 "网关如果要做到认证、鉴权、流控等等,必须要跟业务深度绑定",这本身对也不对,要看你准备怎么用。

    有几个概念:身份认证、授权、鉴权、权限管理

    网关其实只做:身份认证。鉴权授权的操作一般来说不在网关上完成。
    授权是通过如 OAuth/JWT 插件实现的(网关把请求转发到授权插件上)
    鉴权和权限管理一般是后端服务自己实现的。
    鉴权和权限管理也可以在网关做,目前 kong/tyk/apisix 之类的似乎都没有做这方面的
    **所以一般认为认证、鉴权、留空格确实是和业务深度绑定的**。

    但像是阿里云、AWS 等,他们的网关会对接鉴权系统( IAM )(实际上是反过来,IAM 对接网关,IAM 才是核心),而不是接 OAuth/JWT 这种简单的插件,这时候,权限管理,授权,鉴权都在 IAM 系统完成。请求进入网关后转发到 IAM,IAM 会直接告诉你你有没有权限访问你请求的资源。这时候鉴权过程就完全不需要业务参与。也就可以做到你说的,和业务解绑。
    SSang
        23
    SSang  
       2021-09-02 10:03:44 +08:00
    很多文档上都把身份、权限这些搞混了,把 API 网关"吹"的好像什么都能做

    一般来说网关就是类似 nginx 的做流量转发,反向代理,负载均衡、流控、熔断、监控等,kong/apisix 本质上和 ng 做的是同样的工作。

    鉴权,以及更 RBAC 的工作本来就不适合在网关做,比如 nginx 的鉴权就是通过 auth_request 插件转发出去给外部做,自己内部只能做到 basicAuth 。apisix 则是通过 wolf-rbac 插件,traefik 则是通过 forwardAuth,几个云服务商的实现不是很清楚,但肯定也不是在网关做,比如阿里云就有 IDaas,在阿里云的 API 网关控制台你也看不到鉴权相关的东西,他们本质上都是“转发”(可能不准确)到外面去实现。
    SSang
        24
    SSang  
       2021-09-02 10:06:46 +08:00
    不过 API 网关还有个比较新的概念,叫 Consumer,我玩意似乎可以做到类似 RBAC 的效果,我正在研究
    SSang
        25
    SSang  
       2021-09-02 10:19:58 +08:00
    至于你后面的那个例子,鉴权这东西就是要么在网关做,要么后端做,当然了,如果后端本身有了鉴权,网关还要做也行,请求正常走网关的鉴权,要带 key 业务自己带就好了,(或者这个接口本身能写 cookies 之类的也行,主流的几个网关都有请求改写的功能,由网关做请求改写也行)
    SSang
        26
    SSang  
       2021-09-02 10:39:29 +08:00
    多嘴一句,像是 APISIX 他的 Features 里面都只写了 Authentications (身份认证),根本没有地方有写 Authorization (授权),所以那些文档,只能说误导性极强吧。

    也就是说理论上,网关啥都能做,但是很多东西在网关做是不合适的(除非是临时解决方案)

    你说的轻量的网关,我推荐没有特别好用的网关就直接用 nginx 吧,功能再丰富的可以是 traefik (无外部依赖,golang 开发的,看起来应该是你的技术栈),apisix 也不算重,国内有些 goku 什么的,也挺轻的。
    wangxiaoaer
        27
    wangxiaoaer  
    OP
       2022-05-14 07:58:46 +08:00 via iPhone
    @SSang 多谢老哥的详细解答。你提到的 IAM 那种方式我觉得挺好,网关自己做还是靠插件做还是转发给 IAM 做都无所谓,但是能跟业务解耦我觉得很赞,不知道有没有开源的方案?
    SSang
        28
    SSang  
       2022-05-24 11:17:47 +08:00
    @wangxiaoaer

    IAM 系统:OpenIAM 、KeyCloak

    还可以了解一些开源 Devops ,这些系统一般把 IAM 集成到自己的系统,如果有合适的也可以拿来用

    如果是企业内,除非只要很简单的逻辑,我建议,网关用开源的方案,IAM 自己实现,因为 IAM 系统看起来很通用,实际上非常的业务相关,很多时候企业内都会有那么几个比较特殊的需求,用开源的无法实现(当然如果是小功能也可以选择用开源,然后回馈社区)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5435 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 08:44 · PVG 16:44 · LAX 01:44 · JFK 04:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.