Tornado webserver搭建及测试

Tornado简介

Tornado是一种web服务器的开源版本,同时提供web framework的api,可以直接构建自己的web程序。
Tornado与目前主流的web框架有着明显的区别:它是非阻塞式服务器,而且速度相当快。得利于其非阻塞的方式和对epoll的运用,Tornado每秒可以处理数以千计的连接,这意味着对于实时Web服务来说,Tornado是一个比较理想的轻量级web框架。Tornado为纯pyhon版本,支持HTTP、FTP、SMTP协议。
Tornado是基于ioloop高性能异步框架,可以处理大量的非活跃长连接。使用Tornado可以大大的减少web系统中使用的组件数量,用最少的代码量和极其精简的架构实现你的系统。
Tornado是单线程的,Python虽然有多线程,但是Python的解释器有GIL,这点非常影响Tornado利用多核的能力,只能通过多进程来利用多核。既然多进程,一般需要在前端放置nginx或haproxy来做负载均衡的反向代理,或是使用这些应用服务器的wsgi模块来管理进程的生命周期等等。

反向代理

反向代理其作用就是将接收到的HTTP请求按照一定的规则转发给后端其他服务器处理。
比如在你的一台机器上跑了三个Tornado应用:foo1,foo2,foo3,端口分别为8000,8001,8003,你希望用户可以直接通过80端口来访问这些应用,这时可以用nginx或haproxy来达到这个目的了。将nginx跑在80端口,当其接收到请求时,如果是/foo1,就转发给8000端口处理;如果是/foo2,就转发给8001端口处理,foo3类似。

搭建HttpServer

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import tornado.httpserver
import tornado.ioloop
import tornado.web
class HelloWorldHandler(tornado.web.RequestHandler):
def get(self):
self.write("Hello, world")
application = tornado.web.Application([(r"/helloworld[/]?", HelloWorldHandler),])
if __name__ == "__main__":
http_server = tornado.httpserver.HTTPServer(application,body_timeout=20)
http_server.listen(80)
tornado.ioloop.IOLoop.instance().start()

客户端测试

1
2
3
4
5
6
7
8
9
10
11
#urllib2发送请求
#urllib2是Python2的HTTP标准库
import urllib
import urllib2
url = "http://http://0.0.0.0:80/helloworld"
request = urllib2.Request(url)
res_data = urllib2.urlopen(request)
content = res_data.read()
print content
1
2
3
4
5
6
7
8
9
10
11
12
#Requests发送请求
#Requests使用的是urllib3,继承了urllib2的所有特性,第三方库,需安装
import requests
import json
url = "http://http://0.0.0.0:80/helloworld"
s = requests.Session()
r = s.get(url)
if (r.status_code) == 200:
obj = json.loads(r.content)
print obj

文章参考:http://www.tornadoweb.cn/
https://www.zhihu.com/question/20136991

如果觉得我的文章对您有用,请随意赞赏