|
. G8 i( b8 r( E6 x3 i& o, N 作者:刘维,API7.ai 网关开发工程师摘要:本文介绍 API 货币化的概念,应用场景和具体实践。 4 U: s( j2 W) b8 J1 h, e0 T# c
什么是 API 货币化?想象一下,你成功开发并部署了一个服务,可以搜集你所在城市所有超市的打折和优惠信息现在,有开发者想使用你的服务,需要你提供相应的 API,他们将付费获取你的授权服务,然后通过你开发的 API 得到打折与优惠信息。 3 r# s, w" U) ]" r
像这样通过 API 的方式将数据的使用转化为金钱的模式,就叫做 API 货币化API 货币化是使 API 网络服务获得盈利的理想方式在决定采用 API 货币化的商业模式后,首先需要考虑的就是如何计费通常有两种计费方式:。 7 `7 J8 i7 `3 d: K7 c" Z
1.按次收费2.服务订阅不管采用哪种方式,都需要统计不同身份用户调用 API 的数量,对超出一定数量的用户要进行限流和限速操作所以,计费的关键点在于能否识别出用户的身份大部分购买服务的用户属于企业员工该群体登录企业账号后,理应能够共享同一个计费账号,所以能否识别出用户所属组织也同样重要。 ; C$ S! [/ C0 O' u0 l2 s
API 货币化有哪些应用?现实生活中 API 货币化的应用无处不在,例如最常见的验证码功能、云厂商提供的消息队列与文字识别服务、安全厂家提供的 WAF (Web 应用防火墙)与内容过滤等服务这些服务模式的市场需求量十分庞大,以至于我们迫切需要一个合适的技术栈来为 API 货币化打下坚实的基础,也就是说我们需要对 API 进行精细化管理。 1 @, M: C# J* \3 g! S3 w0 p
在管理 API 时,我们需要控制不同身份的用户在不同场景下的发布权限,并且要确保发布这些 API 符合组织标准,诸如 URL 模式、命名约定、访问控制规则等不同职能的部门对 API 的管理手段也不尽相同,通常包括对已发布的 API 进行更新或设计改进;执行流量控制、速率限制和安全策略等;实时观测 API 使用情况、性能及其他指标。
" Y- N8 V$ Q! \; b% b s 用来管理并解决使用 API 过程中的各种问题的工具,就叫做 API 网关作为中央代理,API 网关将所有从客户端传入的请求路由到预定的目的地(后端服务),使 API 更安全、更易于管理API 网关通常支持各种授权和认证协议,能够对 API 进行复杂的权限控制,还有速率限制等诸多功能。
; g0 e7 I4 V" \$ Z 目前市面上有许多流行的 API 网关开源项目,其中较引人注目、且广泛应用的就是 Apache APISIX(云原生微服务网关)和其替代的企业 SaaS 解决方案 API7 Cloud (https://www.apiseven.com/)。 ! [ O) O1 z; {3 |( A, Y
APISIX 的 API 货币化实践Apache APISIX 不仅支持上述的各种功能,通过其丰富的插件,还支持与 Prometheus、OpenTelemetry、Apache Skywalking 等多种可观察性平台进行集成,以进一步增强其分析 API 的能力并获得完整的可视性。
. y$ F. W% ^7 T) P. J) X7 } 针对上文提到的识别用户身份,Apache APISIX 提出了 Consumer(消费者)的概念不同 Consumer 对应不同的用户,通过在 Consumer 上绑定对应的插件和上游,不同的 Consumer 请求同一个 API。
: @ N- n9 `. c3 _( N6 C7 x 经用户认证体系识别后,网关服务根据当前请求用户的信息,自动匹配不同的 Plugin 或 Upstream 配置,此举为差异化用户管理提供了极大的便利 " z) s/ } L( N
针对前文提到的同一企业多个不同职能的用户,仅支持 Consumer 还不足以满足需求当多个 Consumer 共享同一个消费额度,若只管理每个 Consumer 的配置,操作就会过于繁琐因此 APISIX 提出了 Consumer Group 的概念,有了 Consumer Group,多个 Consumer 就能共享同一套配置和同一个消费配额。 $ x% L, r' {6 B; o& ?- P
以上是 Apache APISIX 在 API 货币化上的实践思路,下面我们来看看具体的应用与配置以下示例可为企业配置限流限速,让企业的用户共享同一配置# create consumer groupcurl http://127.0.0.1:9180/apisix/admin/consumer_groups/company_a -H X-API-KEY: edd1c9f034335f136f87ad84b625c8f1 -X PUT -d
6 }% ]" \3 y" J+ l6 ?0 \. Y "plugins": {"limit-count": {"count": 200,"time_window": 60,"rejected_code": 503,"group": "$consumer_group_id"
* e4 }# [' W% b/ Q7 f5 P1 C # create consumer 1curl http://127.0.0.1:9180/apisix/admin/consumers -H X-API-KEY: edd1c9f034335f136f87ad84b625c8f1 -X PUT -d 0 Y7 J, O* U8 Q2 q
"username": "jack","plugins": {"key-auth": {"key": "auth-one"},"group_id": "company_a"# create consumer 2 ( D5 X- i; a: u3 ~- U% S# E9 ]! S# ]
curl http://127.0.0.1:9180/apisix/admin/consumers -H X-API-KEY: edd1c9f034335f136f87ad84b625c8f1 -X PUT -d ! g# K9 x; f( [3 ]; ]2 g: J |
"username": "johnson","plugins": {"key-auth": {"key": "auth-two"},"group_id": "company_a"# create route & ^8 @8 u0 J% P, Y2 \# K( R# H
curl http://127.0.0.1:9180/apisix/admin/routes/1 -H X-API-KEY: edd1c9f034335f136f87ad84b625c8f1 -X PUT -d + e P2 [. r5 H# d( |' _
"uri": "/get","plugins": {"key-auth": {}},"upstream": {"type": "roundrobin","nodes": {"httpbin.org": 1
3 F5 h3 v6 E& K. b \! Z: S2 h' j # hit the routecurl -i http://127.0.0.1:9180/get -H apikey: auth-oneX-RateLimit-Limit: 200X-RateLimit-Remaining: 199
- ~! J. G2 K4 t8 g8 R curl -i http://127.0.0.1:9180/get -H apikey: auth-twoX-RateLimit-Limit: 200X-RateLimit-Remaining: 198 ( O- t$ G! x. w6 v2 e
# change count value to 2 requests per minutecurl http://127.0.0.1:9180/apisix/admin/consumer_groups/company_a -H X-API-KEY: edd1c9f034335f136f87ad84b625c8f1 -X PUT -d
& @' q( q: H+ w% v' A+ ? "plugins": {"limit-count": {"count": 2,"time_window": 60,"rejected_code": 503,"group": "$consumer_group_id"
/ m( Q X7 C, q3 I; B' \: h # hit the routecurl -i http://127.0.0.1:9180/get -H apikey: auth-twoX-RateLimit-Limit: 2X-RateLimit-Remaining: 1 ' p3 O# }- u: F
curl -i http://127.0.0.1:9180/get -H apikey: auth-oneX-RateLimit-Limit: 2X-RateLimit-Remaining: 0# no count, HTTP 503
/ F4 X1 i$ S8 P3 |) M3 L# | curl -i http://127.0.0.1:9180/get -H apikey: auth-oneHTTP/1.1 503 Service Temporarily Unavailable# after a minute, count recover
1 f* `4 z6 s9 s4 J1 Q$ o2 ~ curl -i http://127.0.0.1:9180/get -H apikey: auth-oneX-RateLimit-Limit: 2X-RateLimit-Remaining: 1# create another route
8 @' @' y: z& @ curl http://127.0.0.1:9180/apisix/admin/routes/2 -H X-API-KEY: edd1c9f034335f136f87ad84b625c8f1 -X PUT -d 9 h* K, c' K- C" x* t
"uri": "/anything","plugins": {"key-auth": {}},"upstream": {"type": "roundrobin","nodes": {"httpbin.org": 1
% [& g+ g6 m. j( [3 g # you could see both routes share the same countcurl -i http://127.0.0.1:9180/get -H apikey: auth-one 6 Z+ I% f& [% \0 Z4 m5 O* u
X-RateLimit-Limit: 2X-RateLimit-Remaining: 1curl -i http://127.0.0.1:9180/anything -H apikey: auth-one $ g5 _$ B5 v1 p$ v9 {$ {6 z3 ]3 g
HTTP/1.1 503 Service Temporarily Unavailable总结不论是企业还是个人,想要通过 API 将数据与服务转化为收入,实现货币化,都需要引入专业的管理工具 —— API 网关。 1 U/ D3 R2 e% X. N6 }7 @. v+ ^ l
Apache APISIX 作为当下最热门的 API 网关之一,在货币化的道路上已经有数百家企业的丰富实践,提出的 “Consumer、Consumer Group” 等概念,极大地方便了用户对 API 的管理,赋能企业 API 货币化顺畅落地。 * c, i3 E& h2 J- |# h( I
OSCHINA 2022中国开源开发者问卷启动你的反馈很重要!点击下方小程序立即参与怎么理解开源世界里的白嫖?
+ L9 r5 J4 x0 C. H
+ J5 [# v' n6 Y s4 W6 j: i! g
% }( }- }. y3 l- j+ }/ c2 u# k
) U: h3 D1 k/ `; U0 t
4 P5 e& ~4 u1 ~2 r: w! n C |