本文介绍自己编写的一套 openresty 开发框架。
概述
本项目总结 openresty 日常开发的功能和模块,最终目的是规范和简化开发流程、实现低耦合、高内聚的项目。规范的方面主要包括:
- 项目结构
- 项目文档
- 代码结构
- 代码文档
- 单元测试
- 接口测试
- 打包部署
- 统计监控
- 性能测试
项目结构
- nginx/ 主要业务代码。
- lib/ 代码中可能会用到的动态链接库(.so)。
- lua/ Lua 核心代码。
- conf/ 业务配置。
- interface/ 业务接口。
- inner/ 内部接口。
- cache/ 缓存相关,主要包括业务代码和 redis、memcache 等接口的封装。
- database/ 持久化数据化,主要包括业务代码和 MySQL 等接口的封装。
- upstream/ 第三方服务接口封装。
- misc/ 工具库
- mock/ 第三方服务 mock 接口。
- falcon/ 上报 falcon 的 metrics 相关封装。
- sbin/ 和服务运行相关的脚本。
- conf/ nginx 配置文件。
- doc/ 项目文档。
- overview 项目详细介绍。
- protocol 项目接口使用的协议。
- environment 项目 mock/develop/pre-release/release 环境的配置。
- storage 项目涉及的存储的说明,比如 MySQL、Redis 等。
- script/ 辅助脚本。
- test/ 测试脚本,主要是接口测试。
- CMakeLists.txt 打包配置。
- build_openresty.sh openresty 安装脚本。
- install.cmake 安装包制作脚本。
- Dockerfile openresty-develop-framework 镜像配置。
- Dockerfile.code 项目代码生成的存储卷镜像配置。
- README.md 项目说明。
- mock.sh 建立 mock 环境的脚本。
- config.ld LDoc 配置文件。使用 LDoc 生成 Lua 源码文件的相关文档。详见 LDoc 手册。
单元测试
使用 LuaUnit 测试 Lua 源码。详见 LuaUnit 实践
为了方便测试,除接口外的源码文件中不应该调用 nginx_lua_module 系列的函数。
接口测试
使用 python3 编写接口测试脚本:
- Pipfile 使用 pipenv 建立与主机环境隔离的运行环境。
- config.py 配置文件。
- log_cfg.py 日志配置文件,使用 python 内置的 logging 库。
- example_db.py 数据库接口。
- example_cache.py 缓存接口。
- upstream.py 第三方服务接口。
- example_server.py 对应服务接口的 HTTP 客户端。
- test_example.py 服务接口测试用例。
安装 openresty
考虑到最好在生产环境自行安装 openresty,所以打包好的文件没有 nginx 执行程序。
./build_openresty.sh <project-dir>
打包代码
cd build
cmake .. -DCMAKE_INSTALL_PREFIX=<project-dir>
make install
部署代码
将打包好的文件替换 =openresty/nginx 下的同名文件。
如果业务前端有在 nginx 代理,在代理的 =nginx.conf 加入以下内容:
include <path-to-project>/project.proxy.nginx.conf;
Docker
不要将所有代码都放在一个镜像中,最佳实践:以 openresty-develop-framework 镜像挂载项目代码制作的存储卷启动容器。
统计监控
- falcon 监控服务运行状态。
- ELK (todo)全链路跟踪。
性能测试
压测
推荐使用 tcpcopy
进行压测。其他工具介绍参见:
定位
使用火焰图定位性能瓶颈。详见 openresty-systemtap-toolkit 实践
评论