一个基于FASTAPI的轻量级API开发框架,介绍文章:https://zhang.ge/5166.html
Last updated Jul 11, 2025
35
Stars
11
Forks
1
Issues
0
Stars/day
Attention Score
9
Language breakdown
Python 88.9%
Shell 8.7%
Dockerfile 2.3%
▸ Files
click to expand
README
Flyer: 轻量级 API 开发框架
已推出全新 SDK 版本,欢迎使用:FastFlyer
项目介绍
Flyer 是基于 FastAPI 设计的轻量级 API 开发框架,帮助运维人员快速开发运维业务接口。
性能测试
单核单进程模式,Flyer空载性能在8k+QPS,基本可以满足绝大部分运维场景。压测方式如下:启动服务
docker run -d \
--net=host \
--name flyer_bench \
--cpus 1 \
-e flyer_port=8888 \
-e flyer_workers=1 \
-e flyer_threads=5 \
-e flyerloglevel=error \
-e flyer_reload=0 \
-e flyeraccesslog=0 \
-e flyer_preload=0 \
-e flyerworkerconnections=10000 \
-e flyer_threads=1 jagerzhang/flyer:v1.1
启动压测
[root@localhost ~]# ./wrk -c 800 -t 10 http://127.0.0.1:8888/flyer/v1/health_check
Running 10s test @ http://127.0.0.1:8888/flyer/v1/health_check
10 threads and 800 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 87.78ms 19.46ms 430.79ms 90.17%
Req/Sec 0.90k 252.02 1.62k 81.85%
89274 requests in 10.03s, 13.62MB read
Requests/sec: 8901.47
Transfer/sec: 1.36MB
压测结果
快速上手
服务依赖
- 运行环境:Python 3.6.8 或更高版本
- 开源组件:MySQL、Redis、Kafka(均为按需启用)
基于Docker部署
构建镜像
git clone https://github.com/jagerzhang/flyer.git
cd flyer
docker build -t "flyer:test" .
运行服务
可以通过以下命令快速预览 Flyer 的 Demo 示例。docker run \
--net=host \
--name=flyer \
flyer:test ./start-dev.sh
成功启动后,浏览器访问下文的接口文档中的地址即可查看效果。
正式开发
容器模式
可以基于上面制作的flyer:test容器镜像来快速部署开箱即用的开发环境:
# 克隆代码
cd /data/
git clone https://github.com/jagerzhang/flyer.git
启动容器,将本地代码挂进去
docker run \
--net=host \
--name=flyer_dev \
-v /data/flyer:/flyer \
flyer:test \
./start-dev.sh
普通模式
安装依赖:
# 安装Python3和基础组件
yum install -y python3 python3-devel python3-setuptools make snappy-devel gcc-c++
安装 Flyer 依赖的 Python 插件
pip3 install --no-cache-dir -r requirements.txt
注:以上为Centos环境的安装步骤,其他系统请参考修改命令即可。
启动服务
git clone https://github.com/jagerzhang/flyer.git
cd flyer
./start-dev.sh
成功启动后,浏览器访问下面的接口文档中的地址即可查看效果,修改任何 Python 代码保存都会自动加载。
代码结构
以下是框架的代码结构说明,开发时只需要复制一份 demo 文件夹进行逻辑代码编写:.
├── api # API 汇总目录, 里面按文件夹存放独立的 API 服务
│ ├── base # 框架内置 API,主要包括监控检查、swagger 文档、ReDoc 文档
│ ├── demo # 内置的 API 样例,用于 API 开发参考
│ │ ├── init.py # 注册路由
│ │ ├── models # API 核心逻辑
│ │ ├── routers # 定义各接口路由
│ │ ├── schemas # 定义各接口协议
│ │ └── settings.py # 当前 API 的自定义配置
│ ├── init.py # 总 API 加载入口
│ └── settings.py # 全局配置脚本
├── build_base.sh # 基础镜像构建脚本
├── build.yaml # PreCI 本地代码检查配置
├── docker # Docker 启动脚本
├── Dockerfile # 服务镜像构建配置
├── Dockerfile_base # 基础镜像构建配置
├── logs # API 日志目录
├── main.py # 开发环境启动脚本(被 start-dev.sh 调用)
├── README.md
├── requirements.txt # 框架依赖
├── run.sh # 容器服务启动入口脚本
├── start-dev.sh # 开发环境启动入口脚本
├── static # 静态文件目录
├── tests # 单元测试脚本目录
│ ├── init.py
│ ├── start-test.sh # 手工发起一键测试(非 Pytest 方式)
│ ├── test_base.py # 内置接口的测试脚本
│ ├── test_demo.py # demo 接口的测试脚本
│ ├── testexceptionvalidate.py # 参数验证异常的测试脚本
│ └── test_health.py # 健康检查接口的测试脚本
└── utils # 框架公共方法目录
├── common.py # 通用方法函数
├── data.py # Redis、MySQL 连接池
├── http_requests.py # 对外 HTTP 请求公共函数,可以记录日志和异常重试
├── ierror.py # 接口返回码的定义脚本
├── init.py
├── logger.py # 日志初始化
├── middleware.py # 框架中间件逻辑,用于埋点、记录耗时、日志等
接口文档
Flyer 基于 FastAPI 框架,所以自带了 reDoc 和 SwaggerUI,完全实现代码即文档的开发方式,非常方便。- ReDoc:
http://<IP>:8080/flyer/v1/redoc - SwaggerUI:
http://<IP>:8080/flyer/v1/docs
flyer 和 v1 可以通过环境变量flyerbaseurl和flyer_version来定制。
环境变量
Flyer 支持通过环境变量来修改各种配置。 基础变量flyer_host: 接口绑定IP,默认为 0.0.0.0flyer_port:接口绑定端口,默认为 8080flyerbaseurl:服务地址前缀,默认为 /flyerflyer_version:服务版本,当前为 v1flyer_reload:接口热加载,用于开发环境,默认为 1flyer_workers:工作进程数量,默认为 1flyer_threads:工作线程数量,默认为 5flyerworkerconnections:最大客户端并发数量,默认为1000flyerenablemax_requests:打开自动重启机制,即请求一定数量后进程自动重启,可以缓解内存泄漏问题flyermaxrequests:重新启动之前,工作将处理的最大请求数。默认值为0flyermaxrequestsjitter:要添加到maxrequests的最大抖动。抖动将导致每个工作的重启被随机化,这是为了避免所有工作被重启。flyer_timeout:超过这么多秒后工作将被杀掉,并重新启动。默认为60秒flyergracefultimeout:优雅退出时间,默认为10,收到重启信号后,将等待指定时长才(或强制)退出flyer_keepalive:在keep-alive连接上等待请求的秒数,默认为5flyerloglevel:定义日志级别,debug/info/warn/error,默认为 infoflyeraccesslog:是否记录请求日志,1/0,默认为 1flyeraccesslogfile:定义请求日志文件的位置,默认为-,即输出到容器标准输出
/run.sh来覆盖或追加。
需要用到Redis请添加如下配置:
flyerredishost: Redis 服务IP,默认 localhostflyerredisport: Redis 服务端口,默认 6379flyerredispass: Redis 服务密码,默认为空flyerredisdb: Redis 实例DB,默认为 1
MySQL请添加如下配置: flyerdbhost: MySQL 服务地址flyerdbport: MySQL 服务端口flyerdbuser: MySQL 用户名flyerdbpass: MySQL 密码flyerdbname: MySQL 数据库名称
Kafka请添加如下配置: flyerkafkatopic: 指定 kafka 消息队列的 Topicflyerkafkaservers: 指定 kafka 消息队列的 服务地址,格式为 x.x.x.x:9092,y.y.y.y:9092
单元测试
Flyer 的单元测试用例位于根目录下的tests 目录,已支持 pytest 和测试堂,完成接口开发后,建议参考 tests/test_demo.py 快速补齐测试用例,提高单侧覆盖率。 测试堂测试
测试单个用例cd tests ./start-test.sh test_demo.py 测试所有用例 cd tests ./start-test.sh PyTest测试
# 安装 pytest 和覆盖率统计插件 pip install pytest coverage cd tests
测试单个用例
pytest test_demo.py
测试所有用例
pytest
测试所有用例,同时展示测试用例的覆盖率统计
pytest --cov=. tests/
如何加入
直接联系 Jager,一起协同开发即可!🔗 More in this category