这一章主要讲openstack的组件oslo.message中RPCServer实现
在openstack中初始化一个RPC的server源代码:在/nova/rpc.py中
def get_server(target, endpoints, serializer=None):
assert TRANSPORT is not None
serializer = RequestContextSerializer(serializer)
return messaging.get_rpc_server(TRANSPORT,
target,
endpoints,
executor='eventlet',
serializer=serializer)
首先看看messaging.get_rpc_server,文件位于oslo_messaging/rpc/server.py中
def get_rpc_server(transport, target, endpoints,
executor='blocking', serializer=None):
"""rpc_server代码结构
"""
dispatcher = rpc_dispatcher.RPCDispatcher(target, endpoints, serializer)
return msg_server.MessageHandlingServer(transport, dispatcher, executor)
exector参数控制如何接收和派遣传入消息,关于transport,dispatch,executor三者区别,引用一段代码注释Connect a transport to a dispatcher that knows how to process the message using an executor that knows how the app wants to create new tasks.transport是传输层,在消息中间件层接收消息,executor确定接收消息的线程模型,dispatch负责最终处理消息。
下面看下第一个类RPCDispatcher,文件位于oslo_messaging/rpc/dispatcher.py
class RPCDispatcher(object):
"""在PRC消息之下的消息调度
"""
def __init__(self, target, endpoints, serializer):
"""rpc服务器调度的结构
"""
self.endpoints = endpoints
self.serializer = serializer or msg_serializer.NoOpSerializer()
self._default_target = msg_target.Target()
self._target = target
回到get_rpc_server方法,在分析下MessageHandlingServer类的初始化
class MessageHandlingServer(service.ServiceBase):
"""消息处理服务器
"""
def __init__(self, transport, dispatcher, executor='blocking'):
"""消息处理服务器的结构
"""
self.conf = transport.conf
self.transp