趣谈之什么是 API 货币化?

更新时间 2022-10-27

什么是 API 货币化

想象你开发并部署了一个服务,能够搜集你所在城市所有超市的打折和优惠信息,其他的开发者想要使用你的数据,就需要你提供相应的 API, 然后其他开发者通过支付费用获得你的授权,再使用你提供的 API 获取想要的数据,像这样通过 API 的方式将数据的使用转化为金钱就是 API 货币化,API 货币化是使你的服务盈利的一种理想方式。

API货币化

在决定采用 API 货币化的商业模式后,接下来需要考虑的就是如何计费,可以选择按调用次数计费,或者直接订阅计费,但不管采用哪种计费方式,都需要统计不同用户的 API 调用数量,如果超出数量还需要进行限流限速操作,所以能否识别出用户的身份很关键。但仅仅识别出用户的个人身份还不够,因为往往购买服务的都是企业用户,企业员工在登录企业账号后,需要能够共享同一个计费账号,所以识别出用户所属组织也同样重要。

API 货币化的应用

现实生活中 API 货币化的应用无处不在,例如每个人都要接触的验证码功能,各个云厂商提供的消息队列,文字识别等服务,各个安全厂家提供的 WAF 和内容过滤等服务,这种模式是如此的成功,以至于我们迫切需要一个合适的技术栈来为 API 货币化打下坚实的基础,也就是说我们需要对 API 进行精细的管理。

在管理 API 时,我们需要能够控制谁可以在哪里发布什么,并且要确保发布这些 API 符合组织标准,诸如 URL 模式、命名约定、访问控制规则。并且能让每个业务职能部门独立管理自己的 API,包括对已发布的 API 进行更新或设计改进,执行流量控制、速率限制和安全策略。也需要能够实时观测使用情况、性能及其他指标。

要对 API 进行管理需要引入的工具就是 API 网关,API 网关可以帮助你解决管理 API 过程中遇到的各种问题。作为一个中央代理,API 网关将所有从客户端传入的请求路由到预定的目的地(后端服务),使你的 API 更安全和更容易管理,同时大部分 API 网关支持各种授权和认证协议,能够对 API 进行复杂的权限控制,还有速率限制等诸多功能。

有许多流行的 API 网关开源项目,其中最为引人注目的就是 Apache APISIX 和其替代的企业 SaaS 解决方案 API7 Cloud。

APISIX 的 API 货币化实践

Apache APISIX 不仅支持上面提到的各种功能,还通过其丰富的插件,能够与 Prometheus、OpenTelemetry、Apache Skywalking 等多种可观察性平台进行集成,以进一步增强其分析 API 的能力并获得完整的可视性。同时 Apache APISIX 针对上文提到的识别用户身份,提出了 consumer 的概念。

consumer

不同 consumer 对应不同的用户,通过在 consumer 上绑定对应的插件和上游,不同的 consumer 假如请求同一个 API,经用户认证体系识别后,网关服务根据当前请求用户信息,会对应不同的 Plugin 或 Upstream 配置,方便对不同的用户进行管理。

consumer

但是仅仅支持 consumer 还不够,针对上文提到的企业用户,需要多个 consumer 共享同一个消费额度,并且如果只能分别管理每个 consumer 的配置,操作就太过繁琐了。因此 APISIX 提出了 consumer group 的概念,有了 consumer group,多个 consumer 就能共享同一套配置和同一个消费配额。

consumer group

了解了 APISIX 在 API 货币化的实践,下面我们来看看具体的应用。

  • 给企业配置限流限速,企业的用户共享同一配置
1# create consumer group
2curl http://127.0.0.1:9180/apisix/admin/consumer_groups/company_a -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
3{
4    "plugins": {
5        "limit-count": {
6            "count": 200,
7            "time_window": 60,
8            "rejected_code": 503,
9            "group": "$consumer_group_id"
10        }
11    }
12}'
13
14# create consumer 1
15curl http://127.0.0.1:9180/apisix/admin/consumers -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
16{
17    "username": "jack",
18    "plugins": {
19        "key-auth": {
20            "key": "auth-one"
21        }
22    },
23    "group_id": "company_a"
24}'
25
26# create consumer 2
27curl http://127.0.0.1:9180/apisix/admin/consumers -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
28{
29    "username": "johnson",
30    "plugins": {
31        "key-auth": {
32            "key": "auth-two"
33        }
34    },
35    "group_id": "company_a"
36}'
37
38# create route
39curl http://127.0.0.1:9180/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
40{
41    "uri": "/get",
42    "plugins": {
43        "key-auth": {}
44    },
45    "upstream": {
46        "type": "roundrobin",
47        "nodes": {
48            "httpbin.org": 1
49        }
50    }
51}'
52
53# hit the route
54curl -i http://127.0.0.1:9180/get -H 'apikey: auth-one'
55...
56X-RateLimit-Limit: 200
57X-RateLimit-Remaining: 199
58...
59
60curl -i http://127.0.0.1:9180/get -H 'apikey: auth-two'
61...
62X-RateLimit-Limit: 200
63X-RateLimit-Remaining: 198
64...
65
66# change count value to 2 requests per minute
67curl http://127.0.0.1:9180/apisix/admin/consumer_groups/company_a -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
68{
69    "plugins": {
70        "limit-count": {
71            "count": 2,
72            "time_window": 60,
73            "rejected_code": 503,
74            "group": "$consumer_group_id"
75        }
76    }
77}'
78
79# hit the route
80curl -i http://127.0.0.1:9180/get -H 'apikey: auth-two'
81...
82X-RateLimit-Limit: 2
83X-RateLimit-Remaining: 1
84...
85
86
87curl -i http://127.0.0.1:9180/get -H 'apikey: auth-one'
88...
89X-RateLimit-Limit: 2
90X-RateLimit-Remaining: 0
91...
92
93
94# no count, HTTP 503
95curl -i http://127.0.0.1:9180/get -H 'apikey: auth-one'
96HTTP/1.1 503 Service Temporarily Unavailable
97
98
99# after a minute, count recover
100curl -i http://127.0.0.1:9180/get -H 'apikey: auth-one'
101...
102X-RateLimit-Limit: 2
103X-RateLimit-Remaining: 1
104...
105
106
107# create another route
108curl http://127.0.0.1:9180/apisix/admin/routes/2 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
109{
110    "uri": "/anything",
111    "plugins": {
112        "key-auth": {}
113    },
114    "upstream": {
115        "type": "roundrobin",
116        "nodes": {
117            "httpbin.org": 1
118        }
119    }
120}'
121
122# you could see both routes share the same count
123curl -i http://127.0.0.1:9180/get -H 'apikey: auth-one'
124...
125X-RateLimit-Limit: 2
126X-RateLimit-Remaining: 1
127...
128
129
130curl -i http://127.0.0.1:9180/anything -H 'apikey: auth-one'
131HTTP/1.1 503 Service Temporarily Unavailable
132...

总结

企业通过 API 货币化将服务和数据转化为收入,要实现 API 货币化需要引入专业的 API 管理工具:API 网关,现在最热门的 API 网关是 APISIX,APISIX 在 API 货币化上有丰富的实践,包括 consumer, consumer group 等概念极大方便了用户对 API 的管理,赋能企业更顺畅的将 API 货币化落地。