类似 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 了?)也不擅长,有没有轻量级点的?
1
dilu 2021-08-10 09:27:34 +08:00 2
当然是你想晋升但是没啥 kpi 的场景下用咯
|
2
wangxiaoaer OP |
3
joesonw 2021-08-10 10:07:17 +08:00
鉴权认证又不是注册. 注册正常去自己业务页面注册, 业务系统通过 oidc 协议(或其他网关所支持的协议)暴露给网关就好了. 只是 api 鉴权需要走这里.
|
4
Rwing 2021-08-10 10:12:15 +08:00
这个怎么说的,真的是说来话长
|
5
des 2021-08-10 10:27:15 +08:00 via iPhone
鉴权和注册都分不清吗?
你把鉴权、授权、认证这三者分清就容易理解了 至于你问的两个问题,可以去找找 OAuth2 和 JWT 的说明就知道是怎么做的的了 |
6
nvkou 2021-08-10 10:28:53 +08:00 via Android
用户为啥要注册?给你 openid 直接用就是,甲,乙不搞混就行了。这个 ID 代表什么才是你的业务
|
7
fkdtz 2021-08-10 10:48:33 +08:00
没有什么是通过分层解决不了的,如果不能,那就再分一层。
|
8
xwayway 2021-08-10 11:00:44 +08:00 7
针对你说的这几点,做一个个人浅显的回答:
1. 转发,比如说你一个微服务架构,支持一个 app 需要用到好几十个系统,你不可能给 app 开发人员几十个域名吧,这不得被骂死。app 统一通过一个域名(流量入口),在网关层,进行请求的转发,然后再返回给 app 端,是不是就友好很多了; 2. 流量控制,不说灰度什么的,就说个蓝绿发布。你上线的时候,总不可能不做控制吧,刚起来的应用,立马就收到大量流量了,或者还在请求你已经 [杀死] 的服务,但注册中心还没下线的服务,这不得大量异常; 3. 鉴权,api 网关的鉴权指的是请求用户对请求资源时候有访问权限,而不是业务上的 key,sign 验证。鉴权统一放在网关做,到了业务系统的流量,都认为是有访问权限的,这样业务系统只关注业务。而且有什么升级改造,都可以在网关统一进行。 以上个人愚见,希望能有所帮助。 |
9
abcbuzhiming 2021-08-10 11:04:33 +08:00
|
10
des 2021-08-10 11:11:50 +08:00 via iPhone
@abcbuzhiming 权限控制是应用做的呀,网关做这个,不就成了“应用”了吗
而且网关上面做这种业务开发,不累吗 |
11
wangxiaoaer OP @xwayway #8
1 没问题 2 我知道流控的目的,我的意思是假设流控策略是跟用户绑定的呢?如果我理解无误,是不是业务系统每个用户都要添加到网关里面作为 consumer,并且设置不同的流控(通过插件配置不同参数)策略? 3 这个鉴权到什么颗粒度?如果像你说的业务上的 key sign 验证不是网关来负责的,那么网关那个鉴权还有什么意义?有哪些使用场景? |
12
A555 2021-08-10 11:23:18 +08:00 1
@abcbuzhiming #9 数据权限在业务系统自己实现
网关鉴权做的事应用的访问授权,不是对于用户的业务数据的授权 |
13
wangxiaoaer OP @des #10 那网关这个鉴权的意义是什么?他跟业务系统权限控制的边界在哪里?
|
14
zoharSoul 2021-08-10 11:27:41 +08:00
@wangxiaoaer #13 网关鉴权一般只做基础的, 比如是否是已登录用户, token 是否合法之类的.
|
15
liuidetmks 2021-08-10 11:36:38 +08:00
@wangxiaoaer 网关鉴权,我理解就是做个格式校验,比如把参数 sort 一下计算下 hmac,通过就放行,不通过就拒绝,最多加个时间戳或者 nonce 的校验防止重放,其他的就管不了了,直接发给后面的 app 了
|
16
ila 2021-08-10 12:07:28 +08:00 via Android
api 调用统计之类的放在网关?
|
17
joesonw 2021-08-10 12:16:29 +08:00
@abcbuzhiming #9 “你访问的数据是属于你的吗”, 一般是请求带着 token/ticket, 由业务方判断. 如果要在不改变业务的前提下的话就需要更灵活的权限控制, 例如 OPA.
|
18
wangxiaoaer OP @liuidetmks 但是看很多文档说的鉴权不仅仅这些。什么 http key oauth2 jwt 等,我寻思着假如网关做不了深层次的鉴权,二是像楼上说的那种只做一般鉴权,那么他的用户体系是什么?肯定要跟业务系统一致的吧。
|
19
ytmsdy 2021-08-10 15:55:19 +08:00
当你整体业务的 api 总量上升到 200 以上的时候,就需要考虑起来了。
|
20
iweisi 2021-08-10 19:15:12 +08:00 1
举个例子,你搭地铁,网关鉴权就是看二维码,绿码通行,具体你去哪里,是不同的地铁线路做的事情,你能不能去也是内部再做一次判断,但是进来了就表示你是正常的,无害
|
21
akira 2021-08-10 22:55:23 +08:00
如果你有多个程序在提供 api 接口服务,
并且都有一堆类似的,但是和 业务无关的需求, 抽象出来的那个东西,就叫做 api 网关 |
22
SSang 2021-09-02 09:40:20 +08:00
对于 "网关如果要做到认证、鉴权、流控等等,必须要跟业务深度绑定",这本身对也不对,要看你准备怎么用。
有几个概念:身份认证、授权、鉴权、权限管理 网关其实只做:身份认证。鉴权授权的操作一般来说不在网关上完成。 授权是通过如 OAuth/JWT 插件实现的(网关把请求转发到授权插件上) 鉴权和权限管理一般是后端服务自己实现的。 鉴权和权限管理也可以在网关做,目前 kong/tyk/apisix 之类的似乎都没有做这方面的 **所以一般认为认证、鉴权、留空格确实是和业务深度绑定的**。 但像是阿里云、AWS 等,他们的网关会对接鉴权系统( IAM )(实际上是反过来,IAM 对接网关,IAM 才是核心),而不是接 OAuth/JWT 这种简单的插件,这时候,权限管理,授权,鉴权都在 IAM 系统完成。请求进入网关后转发到 IAM,IAM 会直接告诉你你有没有权限访问你请求的资源。这时候鉴权过程就完全不需要业务参与。也就可以做到你说的,和业务解绑。 |
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 网关控制台你也看不到鉴权相关的东西,他们本质上都是“转发”(可能不准确)到外面去实现。 |
24
SSang 2021-09-02 10:06:46 +08:00
不过 API 网关还有个比较新的概念,叫 Consumer,我玩意似乎可以做到类似 RBAC 的效果,我正在研究
|
25
SSang 2021-09-02 10:19:58 +08:00
至于你后面的那个例子,鉴权这东西就是要么在网关做,要么后端做,当然了,如果后端本身有了鉴权,网关还要做也行,请求正常走网关的鉴权,要带 key 业务自己带就好了,(或者这个接口本身能写 cookies 之类的也行,主流的几个网关都有请求改写的功能,由网关做请求改写也行)
|
26
SSang 2021-09-02 10:39:29 +08:00
多嘴一句,像是 APISIX 他的 Features 里面都只写了 Authentications (身份认证),根本没有地方有写 Authorization (授权),所以那些文档,只能说误导性极强吧。
也就是说理论上,网关啥都能做,但是很多东西在网关做是不合适的(除非是临时解决方案) 你说的轻量的网关,我推荐没有特别好用的网关就直接用 nginx 吧,功能再丰富的可以是 traefik (无外部依赖,golang 开发的,看起来应该是你的技术栈),apisix 也不算重,国内有些 goku 什么的,也挺轻的。 |
27
wangxiaoaer OP @SSang 多谢老哥的详细解答。你提到的 IAM 那种方式我觉得挺好,网关自己做还是靠插件做还是转发给 IAM 做都无所谓,但是能跟业务解耦我觉得很赞,不知道有没有开源的方案?
|
28
SSang 2022-05-24 11:17:47 +08:00
@wangxiaoaer
IAM 系统:OpenIAM 、KeyCloak 还可以了解一些开源 Devops ,这些系统一般把 IAM 集成到自己的系统,如果有合适的也可以拿来用 如果是企业内,除非只要很简单的逻辑,我建议,网关用开源的方案,IAM 自己实现,因为 IAM 系统看起来很通用,实际上非常的业务相关,很多时候企业内都会有那么几个比较特殊的需求,用开源的无法实现(当然如果是小功能也可以选择用开源,然后回馈社区) |