基于OpenResty和国密算法的企业级API网关系统,提供安全、高性能的API管理服务。
- 国密算法支持: 使用SM2、SM3、SM4算法进行签名、哈希和加密
- 安全防护: 防重放攻击、IP白名单、签名验证
- 高性能: 基于OpenResty和LuaJIT的高性能网关
- 实时配置: 无缓存设计,所有配置实时从Redis获取
- 监控统计: 完整的请求日志和统计信息
- 部署操作系统: Debian12、内核版本6.1.0-37-amd64、ldd (Debian GLIBC 2.36-9+deb12u13) 2.36
- 中间件版本: openresty-1.27.1.2(把openssl-1.1.1w、pcre2-10.46、zlib-1.3.1编译进去)、nodejs_v22.17.1
- 网关国密算法库: 通过ffi加载基于C语言openssl_v1.1.1编译出来的gmCryptor-c-linux-x64.so或基于CGO语言根据github.com/tjfoc/gmsm v1.4.1编译出来的gmCryptor-go.lua(参考项目https://github.com/seahigh/GMCryptor ); nodejs的国密算法用 sm-crypto_v0.3.13(参考项目https://github.com/JuneAndGreen/sm-crypto)
- 签名算法: sm2+sm3杂凑+ASN.1 DER编码,默认userId值为 1234567812345678,结果为16进制utf8字符串
- 报文加密算法: sm4-cbc(需要key和iv,默认使用PKCS7Padding填充),得到16进制utf8字符串,最后base64编码
graph TD
A[客户端] --> B(OpenResty API网关:8082)
B --> C(Express后端服务:3000)
B --> D[(Redis存储)]
C --> D
确保项目结构如下(项目路径可根据.env文件修改相关配置):
software/
├── openresty/ # 已编译的OpenResty
├── express/ # Express后端代码
└── scripts/ # 管理脚本
# 使用统一配置初始化网关(其中已包含初始化redis数据)
cd /opt/zy/software/scripts
./init_gateway.sh
# 启动服务
./start_gateway.sh
# 检查状态
./status_gateway.sh
# 测试服务
cd /opt/zy/software/express
执行command.txt中的命令
系统使用项目根目录下的 .env 文件来统一管理所有配置:
# 查看当前配置
cd /opt/zy/software/scripts
./init_gateway.sh --show-config新增的 init_gateway.sh 脚本可以:
- 读取
.env文件中的配置 - 自动更新相关配置文件
- 初始化Redis数据
# 完整初始化(更新配置并初始化Redis)
./init_gateway.sh
# 仅更新配置文件
./init_gateway.sh --config-only
# 仅初始化Redis数据
./init_gateway.sh --redis-only| 脚本 | 功能 |
|---|---|
start_gateway.sh |
启动API网关服务 |
stop_gateway.sh |
停止API网关服务 |
restart_gateway.sh |
重启API网关服务 |
status_gateway.sh |
查看服务状态 |
init_redis_data.sh |
初始化Redis数据 |
init_gateway.sh |
统一配置初始化 |
- 网关服务: http://localhost:8082
- 后端服务: http://localhost:3000
- 健康检查: http://localhost:8082/health
- OpenResty:
/opt/zy/software/openresty - Express:
/opt/zy/software/express - 脚本:
/opt/zy/software/scripts
- 网关端口: 8082
- 后端端口: 3000
- Redis: 192.168.110.48:6379
- 国密算法: SM2签名、SM3哈希、SM4对称加密
- 防重放攻击: 基于nonce和时间戳的防重放机制
- IP白名单: 限制访问来源
- 签名验证: 确保请求完整性和来源可信(后端服务响应状态码为200时网关才加签)
- 加密传输: 请求和响应经过SM4加密(后端服务响应状态码为200时网关才加密报文)
- 实时配置: 无缓存设计,配置变更立即生效
- 流量控制: 基于应用、接口的流量控制
API网关采用无缓存设计,所有配置信息(包括App信息、API信息、订阅关系等)都实时从Redis获取:
当Redis中的配置发生变化时,网关会在下一次请求中立即使用新配置,无需任何延迟或重启操作。
所有配置变更(如API路径修改、订阅关系调整等)都会在下一次请求中立即生效。
cd /opt/zy/software/express
node test_client.jscd /opt/zy/software/express
node test_client.js test# 后端日志
tail -f /opt/zy/software/express/backend.log
# 网关日志
tail -f /opt/zy/software/openresty/nginx/logs/api_gateway_access.log-
端口被占用
netstat -tlnp | grep -E "(8082|3000)" kill -9 <PID>
-
Redis连接失败
redis-cli -h 192.168.110.48 -p 6379 ping
-
服务启动失败
./status_gateway.sh tail -f /opt/zy/software/express/backend.log
openresty/nginx/lua/api_gateway/
├── sm_crypto_utils.lua # 国密算法工具
├── redis_utils.lua # Redis操作工具
├── request_validator.lua # 请求验证
├── response_handler.lua # 响应处理
└── gateway.lua # 主网关入口
express/
├── index.js # 后端服务
├── test_client.js # 测试客户端
├── init_redis_data.js # Redis数据初始化
└── package.json # 依赖配置
scripts/
├── start_gateway.sh # 启动脚本
├── stop_gateway.sh # 停止脚本
├── restart_gateway.sh # 重启脚本
├── status_gateway.sh # 状态检查
└── init_redis_data.sh # 数据初始化
MIT License
如有问题,请查看日志文件或运行状态检查脚本。