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

2021-08-10 09:05:40 +08:00
 wangxiaoaer

类似 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 了?)也不擅长,有没有轻量级点的?

4938 次点击
所在节点    问与答
28 条回复
akira
2021-08-10 22:55:23 +08:00
如果你有多个程序在提供 api 接口服务,
并且都有一堆类似的,但是和 业务无关的需求,
抽象出来的那个东西,就叫做 api 网关
SSang
2021-09-02 09:40:20 +08:00
对于 "网关如果要做到认证、鉴权、流控等等,必须要跟业务深度绑定",这本身对也不对,要看你准备怎么用。

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

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

但像是阿里云、AWS 等,他们的网关会对接鉴权系统( IAM )(实际上是反过来,IAM 对接网关,IAM 才是核心),而不是接 OAuth/JWT 这种简单的插件,这时候,权限管理,授权,鉴权都在 IAM 系统完成。请求进入网关后转发到 IAM,IAM 会直接告诉你你有没有权限访问你请求的资源。这时候鉴权过程就完全不需要业务参与。也就可以做到你说的,和业务解绑。
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
2021-09-02 10:06:46 +08:00
不过 API 网关还有个比较新的概念,叫 Consumer,我玩意似乎可以做到类似 RBAC 的效果,我正在研究
SSang
2021-09-02 10:19:58 +08:00
至于你后面的那个例子,鉴权这东西就是要么在网关做,要么后端做,当然了,如果后端本身有了鉴权,网关还要做也行,请求正常走网关的鉴权,要带 key 业务自己带就好了,(或者这个接口本身能写 cookies 之类的也行,主流的几个网关都有请求改写的功能,由网关做请求改写也行)
SSang
2021-09-02 10:39:29 +08:00
多嘴一句,像是 APISIX 他的 Features 里面都只写了 Authentications (身份认证),根本没有地方有写 Authorization (授权),所以那些文档,只能说误导性极强吧。

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

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

IAM 系统:OpenIAM 、KeyCloak

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

如果是企业内,除非只要很简单的逻辑,我建议,网关用开源的方案,IAM 自己实现,因为 IAM 系统看起来很通用,实际上非常的业务相关,很多时候企业内都会有那么几个比较特殊的需求,用开源的无法实现(当然如果是小功能也可以选择用开源,然后回馈社区)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/794757

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX