前言
随着 Serverless 架构的兴起,API 网关作为 Serverless 架构中最重要的组件之一,扮演着连接消费者和提供者的角色。本文将深入探讨 Serverless 架构下的 API 网关实战,剖析它的本质、常见问题与解决办法,并给出实操指导。
一、API 网关的本质
API 网关是 Serverless 架构下,连接消费者和提供者之间的纽带。在 API 网关中,它充当了反向代理、负载均衡与安全验证等多重角色。
- 反向代理与负载均衡
API 网关作为反向代理,把客户端的请求转发到后端服务上。同时它还要进行服务的负载均衡,保证客户端的请求尽可能平均地分发到每一个拥有服务能力的机器上。
- 安全验证
API 网关在服务和客户端之间,充当了重要的第一道防线。合理的 API 网关应该能够验证请求是否合法,防止恶意攻击和非法请求。
二、常见问题与解决办法
- 负载均衡不平衡
由于 Serverless 架构下不同服务所耗费的资源是无法确定的,因此平均分配资源是非常困难的。不过可以通过开启资源预热来减少此类问题出现的概率。
- 容器化技术的限制
由于 Serverless 采用了容器化技术,因此许多原本能够在本地测试通过的代码在运行时可能会出现异常。解决方法包括 Docker 环境下的本地测试和服务部署前的自动化测试等。
- 安全性问题
与传统的安全方案不同,API 网关的架构没有固定的服务地址和 IP 地址,这会给安全验证带来困难。可使用 Token 或者数字证书等方案来保证 API 网关的请求的安全性。
三、实际操作指导
以下示例是基于具有 Serverless 能力的 AWS API Gateway 服务的实现,整体操作流程可概括为 创建 API --> 新建资源 --> 新建方法 --> 编辑方法绑定到后端服务 --> 配置 API Gateway 的安全管理。
1. 创建 API
使用 AWS API Gateway 的管理面板,首先需要创建一个名称为 example
的 API。
2. 新建资源
在 example
API 中创建一个名称为 user
的资源。在创建的过程中可以选择该资源是否需要身份验证。
3. 新建方法
在 user
资源下面创建一个名称为 GET
的方法。其中 HTTP 方法为 GET
。
4. 编辑方法绑定到后端服务
在 GET
方法的设置页面,绑定访问后端服务的地址,并选择需要隔离的 Lambda 函数作为该方法的服务提供者。
// javascriptcn.com 代码示例 functions: GetByIdFunction: handler: api.getUserById name: example-get-user-by-id timeout: 5 events: - http: path: /user/{id} method: get cors: true authorizer: arn: arn:aws:cognito-idp:${self:provider.region}:#{AWS::AccountId}:userpool/${self:custom.userPool.name} type: cognito identitySource: method.request.header.Authorization, resultTtlInSeconds: 0 identityValidationExpression: ^Bearer.* request: parameters: paths: id: true
其中 example-get-user-by-id
函数是该 API 的服务提供者,我们为其绑定了 GET
方法,来实现查看指定用户信息的功能。
5. 配置 API Gateway 的安全管理
为确保 API 安全,我们需要在其下方挂载 AWS 认证和授权服务,保证访问 API 时必须通过 AWS 认证服务进行安全验证。此外,可以针对不同请求在 API Gateway 中设定不同的安全策略,以保障 API 安全。
// javascriptcn.com 代码示例 provider: name: aws runtime: nodejs14.x region: ap-northeast-1 httpApi: cors: allowCredentials: true allowHeaders: '*' allowMethods: - GET - POST - PUT - PATCH - DELETE - HEAD - OPTIONS allowOrigins: - '*' maxAge: 86400
四、总结
本文介绍了 Serverless 架构下的 API 网关实战,深入探讨了其原理、常见问题和解决方法,并通过示例代码给出实用性的指导。通过深入了解与实践,开发者可以对新一代架构的概念和思想有更为清晰和深入的理解。最后,我们鼓励开发者们不断探索 Serverless 的精髓,在实践中获得更多的技术收获。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6531d9db7d4982a6eb3d4f38