【发布时间】:2011-03-12 23:55:47
【问题描述】:
我创建了一个简单的RPC 服务器来执行我们团队共有的某些任务,但这些任务是从不同的网络调用的。服务器看起来像这样(为简洁起见,我不包括错误处理):
from twisted.internet.protocol import Protocol, Factory
from twisted.internet import reactor
import json
class MyProtocol(Protocol):
def dataReceived(self, data):
req = json.loads(data) # create a dictionary from JSON string
method = getattr(self, req['method']) # get the method
method(req['params']) # call the method
def add(self, params):
result = {} # initialize a dictionary to convert later to JSON
result['result'] = sum(params)
result['error'] = None
result['id'] = 1
self.transport.write(json.dumps(result)) # return a JSON string
self.transport.loseConnection() # close connection
factory = Factory()
factory.protocol = MyProtocol
reactor.listenTCP(8080, factory)
reactor.run()
这很简单:服务端接收到客户端的JSON RPC请求,寻找方法,调用传参的方法。方法本身就是返回 JSON RPC 响应的方法。对于不太熟悉的人,JSON RPC 看起来大致如下:
request:
{"method":"my_method", "params":[1,2,3], "id":"my_id"}
response:
{"result":"my_result", "error":null, "id":"my_id"}
我拥有的 RPC 服务器非常适合我当前的目的(您可以想象,我的任务非常简单)。但随着任务复杂性的增加,我需要继续添加方法。
我不想打开主文件并添加另一个def method3(...),两周后添加def method4(...) 等等;代码会增长太快,维护会越来越难。
所以,我的问题是:我怎样才能创建一个允许我将方法注册到服务器中的架构。一个好处是每个方法都有一个单独的文件夹保存一个文件,以便可以轻松地共享和维护它们。这种“架构”还允许我将某些方法的维护推迟给其他人,无论他们对 Twisted 的理解如何。
我不在乎是否每次注册新方法时都需要重新启动服务器,但如果我没有也有一个明显的优势:)。
谢谢。
【问题讨论】:
标签: python architecture twisted network-protocols json-rpc