1. 设计模型
废话不多说,直接上图
上面的图可以看出,Tornado大概可以分为四层,且不仅仅是一个WEB框架,还完整地实现了HTTP服务器和客户端。
最上层是Web框架,包括了web应用和请求的封装,模板以及本地化等Web框架需要的功能。
HTTP/HTTPS层基于HTTP1.x协议实现了HTTP服务器和客户端。
TCP层实现了客户端和服务器,负责数据传输。
底层的Event层处理IOLoop事件循环,保证整个框架异步。
2. 核心文件
主要核心是以下几个文件:
app.py tornado/web.py tornado/httpserver.py tornado/tcpserver.py tornado/ioloop.py tornado/iostream.py tornado/platform/epoll.py tornado/platform/asyncio.py
复制
app.py 是自己写的,定义路由规则和请求处理Handler类,然后创建 application,发起server监听,运行loop。
web.py定义了 Application 和 RequestHandler 类,在 app.py 编写代码就需要导入。Application 是单例对象,总揽全局路由,创建服务器负责监听,并把服务器传回来的请求进行转发。RequestHandler 是个功能很丰富的类,基本上 Web 开发需要的它都具备了,比如http请求方法,redirect,flush,close,header,cookie,render(模板),xsrf,etag等等。
通过web.py可以跟踪到 httpserver.py 和 tcpserver.py。这两个文件主要是实现 http1.x 协议,解析 header 和 body, 生成request,回调给 appliaction,实现一个 http 服务器。这也是非常考究性能的一块(IO),所以它和其它很多都连接到了一起,比如 IOLoop,IOStream,HTTPConnection 等等。这里 HTTPConnection 是实现了 http 协议的部分,它关注 Connection 嘛,这是 http 才有的。至于监听端口,IO事件,读写缓冲区,建立连接之类都是在它的下层--tcp里需要考虑的,所以,tcpserver 才是和它们打交道的地方。
iostream.py 负责IO的。说到IO,就得提缓冲区和IO事件。缓冲区的处理在IOStream或者SSLIOstream里,IO事件的异步处理就需要 IOLoop 了。
ioloop.py。如果你用过 select/poll/epoll的话,对它的处理模型应该相当熟悉。简言之,就是一个循环,循环里等待事件,然后处理事件。这是开发高性能服务器的常见模型,tornado 的异步能力就是在这个类里得到保证的。
epoll.py和asyncio。这个就是声明一下服务器使用 epoll 或者 asyncio 事件模型。5.x版本之前是选择 select/poll/epoll/kqueue 其中的一种作为事件分发模型,是在 tornado 里自动根据操作系统的类型而做的选择。5.x之后默认使用asyncio模型。这里选epoll和asyncio作为代表。
3. 简易流程
此流程图演示了从app应用启动到http请求,框架里是怎么处理的。启动的时候监听tcp,注册socket到IOLoop。然后请求过程中 socket处理数据传输,到request对象的建立,请求数据Header和Body传回给Application,最后调取RequestHandler,也就是自己写的app.py,执行Http方法(get or post)处理数据,结束整个流程。
下一篇则介绍Tornado的设计模型和划重点看那些代码文件。更多Tornado相关文章请查阅小专栏https://xiaozhuanlan.com/tornado
更多精彩文章请关注公众号: ChengTian_Tech