1. 目的与概述
Cinedata是一个基于JSON的API,旨在管理和检索电影信息,类似于Open Movie Database API(OMDb API)的功能。它支持各种端点,允许用户对电影数据执行CRUD(创建、读取、更新、删除)操作,管理用户身份验证和重置密码。API是为可扩展性和安全性而构建的,确保了对电影数据的可靠访问和交互。
2. 功能要求
Cinedata支持以下核心功能:
用户管理:
- 注册新用户
- 通过电子邮件激活用户
- 重置密码
- 验证并生成象征
电影管理:
- 检索所有电影或按参数筛选
- 创建、更新和删除特定电影
- 查看特定电影的详细信息
健康检查:
3.非功能性需求
- 演出: API必须有效地处理大量请求,并设置速率限制以防止滥用。
- 安全: 实现严格的输入验证、用于加密通信的HTTPS和安全密码散列。
- 可扩展性: 遵循具有垂直扩展的单体架构,以处理增加的负载。
- 可靠性: 基于IP的速率限制,以避免过载并确保一致的正常运行时间。
4. 系统架构
Cinedata采用单体架构,将所有API功能组合在一个应用程序中。该应用程序托管在DigitalOcean Linux服务器上,Caddy作为负载平衡、缓存和SSL证书管理的反向代理。
- 后端: 后端是使用Go和httprouter包开发的,用于RESTful路由。
- 数据库: PostgreSQL用于通过准备好的语句和参数化查询来管理用户和电影数据,以确保安全性。
- 中间件:
- CORS用于处理跨源请求。
- 强制执行全局和基于IP的速率限制,以防止过多的请求。
5. 数据流和模型
用户管理流程:
- 用户可以注册并收到激活电子邮件。
- 用户可以重置密码并生成身份验证象征,以便进一步进行API交互。
- 登录后,用户可以访问电影数据,并根据其权限执行授权操作。
电影管理流程:
- 用户可以查看所有电影或按特定参数过滤列表。
- 具有适当权限的用户可以创建、更新或删除电影。
- 可以使用特定电影的ID获取其详细信息。
关键数据表:
- users: 存储用户凭据和元数据。
- movies: 包含数据库中所有电影的详细信息。
- tokens: 存储密码重置和身份验证象征。
- permissions: 管理访问控制的用户权限。
6. 技术栈
- 后端: Go (使用httprouter进行路由)
- 数据库: PostgreSQL用于数据存储和检索
- 安全: HTTPS(TLS加密)、用于密码哈希的bcrypt和基于IP的速率限制
- 服务器和代理: 主机在DigitalOcean Linux服务器上,使用Caddy进行反向代理和SSL管理
7. API和端点
Cinedata API支持以下端点:
健康检查:
- GET /v1/healthcheck – 检查API状态和正常运行时间。
用户管理:
- POST /v1/users – 注册新用户。
- PUT /v1/users/activated – 激活用户。
- POST /v1/tokens/password-reset – 生成密码重置象征。
- PUT /v1/users/password – 更新用户的密码。
- POST /v1/tokens/authentication – 生成身份验证象征。
电影管理:
- GET /v1/movies – 使用可选过滤功能检索所有电影。
- POST /v1/movies – 添加新电影。
- GET /v1/movies/:id – 检索特定电影的详细信息。
- PATCH /v1/movies/:id – 更新特定电影的详细信息。
- DELETE /v1/movies/:id – 删除特定电影。
8. 安全注意事项
- 密码保护: 密码使用bcrypt进行哈希运算,以确保安全存储。
- 会话管理: 身份验证是通过有状态令牌来处理的,必须为授权的API访问提供有状态象征。
- 数据加密: 客户端和服务器之间的所有通信都使用TLS加密,以保护传输中的数据。
- 输入验证: 严格的验证和准备好的语句用于防止SQL注入攻击。
9. 部署和可扩展性
- 主机: 该应用程序部署在DigitalOcean Linux服务器上。
- 反向代理: Caddy负责负载平衡、缓存和SSL证书管理。
- 可扩展: 作为一个单体结构,它支持垂直扩展(增加服务器资源)以适应不断增长的流量。
10. 挑战和未来的增强
挑战:
- 当前的设置支持垂直缩放,但随着用户流量的增长,可能会面临限制。实施横向扩展或微服务可能是未来的考虑因素。
未来的增强:
- 扩展API以包含更多数据类型并支持其他终结点。
- 实施多因素身份验证(MFA)以增强安全性。
- 添加详细的日志记录和监控,以跟踪API性能并识别问题。