基于werkzeug的短URL服务

haojunyu e7b5811a9c add shortly 2 years ago
static e7b5811a9c add shortly 2 years ago
templates e7b5811a9c add shortly 2 years ago
.gitignore 56a2993926 init shortly 2 years ago
Pipfile e7b5811a9c add shortly 2 years ago
README.md 56a2993926 init shortly 2 years ago
shortly.py e7b5811a9c add shortly 2 years ago

README.md

帮助文档

短 URL 服务,使用 python3 + werkzeug + redis 构建。

准备

环境依赖

  • python3.7 基础环境
  • pipenv python依赖库管理
  • web框架 flask + gunicorn
  • sqlalchemy ORM/持久层框架
  • casbin 开源访问控制框架
  • Web API restful + graphql
  • api doc flasgger
  • 认证授权 flask-login/flask-httpauth
  • APM 应用程序性能监控 https://blog.csdn.net/UbuntuTouch/article/details/105486173

构建 api 开发环境

渊海图谱 api 的开发环境是基于 python3.7 。推荐本地使用 VS Code 通过 Remote Development 插件在 服务器(hadoop010-hadoop012)上开发测试。

构建步骤如下:

  1. 安装 pipenv 管理项目虚拟环境,并设置环境变量(.venv会在项目根目录)
    python3 -m pip install pipenv
    echo "export PIPENV_VENV_IN_PROJECT=1" >> ~/.bashrc
    source ~/.bashrc
  1. 安装项目依赖的第三方库
    pipenv install -d
  1. 激活虚拟环境
    pipenv shell
  1. 查看默认开发环境的配置 config.py 中类 DevelopmentConfig,酌情修改 默认的开发环境是使用 hadoop011 上 yskg3_dev stack 的后端依赖 mysql,redis,arangodb, minio 等
  2. 启动开发环境
   pipenv run flask run -h 0.0.0.0 -p 5555

常用命令

# 安装pipenv包来管理依赖库
python3 -m pip install pipenv
# 设置环境变量,使得本地创建虚拟环境.venv
export PIPENV_VENV_IN_PROJECT=1
## 开发环境
pipenv intall -d
## 生成环境
pipenv install

## 在虚拟环境中运行程序
### 启动api服务,开发环境
pipenv run flask run -h 0.0.0.0 -p 5555
### 启动api服务,生产环境
export FLASK_ENV=production && pipenv run flask run -h 0.0.0.0 -p 5555
### 启动api终端,用于调试
pipenv run flask shell


## 数据库操作
### 初始化数据库迁移脚本
pipenv run flask db init
### 同步数据库迁移脚本
pipenv run flask db migrate
### 本地数据库变更同步到数据库
pipenv run flask db upgrade

## api服务


### 清空数据库
pipenv run python sync_server.py clear main


## 在虚拟环境中运行所有测试用例
pipenv run python -m unittest
## 在虚拟环境中运行指定测试文件
pipenv run python -m unittest test/test_config.py

## 在虚拟环境中推mysql数据到kafka中
### 推送一条
pipenv run python mysql2kafka.py test
### 推送全部
pipenv run python mysql2kafka.py main

目录框架

  • app/ 用于存放应用
    • templates/
    • statics/
    • main/ 主程序
    • init.py 创建蓝本
    • errors.py 错误处理
    • forms.py
    • views.py 程序的路由
    • api_1_0/ REST Web服务
    • init.py 创建蓝本
    • modelName.py 具体模块
    • errors.py 错误处理
    • init.py
    • email.py
    • models.py
  • migrations/ 数据库迁移脚本
  • tests/ 单元测试
    • init.py
    • test*.py
  • imgs/ 小程序所使用的图片
  • venv/ 这里是开发所需要的python虚拟环境,用virtualenvwrapper管理后,该文件在$HOME/.virtualenv/下面
  • serverConfig/ 这里存放服务器配置时使用的nginx,uwsgi配置文件以及https证书
  • requirements.txt 项目所有依赖包 pip freeze > requirements.txt
  • config.py 配置文件
  • flasky.py 用于启动程序

基本功能

接口

删除的点:

  • api一般涉及到json格式
  • sentry 使用es来来搞

TODO:

  • 项目方面

    1. 自定义的Request使用方式比较低级,学习自定义flask扩展 http://www.pythondoc.com/flask/patterns/appdispatch.html#app-dispatch
    2. 参数校验 使用marshmallow 复用之前的代码
      1. 不使用Flask-Restful自带的reqparse,
      2. 不使用flask-wtf(只是api,不是表单提交),
      3. 不使用flask-marshmallow(感觉太重,好的实现:https://www.jianshu.com/p/2298b271c17a,详细解读https://blog.csdn.net/qq_41637554/article/details/82464186)
    3. 配置文件到处引用,目标:一个app只有一处配置文件,并且根据不同的环境自动区分

    4. 测试用例(写了两个)

    5. 应答码规范

    6. arangodb 测试用例会报如下警告:

      ./usr/local/python3/lib/python3.7/unittest/suite.py:84: ResourceWarning: unclosed return self.run(*args, **kwds)

  • 功能

    1. 消费kafka和读取mysql导入arangodb
  • 性能优化方向

    1. tornado 异步
    2. pymysql 异步+线程池
    3. QPS 100, 单请求处理时间在3s以内
    4. kafka 可能使用多进行来加快消费
  • 代码规范

    • python 代码使用 autopep8 和 pylint 做代码规范和语义检查
    • markdown 代码使用 markdownlint 做规范检查

    部署

    部署详情

    接口压测

    目前使用siege对三个接口进行压测,每个接口准备了10个url的文件,在并发数为100,请求次数为10次情况下进行压测。

    后台查询接口

    日期 并发数 成功率率 响应时间 每秒传输数据 实际最高并发数 QPS 说明
    20200722 100 100% 4.54s 0.4M 85 18
    20200730 100 100% 5.39s 0.15M 86 15.9 备注:添加了关系
    20200803 200 100% 9.49s 0.14M 153 16.2 备注:添加了关系
    20200805 200 100% 1.73s 0.65M 133 75 使用docker-compose启服务,replicas=8

    节点探索接口

    日期 并发数 成功率率 响应时间 每秒传输数据 实际最高并发数 QPS 说明
    20200722 100 100% 0.53s 0.27M 41 77
    20200730 100 100% 0.74s 0.17M 50 67 备注:添加了关系
    20200803 200 100% 1.27s 0.16M 127 100.7 备注:添加了关系
    20200805 200 100% 0.27s 0.30M 48 182 使用docker-compose启服务,replicas=8

    路径探索接口

    日期 并发数 成功率率 响应时间 每秒传输数据 实际最高并发数 QPS 说明
    20200722 100 100% 0.68s 0.31M 46 67
    20200730 100 100% 0.63s 0.04M 45 71 备注:添加了关系
    20200803 200 100% 0.87s 0.01M 109 125.7 备注:添加了关系
    20200805 200 100% 0.05s 0.01M 10 215 使用docker-compose启服务,replicas=8

    政策脉络接口

    日期 并发数 成功率率 响应时间 每秒传输数据 实际最高并发数 QPS 说明
    20200730 100 100% 1.42s 0.05M 66 46
    20200803 100 100% 2.69s 0.03M 78 29 备注:添加了关系
    20200803 200 100% 5.22s 0.03M 158 30.4 备注:添加了关系
    20200805 200 100% 1.08s 0.11M 111 103 使用docker-compose启服务,replicas=8

    压测详情

    参考文献

    1. python服务融入Spring Cloud体系
    2. tornado和pymysql的集成
    3. tornado的mysql异步操作