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

4885 次点击
所在节点    问与答
28 条回复
dilu
2021-08-10 09:27:34 +08:00
当然是你想晋升但是没啥 kpi 的场景下用咯
wangxiaoaer
2021-08-10 09:29:49 +08:00
@dilu #1 你说的是开发一个网关然后开源那 KPI ?

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

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

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

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

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

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

© 2021 V2EX