本文介绍了 API 货币化和 APISIX 实现 API 货币化方法。
作者刘维,API7.ai 技术工程师,Apache APISIX Contributor
原文链接
什么是 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 假如请求同一个 API,经用户认证体系识别后,网关服务根据当前请求用户信息,会对应不同的 Plugin 或 Upstream 配置,方便对不同的用户进行管理。
但是仅仅支持 consumer 还不够,针对上文提到的企业用户,需要多个 consumer 共享同一个消费额度,并且如果只能分别管理每个 consumer 的配置,操作就太过繁琐了。因此 APISIX 提出了 consumer group 的概念,有了 consumer group,多个 consumer 就能共享同一套配置和同一个消费配额。
了解了 APISIX 在 API 货币化的实践,下面我们来看看具体的应用。
# create consumer group
curl http://127.0.0.1:9180/apisix/admin/consumer_groups/company_a -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"plugins": {
"limit-count": {
"count": 200,
"time_window": 60,
"rejected_code": 503,
"group": "$consumer_group_id"
}
}
}'
# create consumer 1
curl http://127.0.0.1:9180/apisix/admin/consumers -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"username": "jack",
"plugins": {
"key-auth": {
"key": "auth-one"
}
},
"group_id": "company_a"
}'
# create consumer 2
curl http://127.0.0.1:9180/apisix/admin/consumers -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"username": "johnson",
"plugins": {
"key-auth": {
"key": "auth-two"
}
},
"group_id": "company_a"
}'
# create route
curl http://127.0.0.1:9180/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"uri": "/get",
"plugins": {
"key-auth": {}
},
"upstream": {
"type": "roundrobin",
"nodes": {
"httpbin.org": 1
}
}
}'
# hit the route
curl -i http://127.0.0.1:9180/get -H 'apikey: auth-one'
...
X-RateLimit-Limit: 200
X-RateLimit-Remaining: 199
...
curl -i http://127.0.0.1:9180/get -H 'apikey: auth-two'
...
X-RateLimit-Limit: 200
X-RateLimit-Remaining: 198
...
# change count value to 2 requests per minute
curl http://127.0.0.1:9180/apisix/admin/consumer_groups/company_a -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"plugins": {
"limit-count": {
"count": 2,
"time_window": 60,
"rejected_code": 503,
"group": "$consumer_group_id"
}
}
}'
# hit the route
curl -i http://127.0.0.1:9180/get -H 'apikey: auth-two'
...
X-RateLimit-Limit: 2
X-RateLimit-Remaining: 1
...
curl -i http://127.0.0.1:9180/get -H 'apikey: auth-one'
...
X-RateLimit-Limit: 2
X-RateLimit-Remaining: 0
...
# no count, HTTP 503
curl -i http://127.0.0.1:9180/get -H 'apikey: auth-one'
HTTP/1.1 503 Service Temporarily Unavailable
# after a minute, count recover
curl -i http://127.0.0.1:9180/get -H 'apikey: auth-one'
...
X-RateLimit-Limit: 2
X-RateLimit-Remaining: 1
...
# create another route
curl http://127.0.0.1:9180/apisix/admin/routes/2 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"uri": "/anything",
"plugins": {
"key-auth": {}
},
"upstream": {
"type": "roundrobin",
"nodes": {
"httpbin.org": 1
}
}
}'
# you could see both routes share the same count
curl -i http://127.0.0.1:9180/get -H 'apikey: auth-one'
...
X-RateLimit-Limit: 2
X-RateLimit-Remaining: 1
...
curl -i http://127.0.0.1:9180/anything -H 'apikey: auth-one'
HTTP/1.1 503 Service Temporarily Unavailable
...
复制代码
总结
企业通过 API 货币化将服务和数据转化为收入,要实现 API 货币化需要引入专业的 API 管理工具:API 网关,现在最热门的 API 网关是 APISIX,APISIX 在 API 货币化上有丰富的实践,包括 consumer, consumer group 等概念极大方便了用户对 API 的管理,赋能企业更顺畅的将 API 货币化落地。
关于 API7.ai 与 APISIX
API7.ai(支流科技 )是一家提供 API 处理和分析的开源基础软件公司,于 2019 年开源了新一代云原生 API 网关 -- APISIX 并捐赠给 Apache 软件基金会。此后,API7.ai 一直积极投入支持 Apache APISIX 的开发、维护和社区运营。与千万贡献者、使用者、支持者一起做出世界级的开源项目,是 API7.ai 努力的目标。
评论