Thrift Python入门者的经验

Posted on Fri 16 March 2012 in it

缘起

新阳创建了一个基于Thrift的开发平台。除了基于Thrift服务本身,最吸引人的地方在于这个平台提供了服务框架生成(支持Java和Php)、注册发布和监控的集成,他们事业部好多新起的SOA服务项目都是在这个平台下开发的。 在新阳的大力倡导和帮助下,我们部门也开始尝试接入这个平台。为了能够整合进去,首先得要在基于Python的基础架构上整合fb303。

经过一周多,利用边角时间写了ThriftPy工程。可以指导大家开发基于Thrift的Python实现(详见ThriftPy/readme)

而在开发的过程中,碰到了一些很有趣的问题但无法写入开发指导,所以就有了这篇文字。

开发经验分享

一个好软件的源代码看起来一定是清晰而舒服的,在编写过程中对开发效率和运行效率的权衡经过了深思熟虑。

Thrift开发约定(目录结构、命名、注释等)

要想保证Thrift开发工程的清晰一致,一定需要对开发进行约定。

目录结构约定

src gen-py : thrift gen 生成的python代码 py : 手工编写的代码 test : 测试代码 if : idl--*.thrift

==== 命名约定 ====

'''IDL''' -- IDL中定义的结构和服务要进行最详细的注释 /* * Scan Service * /

service ScanService extends BService {

-- IDL中定义的service以Service结尾 service XXXService {

'''Thrift服务的实现和支持类'''

## 实现服务类的命名
XXXServiceBase.py

class XXXServiceBase(XXXService.Iface)

避免PYTHONPATH路径下module重名

注意到这个问题是因为在运行时经常出现找不到Module的情况 No module named xxx.yyy.zzz... 看了'''Python解析器加载Module的机制''',说Python解析器是先从当前路径开始搜索module路径的,如果没有找到,就按照一定的顺序继续寻找。

假定希望加载一个叫做xxx.yyy.zzz.Class.py的类,如果当前路径下有一个xxx.xxx的包,那么不好意思,Python解析器不会再到其他地方去找Class.py了。

这是从实际运行中可以推断出的加载逻辑,简单粗暴,想到后倒是还可以接受。

Python的多重继承

多重继承是个容易弄得很恶心的事,Python也和C++一样具有这个特性。

但为了让基础服务类继承fb303,这个特性还是挺给力的。上面的服务继承fb303后的样子如下:

## 实现服务类的命名
XXXServiceBase.py

class XXXServiceBase(BServiceBase, XXXService.Iface)

其他需要注意的要点

  1. 从IDL生成*.py的时候,参数要指定用utf8的,这样生成的源代码在eclipse里打开不会报错。

示例如下: thrift -r -gen py:utf8strings abc.thrift

[附属]环境说明

Create Thrift Python Runtime

cd thrift-0.7.0/lib/py sudo python setup.py install

Linux运行环境

- OS $ uname -a Linux ubuntu 3.0.0-12-server #20-Ubuntu SMP Fri Oct 7 16:36:30 UTC 2011 x86_64 x86_64 x86_64 GNU/Linux

  • python $ python -V Python 2.7.2+

  • java $ java -version java version "1.6.0_23" OpenJDK Runtime Environment (IcedTea6 1.11pre) (6b23~pre11-0ubuntu1.11.10.1) OpenJDK 64-Bit Server VM (build 20.0-b11, mixed mode)

开发环境

- OS $ uname -v Darwin Kernel Version 11.3.0: Thu Jan 12 18:47:41 PST 2012; root:xnu-1699.24.23~1/RELEASE_X86_64

  • python $ python -V Python 2.7.1

  • java $ java -version java version "1.6.0_29"

  • ide Eclipse Java EE IDE for Web Developers.

Version: Helios Service Release 2

PyDev for Eclipse 2.4.0.2012020116