引言 在JAVA中可以使用Tomcat来部署装载War包,那么线上Python的Flask该怎么部署?常用的方案是,我们可以使用Tornado来部署Flask应用本文知识点概述:

  1. 为什么要选择Tornado
  2. 什么是Tornado
  3. 安装Tornado
  4. Tornado集成Flask
  5. Jenkins(Pipeline)整合Tornado+flask

1.选择Tornado部署Flask的理由

Tornado是”唯一兼容:windows、macOS、Linux,,且支持Python3+”

1.什么是Tornado

image.png官方文档

Tornado 是一个python web框架和异步网络库,最初开发于 FriendFeed . 通过使用非阻塞网络I/O,Tornado可以扩展到数万个开放连接,使其非常适合 long pollingWebSockets 以及其他需要与每个用户建立长期连接的应用程序。

2.安装Tornado

  1. # 使用pipenv进行安装
  2. pipenv install tornado

3.Tornado集成flask

本节最关键的内容是,在tornado容器之中装在flask(app),具体实现参见runServe.py文件:
image.png

  1. #!/usr/bin/env pytho
  2. # -*- coding: utf-8 -*-
  3. """
  4. @author:xiecuihao
  5. @file:runFlask.py
  6. @time:2022/04/16
  7. """
  8. from tornado.wsgi import WSGIContainer
  9. from tornado.httpserver import HTTPServer
  10. from tornado.ioloop import IOLoop
  11. from main import app
  12. flaskPort=8806
  13. def runFlask():
  14. print("init-flask")
  15. http_server= HTTPServer(WSGIContainer(app))
  16. http_server.listen(flaskPort)
  17. print("start-flask")
  18. IOLoop.instance().start()
  19. if __name__ == '__main__':
  20. runFlask()

4.Jenkins(Pipeline)整合Tornado+Flask

在jenkins中运行flask,主要就是在后台(nohup)运行“(章节2中的)runServe.py文件”。其中,直接执行nohup的话,jenkins会杀掉其进程,所以需要特殊处理【参考 【解决方案】Jenkins杀死nohup进程】。

1.pipeline代码实现

具体实现参见下文代码示例:
image.png

  1. node {
  2. stage('拉取') {
  3. // Run the maven build
  4. deleteDir()
  5. cleanWs()
  6. git credentialsId: 'codling-jamesz2011', url: 'https://e.coding.net/cooling37/tmp-web/TMP-back.git'
  7. }
  8. stage('环境初始化') {
  9. sh 'pipenv install'
  10. }
  11. stage('编译') {
  12. withEnv(['JENKINS_NODE_COOKIE=dontkillme']) {
  13. //sh 'pwd'
  14. sh 'nohup pipenv run python -u ${WORKSPACE}/runServe.py > out.log 2>&1 &' // (后台)运行flask(port:8809)
  15. }
  16. }
  17. }

2.验证是否部署成功

编号 验证点 备注
1 【jenkins】项目的状态:success
2 【访问】能正常访问”ip:8809”
3 【Linux】监控(losf)flask[8809]端口是否被占用(即被占用->服务运行正常)

1.jenkins项目状态

image.png

2.访问flask服务

image.png

3.Linux监控Flask服务的运行状态

若执行”losf -i:8809“命令显示“端口被占用”,则表示“flask服务正常运行”;反之则否。
image.png