熬着熬着,让时间熬成想要的那个自己,一个美丽的人。
分类: Python/Ruby
2014-01-23 16:43:07
Twisted 是一个生成可扩展的交叉平台的网络server和client的工具。在开发环境中以标准化的方式来更简易的部署这些应用是一个平台非常重要的一部分,像这种大量的应用。
为了达到这个目的,Twisted提供了一个应用程序框架:一个可重复利用的可扩展的方式来部署Twisted应用。允许一个程序员通过利用应用程序的目前所用工具来设定运行的方式,以此避免模板代码,包括妖魔化,运行记录,用一个惯用的reactor,数据代码以及其他更多。
Twisted应用程序框架
应用程序的基础有5个主要部分:服务,程序,TAC文件,插件和twisted命令行功能。为了解释这个基础部分,我们会将第二章中的echo server转换成应用。Example6-1 重新应用了代码。
服务
服务就是可用被启动或停止、实现IService接口。Twisted有包括TCP,FTP,HTTP,SSH,DNS等很多其他的协议的服务实现。很多服务可用单独一个程序来注册。
IService接口的核心:
startService
开启服务。包括加载配置数据、设定数据库连接或监听某一个端口
stopService
关闭服务。这可能包括保存磁盘状态,关闭数据库连接,或者是停止监听端口
我们的echo服务运用了TCP,因此我们可以运用Twisted默认的TCPServer实现它的IService接口。
应用
一个应用是上层的容器,容纳一个或多个被部署到一起的服务。服务会跟随程序一起注册,twisted部署功能简单描述了搜索以及运行程序。
我们会创建一个echo服务能注册的echo应用。
TAC文件(Twisted application configuration)
当写一个Twisted程序时,TAC文件作为一般的python文件,开发者会对负责编写代码启动或终止reactor以及配置项目。在Twisted应用的基础设施下面,协议实现位于模块,运用这些协议的服务是在Twisted应用配置文件注册,reactor和配置由外部功能来管理。
为了把echo server转换成echo应用,我们可以应用下面的简单的算法:
1.把服务的Protocol和Factory都移动到它们自己的模块中
2.在TAC文件中:
A.创建一个twisted.application.service.Application的实例
B.不要像第2章中用reactor来注册Protocol Factory,用服务来注册factory,用Application来注册那个服务
我们的例子中,这意味着创建一个TCPServer服务实例,用EchoFactory在端口8000创建EchoProtocol。管理reactor的代码会被twisted关注,我们以后讨论。程序代码被分隔为两个文件:echo.py,如Example6-2所示;和echo_server.tac,如Example6-3所示。
twistd
Twsitd是一个跨平台的部署Twisted应用的命令。运行TAC文件,处理起始和终止应用程序。作为Twisted的一系列中的一部分,包括网络编程方法,twistd跟同大量有用的配置标识、比如daemonizing程序的标识、确定log文件的位置、销毁记录、运行在chroot中、在非默认的reactor下运行或者甚至是在一个文件标识下运行程序。
运行echo server应用:twistd -y echo_server.tac
这个简单的例子里twistd启动了一个被daemonized的应用实例,logging是twistd.log,一个PID贮存在twisted.pid中。启动又停止应用后,log如下:
为了遏止daemonization,输出log,用-n(--nodaemon)。Twistd的一系列应用,用twistd--help可以查看,或者查阅手册。
我们自己并未写代码,我们用了免费的daemonization和logging。用Twisted应用框架运行服务可以让开发者避免写模板式的代码来实现一般的server功能。
Plugins
另一个基于TAC-based系统运行Twisted应用的方式就是插件系统。当一个TAC系统更容易注册一个简单的层次结构预先定义的服务用一个应用配置文件,插件系统更容易注册自定义的服务,比如twistd的子命令格式或者扩展命令行接口给一个应用。
运用这个插件系统可以:
l 只有当API插件需要保持稳定的时候,使得第三方开发人员更易扩展软件
l 插件发现能力是可代码化的。当一个应用程序运行时,插件可以被加载并保持,在程序每次启动后读能重加载或者在运行时给出是否加载的选项,在应用启动后允许定位新的插件。
为了用Twisted插件系统扩展一个应用程序,你需要做的就是创建对象来实现IPlugin接口,并把对象放到一个特别的地点让插件系统知道去获取。
已经把我们的echo server转变成了一个Twisted 应用,再转换成一个Twisted的插件就很简单了。用之前的模块,就是那个包含了Echo protocol和EchoFactory定义的,我们增加一个路径叫做twisted,再增加一个子路径称为plugins,里面包含我们的echo 插件定义。用图表示,路径结构如下:
echoproject/
---- echo.py
---- Twisted
---- Plugins
---- Echo_plugin.py
用twistd通过配置确定我们的echo 服务的端口。Example 6-4显示了需要的逻辑。
一个服务插件需要至少两部分:
1. twisted.python.usage.Options的子类,一个类似optParameters的类来描述给服务的命令行参数。
我们的例子,optParameters描述了一个-p/--port 配置选项,默认端口8000
2. 同时实现IPlugin和IServiceMaker实例。这个类实现了makeService方法,传递命令行的配置选项给服务。还定义了twistd显示的服务的命名和描述。
在我们的李自力,通过TACimplementation我们创建了TCPServer服务,但是端口没有采用硬编码的8000,而是从命令行参数中获取。
通过插件定义,假如我们运行twistd从顶级项目路径,我们的echo server就会作为一个选项出现在twistd--help的结果中。运行twistd echo--port=1235会在echo server启动端口1235.
更多twistd例子
Twistd有很多命令,使得它更为简单的变成0代码服务。下面就是几个例子:
Twistd web --port 8080 --path
运行一个8080端口的HTTP server,提供动态和静态的当前工作路径的内容。访问可以查看路径列表。
Twistd dns -v -p 5553 --hosts-file=hosts
在端口5553运行一个DNS server,解析叫做在格式/etc/hosts下面的叫做hosts文件。
比如说你想运行你自己的Twisted的DNS解析器,也想降低社交媒体。创建一个hosts文 件,解析facebook.com,twitter.com,以及reddit.com给localhost,127.0.0.1:
127.0.0.1 facebook.com
127.0.0.1 twitter.com
127.0.0.1 reddit.com
然后运行你的twistd DNS解析器,配置你自己的操作系统来尝试一下解析器,快速让你无法浏览那些网站。
一个能证明解析器是有效的快速命令行就是运动dig DNS查询功能,首先,查询默认的解析器,然后查询twistd解析器:
Sudo twistd conch -p tcp:2222
在2222端口运行一个ssh server。Ssh 码必须独立设置。
Twisted mail -E -H localhost -d localhost=emails
运行一个ESMTP POP3 server,为localhost接收邮件并保存到emails路径。
不知道你是否也这样,我对这些简单的twistd单行命令实现的强大的网络功能感到兴奋。
更多练习和下一步计划
这个章节主要接收了Twisted应用框架的配置和部署一个标准化的Twisted程序。通过这个框架有两种主要的方式来部署应用:TAC文件和插件。TAC文件更为简单,但不易扩展,更适合于简单的server部署,比如想充分利用Twisted的集成的部署特征,像logging和daemonization。插件可以更自由的初始配置,但是需要给第三方程序猿一个稳定的接口给或者更多的控制来处理插件查找和加载。
Twisted Core HOWTO提供了一个应用框架和TAC文件的概述,还有关于插件的介绍,特别是对twistd插件的详细叙述。
Twisted还有一个给server提供可插的认证系统,叫做Twisted Cred,这个系统的一个功能就是给一个应用程序增加认证,在第9章会详细介绍。
建议练习
1. 把一个Twisted应用转为基于TAC文件或基于插件的服务,就直接用本书中任何一个你能练习的server。
尝试Example 2-5中的chat server转为一个Twisted 应用,从Example4-8的非阻塞web server转换成基于插件的服务。
2. Twisted--help中列出的所有命令都是插件,在Twisted的源代码twisted/plugins/下面的你都可以查看。选择一条通读该服务的定义。