我在 AWS 上部署了一些 RESTfull API,主要是在 Elasticbeanstalk 上。
我的公司正在逐渐采用微服务架构,因此,我想开始以更专业和自动化的方式管理这些 API。因此,我想采用某种 API Manager 来提供标准功能,例如路由和发现。
另外,我希望使用这样的 API Manager 将我的一些 API 公开到 Internet。管理器将仅通过 SSL 暴露于 Internet,并且在将外部消费者的请求路由到内部 API 之前,应该需要某种形式的身份验证。对于我的用例,每个请求的 Authorization 标头中的简单 API 密钥就足够了。
我目前正在考虑将两种产品作为 API 管理器:WSO2 和 Kong。前者是托管在 Github 上的一个有点新的开源项目。
在我正在考虑的所有部署场景中,API 管理器都必须部署在 AWS EC2 实例上。此外,它们必须至少部署在两个不同的可用区和弹性负载均衡器 (ELB) 后面,以便为托管 API 提供高可用性。
我的大多数 API 都遵守 HATEOAS 约束。因此,他们的许多 JSON 响应都包含指向其他资源的链接,这些资源必须根据原始请求动态构建。
例如:
如果用户通过公开的 API Manager 从 Internet 发送请求,则 URL 如下所示: https ://apimanager.mycompany.com/accounts/123
因此,用户应该会收到一个 JSON 响应,其中包含一个 Account 资源,其中包含一个指向订阅资源的链接。链接 URL 应基于原始请求的协议、主机和端口,因此应如下所示:https://apimanager.mycompany.com/subscriptions/789。
为了满足上面提到的动态链接生成要求,我的 API 依赖于 X-Forwarded-Proto、X-Forwarded-Host 和 X-Forwarded-Port HTTP 标头。这些应该包含协议(http 或 https)、主机名和消费者在原始请求中使用的端口,不管请求通过了多少代理。
但是,我注意到当请求通过 ELB 时,X-Forwarded-Proto 和 X-Forwarded-Port 标头更改为引用请求通过的最后一个 ELB 的值,而不是原始请求中的值。
例如:如果原始请求通过 HTTPS 到达 API Manager,Manager 通过 HTTP 将请求转发到内部 API;因此,当请求到达第二个 ELB 时,ELB 会将 X-Forwarded-Proto 标头更改为“http”。结果,X-Forwarded-Proto 标头的原始“https”值丢失。因此,API 无法在 URL 中使用“https”协议建立正确的链接。
显然,ELB 不能配置为以任何其他方式运行。我在 AWS 的文档中找不到任何可能影响此行为的设置。
此外,似乎没有比 AWS 的 ELB 更好的替代品了。如果我选择使用 HAProxy 等其他产品,或者通过 API Manager 本身进行负载平衡,我将不得不将其安装在常规 EC2 实例上,因此会产生单点故障。
我包括一个非正式的图表,以更好地表达我的观点。
此外,我找不到任何有关 WSO2 或 Kong 部署方案的相关讨论,这些讨论将以任何方式解决这些问题。我不清楚这些产品应该如何与 AWS 的 ELB 相关联。
非常欢迎有类似环境的其他人发表评论。
谢谢你。