Neutron RPC API 层

Neutron使用oslo.messaging库提供服务service模块间的内部通信通道。这种通信通常是通过AMQP完成,但大多数细节被oslo.messaging的使用所隐藏,将来可能使用其它的协议。

RPC API在Neutron中定义为两个部分:客户端和服务器端。

客户端

这里是一个RPC客户端的定义示例:


  import oslo_messaging

  from neutron.common import rpc as n_rpc


  class ClientAPI(object):
      """客户端 RPC 接口定义.

      API version history:
          1.0 - Initial version
          1.1 - Added my_remote_method_2
      """

      def __init__(self, topic):
          target = oslo_messaging.Target(topic=topic, version='1.0')
          self.client = n_rpc.get_client(target)

      def my_remote_method(self, context, arg1, arg2):
          cctxt = self.client.prepare()
          return cctxt.call(context, 'my_remote_method', arg1=arg1, arg2=arg2)

      def my_remote_method_2(self, context, arg1):
          cctxt = self.client.prepare(version='1.1')
          return cctxt.call(context, 'my_remote_method_2', arg1=arg1)

此类为RPC API定义客户端接口。接口具有2个方法。第一个方法添加在接口的1.0版本中。第二个方法添加在版本1.1中。当调用较新的方法(1.1)时,指定远端必须实现至少1.1版才能处理此请求。

服务端

RPC接口的服务端如下:

  import oslo_messaging


  class ServerAPI(object):

      target = oslo_messaging.Target(version='1.1')

      def my_remote_method(self, context, arg1, arg2):
          return 'foo'

      def my_remote_method_2(self, context, arg1):
          return 'bar'

此类实现接口的服务端。oslo_messaging.Target()定义表示该类当前实现接口的1.1版。

版本化

注意,对RPC接口的更改必须始终以向后兼容方式进行。服务器端应该始终能够处理较旧版本的客户端(需要在同一个主版本系列中,如1.x)。

可能会碰到主版本号升级,删除一些仅为了向后兼容的代码。有关如何执行此操作的详细信息,请参阅https://wiki.openstack.org/wiki/rpcmajorversionupdates。

变更示例

作为一个minor次要版本号更改的API示例,我们假设要将一个新参数添加到方法:my_remote_method_2。首先,我们在服务器端添加参数。为了向后兼容,新参数必须有默认值设置值,以便即使未提供参数,接口仍将工作。此外,还有接口的次要版本号必须递增。所以,新服务器端代码如下:

  import oslo_messaging

  class ServerAPI(object):

      target = oslo_messaging.Target(version='1.2')

      def my_remote_method(self, context, arg1, arg2):
          return 'foo'

      def my_remote_method_2(self, context, arg1, arg2=None):
          if not arg2:
              # Deal with the fact that arg2 was not specified if needed.
          return 'bar'

我们现在可以更新客户端来传递新的参数了。客户端必须还要指定此方法调用需要版本“1.2”才能成功。更新的客户端代码如下所示:

  import oslo_messaging

  from neutron.common import rpc as n_rpc


  class ClientAPI(object):
      """Client side RPC interface definition.

      API version history:
          1.0 - Initial version
          1.1 - Added my_remote_method_2
          1.2 - Added arg2 to my_remote_method_2
      """

      def __init__(self, topic):
          target = oslo_messaging.Target(topic=topic, version='1.0')
          self.client = n_rpc.get_client(target)

      def my_remote_method(self, context, arg1, arg2):
          cctxt = self.client.prepare()
          return cctxt.call(context, 'my_remote_method', arg1=arg1, arg2=arg2)

      def my_remote_method_2(self, context, arg1, arg2):
          cctxt = self.client.prepare(version='1.2')
          return cctxt.call(context, 'my_remote_method_2',
                            arg1=arg1, arg2=arg2)

Neutron RPC APIs

如前所述,RPC API由两部分定义:客户端和服务端。其中可能由多对存在于Neutron代码库中。代码与每个RPC接口实现的文档一起更新,文档指示相应的服务器或客户端代码所在的位置。

示例: DHCP

DHCP代理包括一个客户端API(neutron.agent.dhcp.agent.DhcpPluginAPI)。DHCP代理使用这个类调用Neutron服务器中的远程方法。服务端定义在neutron.api.rpc.handlers.dhcp_rpc.DhcpRpcCallback. 它取决于在使用的Neutron插件,由其决定DhcpRpcCallback接口是否应呈现出来。

类似地,定义了一个RPC接口,允许Neutron插件远程调用DHCP代理中的方法。客户端定义在neutron.api.rpc.agentnotifiers.dhcp_rpc_agent_api.DhcpAgentNotifyAPI。运行在DHCP代理中的此接口的服务端定义在neutron.agent.dhcp.agent.DhcpAgent。

更多信息

更多信息,请参考oslo.messaging documentation文档: https://docs.openstack.org/oslo.messaging/latest/.

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页