构建无服务器应用:API与数据管道实践
立即解锁
发布时间: 2025-09-09 00:24:08 阅读量: 6 订阅数: 11 AIGC 


掌握Java无服务器开发
### 构建无服务器应用:API 与数据管道实践
#### 1. API Gateway 资源与部署
在使用 AWS 构建无服务器应用时,我们可以选择使用 AWS::Serverless::Api 类型的网关资源,或者底层的 CloudFormation API Gateway 资源类型。若选择前者,可在 Lambda 函数的 API 事件属性中添加 RestApiId 属性,将其与自定义 API 关联起来。
此外,我们还能在 API Gateway 的 CloudFormation/SAM 定义中使用 Swagger/Open API。这样做不仅能获得更好的文档,还能实现一定程度的“无需代码”的输入验证,但不能完全依赖 Swagger/API Gateway 进行输入验证。而且,API Gateway 的某些配置方面只能使用 AWS 自己的 OpenAPI 扩展来定义。
部署应用时,使用与之前相同的 `sam deploy` 命令。若需要,可以更改 `stack-name`,将应用部署到新的堆栈,例如 `ChapterFiveApi`。
部署完成后,可在 AWS Web 控制台的 CloudFormation 部分查看新部署的堆栈。同时,AWS 还提供了 Serverless Application 视图,可通过 Lambda 控制台的 Applications 选项卡访问。在该视图中,能看到 DynamoDB 表、API Gateway(在 AWS 术语中称为 RestAPI)和两个 Lambda 函数。点击这些资源,会跳转到相应的服务控制台。
获取 API 的公共访问 URL 后,我们可以测试部署。以下是具体步骤:
1. **发送数据**:在 API Gateway 控制台获取的 URL 基础上,添加 `/events` 路径。使用 `curl` 命令发送数据,例如:
```bash
$ curl -d '{"locationName":"Brooklyn, NY", "temperature":91,
"timestamp":1564428897, "latitude": 40.70, "longitude": -73.99}' \
-H "Content-Type: application/json" \
-X POST https://hnymk3astd.execute-api.us-west-2.amazonaws.com/Prod/events
Brooklyn, NY
$ curl -d '{"locationName":"Oxford, UK", "temperature":64,
"timestamp":1564428898, "latitude": 51.75, "longitude": -1.25}' \
-H "Content-Type: application/json" \
-X POST https://hnymk3astd.execute-api.us-west-2.amazonaws.com/Prod/events
Oxford, UK
```
这些数据将被保存到 DynamoDB 中。可以在 Serverless Application 控制台点击 DynamoDB 表,再点击 Items 选项卡进行验证。
2. **读取数据**:在 API Gateway 控制台 URL 后添加 `/locations` 路径,使用 `curl` 命令读取数据,例如:
```bash
$ curl https://hnymk3astd.execute-api.us-west-2.amazonaws.com/Prod/locations
[{"locationName":"Oxford, UK","temperature":64.0,"timestamp":1564428898,
"longitude":-1.25,"latitude":51.75},
{"locationName":"Brooklyn, NY","temperature":91.0,
"timestamp":1564428897,"longitude":-73.99,"latitude":40.7}]
```
这样就完成了第一个完整的无服务器应用的构建,它具有自动扩展、容错等诸多非功能特性。
#### 2. 构建无服务器数据管道
接下来,我们将构建一个无服务器数据管道。该应用是基于之前的天气事件系统,应用会将包含“天气事件”的 JSON 文件上传到 S3,数据管道将处理该文件,并将事件记录到 AWS CloudWatch Logs 中。
##### 2.1 架构
应用架构如下:
1. **S3 存储**:上传文件到 S3 会异步触发 Lambda 函数 `BulkEventsLambda`。
2. **BulkEventsLambda 函数**:读取 JSON 列表,将天气事件分离为单个事件,并发布到 SNS 主题。
3. **SNS 消息传递**:SNS 主题接收到消息后,会异步触发第二个 Lambda 函数 `SingleEventLambda`。
4. **SingleEventLambda 函数**:处理每个天气事件,目前仅将事件记录到日志中。
```mermaid
graph LR
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
A(S3 上传文件):::process -->|异步触发| B(BulkEventsLambda):::process
B -->|发布消息| C(SNS 主题):::process
C -->|异步触发| D(SingleEventLambda):::process
D -->|记录日志| E(AWS CloudWatch Logs):::process
```
##### 2.2 S3 服务
S3 是 AWS 中最古老的服务之一,也是最早的无服务器 BaaS 产品示例。它具有以下特点:
| 特点 | 描述 |
| ---- | ---- |
| 无需管理主机 | 使用 S3 时无需管理“文件服务器”或应用实例。 |
| 自动扩展和供应 | 根据负载自动扩展存储和流量容量。 |
| 按使用量计费 | 费用基于精确的使用量,空桶无需付费。 |
| 性能与存储类相关 | 性能取决于选择的存储类,访问速度越快,费用越高。 |
| 高可用性 | 数据在区域内的多个可用区复制,确保数据高可用。 |
S3 与 Lambda 配合良好,因为它们具有相似的扩展能力。S3 可以直接集成 Lambda,当 S3 桶中的数据发生变化时,会自动触发 Lambda 函数。
在实际应用中,可以允许终端用户客户端通过“签名 URL”直接上传到 S3,这是一种“纯”无服务器方法。
##### 2.3 Lambda 函数
Lambda 函数
0
0
复制全文
相关推荐









