API 网关到底适用于什么场景 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wangxiaoaer
V2EX    问与答

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

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

    类似 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  
      &nsp;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   7
    针对你说的这几点,做一个个人浅显的回答:
    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     Solana     3625 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 00:48 PVG 08:48 LAX 17:48 JFK 20:48
    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