目录


简介

summerrpc是一个Python的RPC框架。它支持服务的注册与发现,目前支持使用Zookeeper作为注册中心。summerrpc是基于Tornado实现的,也就是说在框架层面使用的是基于事件的异步网络模型。我们知道,在Python世界中,如果一个框架是基于异步网络库实现的,那么在这个框架中,不能使用任何同步的网络操作。比如著名的爬虫框架Scrapy是基于Twisted实现的,那么在Scrapy中,就不能使用PyMongo这个MongoDB驱动,否则,就会导致整个进程退化为单线程程序,从而导致性能不足。在summerrpc中,对此进行了改进,在网络层面仍旧通过使用异步编程提升吞吐量,但是在执行业务方法时,如果该业务方法是tornado协程,这意味这该方法不会产生阻塞,因此,在IOLoop线程,也就是主线程中,运行它;否则,会使用一个单独的线程来运行它,从而达到不阻塞IOLoop线程的目的。每个RpcServer实例内部都会维护一个线程池,专门用于运行,这些使用了阻塞操作的业务方法,线程池的大小可以通过RpcServerBuilder.with_thread_pool_size(thread_pool_size)方法来设置。
github地址:https://github.com/tim-chow/summerrpc


架构概览

summerrpc-arch-1.png
summerrpc-arch-2.png


快速入门

0,因为目前只支持使用Zookeeper作为注册中心,所以需要先安装并启动Zookeeper集群。
1,安装Python的Zookeeper驱动zkpython,安装过程,可以参考这篇文档。需要注意的是,不要忘记配置环境变量LD_LIBRARY_PATH
2,启动Producer:


python test_server.py

3,启动Consumer:


python test_client.py


Exporter

用来导入要暴漏的方法,比如:


from summerrpc.exporter import Exporter

exporter = Exporter() \
    .export(业务类) \
    .export(业务类)

被导入的业务方法,会被保存到Exporter对象内部的一个字典中,该字典形如:{业务类名: {业务方法名: 方法对象, ...}, ...}。


Serializer

用来进行对Request和Result的序列化和反序列化。
序列化是指将程序中的对象转换成字节流,以使其能够在网络上进行传输。
反序列化是指将字节流还原成程序中的对象。
关于Python中的序列化和反序列化,可以参考Python官网的pickle模块的文档
summerrpc只支持PickleSerializer。


Transport

用来生成、解析协议,以及发送、接收数据包。
在RpcServer端必须使用non-blocking IO,在client端可以按需选择使用阻塞IO还是非阻塞IO。
summerrpc目前支持阻塞的和非阻塞的RecordTransport。


Registry

RpcServer端在启动完成之后,会将自己注册到注册中心,在关闭之前或意外crash之后,会将自己从注册中心清理。
Client端会异步地接收服务列表的变更,并缓存到内存的cache中,这样可以保证,即使注册中心不可用了,也可以使用本地的cache。
summerrpc目前只支持ZookeeperRegistry。


Cluster

Cluster对象组合了两个对象:

其大致执行流程是:


Stub 和 Refer

Stub对象就是客户端的存根。其内部维护了三个对象:

客户端在创建Stub对象之后,可以通过其refer()方法引用业务类,refer方法会返回一个Refer对象。然后通过该Refer对象,调用业务类的业务方法,Refer会“透明地”将请求代理给远程服务。

Refer代理的过程大致如下:


RpcServer

RpcServer对象主要组合了以下的对象:

其主要执行流程是:


扩展

为了进行服务熔断,错误重试等,考虑在Client端增加Protocol组件,可以通过在该组件上注册一系列的filter等,来完成上述功能。