我创建了一个简单的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(...)
等等;代码会增长太快,维护会越来越难。
所以,我的问题是:如何创建允许我将方法注册到 Server的架构。一个好处是每个方法都有一个单独的文件夹保存一个文件,以便可以轻松地共享和维护它们。这种“架构”还允许我将某些方法的维护推迟给其他人,无论他们对 Twisted 的理解如何。
我不在乎每次注册新方法时是否需要重新启动服务器,但如果我没有的话,一个明显的优点是:)。
谢谢。