不写一行代码的情况下,实现最小可行产品API:无需编写 REST API代码,而是配置使用 PostgREST 组件。
PostgREST 是一个独立的 Web 服务器,可将您的 PostgreSQL 数据库直接转换为 RESTful API。数据库中的结构约束和权限决定了 API 端点和操作。
让我们将它应用到一个简单的用例中:
可以在GitHub 上找到完整的源代码
PostgREST 的入门指南非常完整并且开箱即用。然而,我没有找到任何现成的 Docker 镜像,所以我创建了自己的:
FROM debian:bookworm-slim |
docker-compose.yml
version: "3" |
查询数据表:
curl localhost:3000/product |
增加修改功能
PostgREST 是构建 RESTful API 的快速方法。它的默认行为非常适合开发中的脚手架。当需要投入生产时,只要您采取预防措施,它也能很好地工作。PostgREST 是一个小巧的利器,专注于执行 API 到数据库的映射。我们依靠像 Nginx 这样的反向代理来提供额外的保护。
用Apache APISIX替代nginx,我们将把它添加到我们的 Docker Compose 中:
version: "3" |
我们将首先配置Apache APISIX来代理对postgrest的调用:
curl http://apisix:9080/apisix/admin/upstreams/1 -H 'X-API-KEY: 123xyz' -X PUT -d ' |
我们现在可以通过APISIX查询端点:
curl localhost:9080/product |
DDoS保护
我们还没有添加任何东西,但我们已经准备好开始工作了。首先让我们保护我们的API免受DDoS攻击。Apache APISIX是围绕一个插件架构设计的。为了防止DDoS,我们将使用一个插件。我们可以在创建特定路由时在其上设置插件,也可以在每个路由上设置插件;在后一种情况下,它是一个全局规则。我们想默认保护每条路由:
curl http://apisix:9080/apisix/admin/global_rules/1 -H 'X-API-KEY: 123xyz' -X PUT -d ' |
- limit-count限制在一个时间窗口中的呼叫次数
- 限制为每5秒1次呼叫;这是为了演示目的
- 返回429太多请求;默认是503
每条路由的授权
PostgREST还在根部提供了一个Open API端点。因此,我们有两个路由。/用于开放API规范,
/product用于产品。假设我们想禁止未经授权的人访问我们的数据。普通用户可以访问产品,而管理用户可以同时访问Open API规格和产品。
APISIX提供了几种认证方法。我们将使用最简单的一种,即密钥认证。key-auth需要一个特定的头:该插件对该值进行反向查找,并找到其Key对应的消费者。
curl http://apisix:9080/apisix/admin/consumers -H 'X-API-KEY: 123xyz' -X PUT -d ' |
- 创建一个新的消费者
- 消费者的名字
- 消费者的键值
我们对消费者用户和关键用户做同样的工作。现在,我们可以创建一个专门的路由,并对其进行配置,以便只有来自管理员的请求可以通过。
curl http://apisix:9080/apisix/admin/routes -H 'X-API-KEY: 123xyz' -X POST -d ' |
- 创建新路由
- 使用key验证和使用者限制插件
- 只有经过管理员身份验证的请求才能调用路由
调用:
curl -H "apikey: admin" localhost:9080 |
监控
任何软件系统的一个被低估的功能就是监控。一旦你在生产中部署了任何组件,你就必须监测其健康状况。现在,有许多服务可以用来监控。我们将使用Prometheus,因为它是开源的、经过实战检验的、广泛的。为了显示数据,我们将依靠Grafana,原因也是如此。让我们把这些组件添加到Docker Compose文件中。
docker-compose.yml
version: "3" |
一旦监控基础设施到位,我们只需要指示APISIX以Prometheus期望的格式提供数据。我们可以通过配置和一个新的全局规则来实现它。
config.yaml
plugin_attr: |
我们可以创建全局规则:
curl http://apisix:9080/apisix/admin/global_rules/2 -H 'X-API-KEY: 123xyz' -X PUT -d ' |
结论
创建一个成熟的REST(ful)API是一项巨大的投资。人们可以通过PostgREST的CRUD API来快速测试一个简单的API,暴露自己的数据库。然而,这样的架构并不适合在生产中使用。
为了解决这个问题,你需要在PostgREST前面设置一个façade,一个反向代理,或者更好的是一个API网关。Apache APISIX提供了广泛的功能,从授权到监控。有了它,你可以以较低的成本快速验证你的API需求。
锦上添花的是:当你验证了需求后,你可以保留现有的立面,用你定制开发的API取代PostgREST。