”微服务一条龙“最佳指南-“最佳实践”篇:大厂服务端部署

这是”微服务一条龙“的项目第四篇,在这里提前和各位网友说一句抱歉,最近事情比较多,所以这周更新的比较慢,所以这期我会给大家来一个大厂内部的“王牌部署方法” – AiohttpGunicorn,为什么我会采用这两个组件一起部署呢,且听我接下来分析分析。

1. 整体部署思路

这里的思路我讲的是大厂内部如何快速开发一个稳定性高的、最主要抗压以及避免服务端崩溃的web应用,
(1)首先,从开发做起,因为我们做的是基于Python3.6开发,并且现在处理大量请求的话,框架肯定是必须以支持异步请求为主,所以我们综合考虑Python中支持异步的Web开发框架,如torandoSanicAiohttpTwisted,我们比较一下这四个框架,下面我们来分析这四个框架的优劣

1. Twisted 
之所以把这个框架列为第一位,也是因为它是被最先淘汰掉的框架,为什么,一是因为它采用的异步模式是基
于yield的回调模式,也就是大家在`Scrapy`中会使用到的,处理完一个方法时注册到另一个方法,再不断的注册
回调方法,这样不断不断的回调写法在代码中让人看的就很烦。二是因为`Twisted`框架是比较古老的框架,也
是对于新的`Python`库以及`Python`标准支持的比较差,所以很重要的一个问题,跟不上时代,注定会被淘汰。
2. Sanic
这个框架是第二个被淘汰掉的,我们之所以淘汰它的原因是这个框架也是刚刚推出,并且`Sanic`是属于个人开
发,一是因为刚推出,整个生态比较差,并没有多少人开发周边的插件,虽然整个模式类似于`Flask`,但是
却不像`Flask`那样生态良好,二是因为其代码结构比较差,虽然由开发者推出的一份`bench`让人感觉这个框
架十分有前途,但是普通的业务开发过程中,并不像测试那样一个请求是一个`hello world`,所以对于这个框架我们还是先`OUT`!
3.Torando
作为先前`Python`异步库中的王牌老大,多少人基于`torando`开发而成的各种异步库,而且`Torando`在各种实
战表现中也是当仁不让的第一,但是因为它实现的是自己的一套异步逻辑,因此对于新出的`asyncio`来说,它
就显得有点弱势了,虽然`asyncio`可能也不是特别让人感觉满意,但是毕竟是官方的,因此我们还是放弃吧
4.Aiohttp
好,目前我们可以做的最好的选择就是依照官方的套路,使用`asyncio`作为异步库的,那基于`asyncio`开发的
`Web`框架除了`Sanic`就`Aiohttp`,`Aiohttp`就不用说了,`Aio-lib`的出品,也算是很正统,并且他们组织也
是推出了很多异步实现的库,那首先对于`Aiohttp`的支持是不用讲的,所以我们就是选择它了!!

所以,选框架的决策到此为止,我们选择Aiohttp
(2)接着我们想,我们之前在搞Python2开发的时候,我们一般是使用flask+wsgi服务器共同部署的模式,所以到Python3开发的时代,我们依旧可以使用这样的模式,当然也有人说直接用异步模式启动,这个就是可以的,将其他多个协程和web服务这个协程放在一个loop当中运行,不过,我觉得更官方的方法还是将其他协程方法放入Web服务中使用,将wsgi服务使用wsgi服务器启动。
(3)最后当然是封装成docker,使用docker swarm启动咯!!!

2. 实战部署(看看代码)

(1) 我们先来完成wsgi的部分,Aiohttp中使用web.Application()就是可以得到一个wsgi实例,我们就写一个这个的实例,文件是app/__init__.py

import asyncio
from aiohttp import web
try:
    import uvloop
except ImportError:
    pass
from settings import *

asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())


async def index(request):
    return web.Response(text="Welcome home!")


def init_app():
    app = web.Application()
    app.router.add_get('/', index)
    return app

(2)我们在另一个文件中生成一个wsgi对象,在main.py文件中

from app import init_app


def my_app():
    return init_app()


app = my_app()

(3)我们使用gunicorn文件来启动
大家先来看看

-c CONFIG    : CONFIG,配置文件的路径,通过配置文件启动;生产环境使用;

-b ADDRESS   : ADDRESS,ip加端口,绑定运行的主机;

-w INT, --workers INT:用于处理工作进程的数量,为正整数,默认为1
-k STRTING, --worker-class STRTING:要使用的工作模式,默认为sync异步,可以下载eventletgevent并指定

--threads INT:处理请求的工作线程数,使用指定数量的线程运行每个worker。为正整数,默认为1
--worker-connections INT:最大客户端并发数量,默认情况下这个值为1000
--backlog int:未决连接的最大数量,即等待服务的客户的数量。默认2048个,一般不修改;

-p FILE, --pid FILE:设置pid文件的文件名,如果不设置将不会创建pid文件


--access-logfile FILE   :  要写入的访问日志目录

--access-logformat STRING:要写入的访问日志格式

--error-logfile FILE, --log-file FILE  :  要写入错误日志的文件目录。

--log-level LEVEL   :   错误日志输出等级。


--limit-request-line INTHTTP请求头的行数的最大大小,此参数用于限制HTTP请求行的允许大小,默认情况下,这个值为4094。值是0~8190的数字。

--limit-request-fields INT   :  限制HTTP请求中请求头字段的数量。此字段用于限制请求头字段的数量以防止DDOS攻击,默认情况下,这个值为100,这个值不能超过32768

--limit-request-field-size INT  :  限制HTTP请求中请求头的大小,默认情况下这个值为8190字节。值是一个整数或者0,当该值为0时,表示将对请求头大小不做限制


-t INT, --timeout INT:超过这么多秒后工作将被杀掉,并重新启动。一般设定为30秒;

--daemon: 是否以守护进程启动,默认false
--chdir: 在加载应用程序之前切换目录;

--graceful-timeout INT:默认情况下,这个值为30,在超时(从接收到重启信号开始)之后仍然活着的工作将被强行杀死;一般使用默认;

--keep-alive INT:在keep-alive连接上等待请求的秒数,默认情况下值为2。一般设定在1~5秒之间。

--reload:默认为False。此设置用于开发,每当应用程序发生更改时,都会导致工作重新启动。

--spew:打印服务器执行过的每一条语句,默认False。此选择为原子性的,即要么全部打印,要么全部不打印;

--check-config   :显示现在的配置,默认值为False,即显示。

-e ENV, --env ENV: 设置环境变量;

大家可以在文件中把各个变量换一下就可以了

# gunicorn.conf
"""
这里你可以使用logger记录日志
"""
workers = 4
worker_class = 'aiohttp.GunicornWebWorker'
bind = '127.0.0.1:8080'

(4)最后我们来写startup.sh的脚本

gunicorn main:app -c gunicorn.py

(5)最后写Dockerfile完事

FROM python:3.6.5

WORKDIR /data/

COPY . .

RUN pip install pipenv && pipenv install

CMD [ "sh", "startup.sh" ]

最后大家想要看具体的代码和目录结构,可以看我的github

你可能感兴趣的:(”微服务一条龙“最佳指南)