openfaas 尝试整合flask记录(一)

原创
05/04 18:04
阅读数 229

尝试写一个flask的模板,有了上次写gin 模板的经验就容易了,主要是在alpine 镜像安装 gunicorn,gevent 时网上查了很多资料。代码目录结构

先处理 Dockerfile文件

FROM openfaas/of-watchdog:0.5.3 as watchdog
FROM python:3.7.7-alpine3.11

RUN apk --no-cache add ca-certificates \
    && addgroup -S app && adduser -S -g app app \
    && mkdir -p /home/app \
    && chown app /home/app
#为了安装gevent,安装 .build-deps gcc libc-dev build-base python-dev py-gevent libffi-dev 用于gcc编译 gevent有依赖 libffi
RUN apk add --no-cache --virtual .build-deps gcc libc-dev build-base python-dev py-gevent libffi-dev  make \
    && pip install --no-cache-dir  -i http://pypi.douban.com/simple --trusted-host=pypi.douban.com  meinheld gunicorn gevent flask \
    && apk del .build-deps gcc libc-dev build-base python-dev py-gevent libffi-dev  make
#编译完就删除
WORKDIR /home/app
#复制fwatchdog程序过来
COPY --from=watchdog /fwatchdog .
#主要python文件和gunicorn配置文件
COPY main.py .
COPY __init__.py .
COPY gunicorn.conf.py .
#复制handler目录,来自用户写handler文件
COPY function ./function
#fwatchdog运行权限
RUN chmod +x fwatchdog
#使用app用户
RUN chown -R app /home/app

#使用app用户
USER app
RUN export FLASK_APP=main.py
#安装用户需要的依赖,来handler目录的requirements.txt
RUN pip install --no-cache-dir -r ./function/requirements.txt  -i http://pypi.douban.com/simple --trusted-host=pypi.douban.com
#使用gunicorn运行
ENV fprocess="gunicorn main:app -c gunicorn.conf.py"
ENV cgi_headers="true"
#http协议
ENV mode="http"
#反向代理flask服务的5000端口
ENV upstream_url="http://127.0.0.1:5000"


EXPOSE 8080

HEALTHCHECK --interval=3s CMD [ -e /tmp/.lock ] || exit 1

CMD ["./fwatchdog"]

运行文件 main.py

from flask import Flask
from function.handler import handler_blueprint
app = Flask(__name__)
#使用 blueprint分模块导入用户写的handler目录文件
app.register_blueprint(handler_blueprint)

if __name__ == '__main__':
    app.run(debug=True)

使用 blueprint 注册函数文件handler

from flask import Blueprint
handler_blueprint = Blueprint(
	'handler',
  	__name__,
  	url_prefix='/api/handler'
)
@handler_blueprint.route("/")
def hello():
    return "Hello, World!"

gunicorn配置文件  gunicorn.conf.py (感觉又套了一个娃)

workers = 5    # 定义同时开启的处理请求的进程数量,根据网站流量适当调整
worker_class = "gevent"   # 采用gevent库,支持异步处理请求,提高吞吐量
#对外5000端口提供服务
bind = "0.0.0.0:5000"
#使用app用户运行
user="app"
#运行跟目录
chdir="/home/app"

openfaas 模板配置文件 template.yml

language: openfaas-flask-template
fprocess: gunicorn main:app -c gunicorn.conf.py

有了模板写个demo ,flask_demo

flask_demo/handler.py (其实只是抄了上面的文件)

 

from flask import Blueprint
handler_blueprint = Blueprint(
	'handler',
  	__name__,
  	url_prefix='/api/handler'
)
@handler_blueprint.route("/")
def hello():
    return "Hello, World!"

安装函数 faas up -f flask-demo.yml ,经过漫长的build 过程

访问  curl   http://127.0.0.1:31112/function/flask-demo/api/handler/

 

 

代码地址备份 https://gitee.com/awol2010ex/openfaas-flask-template

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部