从零开始构建属于你的API网关 | 作者:Robby Nasution
使用 Node.js 和 Express 构建属于你的 API 网关
API 网关是整个内部 API 或服务的入口点。当客户端向系统发送请求时,他们并不会直接与单个服务交互,而是通过 API 网关转发请求到目标服务。在此过程中,网关会执行一系列任务,例如身份验证、有效载荷验证、分析,以及对请求头或有效载荷的转换。
本文将带你构建一个简单的 API 网关,作为微服务的入口点。该网关将实现以下功能:
- 基本身份验证
- 监控
- 响应头修改
- 请求转发
API 网关的设计架构
客户端的每个请求都需要携带用于访问微服务资源的基本身份验证密钥(Basic Auth Key)。网关会解析请求并验证令牌的有效性。一旦验证通过,网关会使用自己的签名将请求转发至目标服务。目标服务通过网关的签名识别请求,并仅允许私密访问。
以下是实现该网关所需的依赖项:
"dependencies": {
"axios": "^0.19.1", // 用于转发请求的适配器
"bcrypt": "^3.0.7", // 用于对消费者的基本身份验证进行哈希处理
"bluebird": "^3.7.2", // 可选,用于异步处理 Redis
"body-parser": "^1.19.0",
"cors": "^2.8.5", // 用于启用跨域资源共享
"express": "^4.17.1",
"jsonwebtoken": "^8.5.1", // 用于网关签名的 JWT
"mongoose": "^5.8.7",
"morgan": "^1.9.1", // 可选,用于开发日志
"redis": "^2.8.0", // 用作缓存数据库
"yaml": "^1.7.2" // 用于读取配置文件
}
你可以通过以下命令安装这些依赖项:
npm install express axios body-parser bluebird cors jsonwebtoken morgan redis yaml bcrypt --save
基本身份验证
在本示例中,用户需要提供一个用于访问网关的 basic_auth 令牌。该令牌由用户密码生成,并通过 bcrypt 进行哈希处理。在请求进一步处理之前,网关会验证该令牌的有效性。验证过程会将令牌与消费者数据库中的记录进行匹配。
当然,你也可以根据需求实现更复杂的验证逻辑,例如在网关中集成 OAuth2。
配置文件
网关的配置文件采用 YAML 格式,用于定义端点和请求规则。我们使用 yaml 包来读取该文件。配置文件中包含了消费者请求的关键信息,例如完整路径和重要参数。你还可以在端点部分添加更多方法,例如 PATCH 方法。
请求解析器
通过基本身份验证后,网关会解析请求并读取配置文件,以匹配服务配置。网关会验证请求的端点和方法是否有效,确保目标服务中存在对应的路由。
如果请求无误,网关会将其转发至目标服务。同时,网关会记录日志,包括 IP 地址、请求的服务和路径等信息。以下是解析请求的代码示例:
// 示例代码
你可以根据需求扩展日志记录的内容,例如通过修改 Mongoose 模式添加更多详细信息。
请求转发
一旦请求通过验证并解析完成,网关会将其转发至目标服务。以下是转发请求的代码示例:
// 示例代码
安全的 HTTP 响应头
在网关向消费者返回响应之前,会根据 OWASP 的安全头部标准添加一些安全头部。此外,为了增强安全性,网关会避免缓存令牌。
总结
本文介绍了如何使用 Node.js 和 Express 构建一个简单的 API 网关。该网关实现了基本身份验证、请求转发、响应头修改等功能。尽管目前的实现还较为基础,但未来可以进一步扩展,使其更强大、更安全。
感谢你花时间阅读本文,希望对你有所帮助!
原文链接: https://medium.com/@robbybellamy6/build-your-own-api-gateway-from-scratch-e799549612ee
最新文章
- LangChain | 一种语言模型驱动应用的开发框架
- API 是否应该采用语义化版本控制?
- 如何获取 RollToolsApi 开放平台 API Key 密钥(分步指南)
- WordPress REST API 内容注入漏洞分析
- 智能旅行API:你的完美旅行规划助手
- 大模型新基座,基于FastAPI,利用Python开发MCP服务器
- Google DeepMind发布 Genie 3 API架构解析:24fps流式3D世界协议
- 什么是OpenAPI?
- 把 C# 里的 HttpClient 封装起来,告别复杂的配置,让 Restful API 调用更轻松更高效
- 释放Spring Boot API中数字签名的强大功能
- 如何使用ChatGPT JavaScript API,3个简单步骤
- 如何通过 SEO rank API 进行竞争对手分析