Nova中的RPC讲解

一 注册过程
Nova中各个服务之间使用了基于AMQP实现的RPC机制,其中nova-compute、nova-conductor和nova-scheduler在启动时都会注册一个RPC Server,而nova-api因为Nova内部没有服务会调用它提供的接口,所以无需注册。
以nova-compute服务为例:
nova/compute/rpcapi.py
class ComputeAPI(object):
    def live_migration(self, ctxt, instance, dest, block_migration, host,
                       migration, migrate_data=None):
        args = {'migration': migration}
        version = '4.8'
        client = self.router.by_host(ctxt, host)
        if not client.can_send_version(version):
            version = '4.2'
            if migrate_data:
                migrate_data = migrate_data.to_legacy_dict(
                    pre_migration_result=True)
        if not client.can_send_version(version):
            version = '4.0'
            args.pop('migration')
        #获得目标机的RPC Client
        cctxt = client.prepare(server=host, version=version)
        #RPC cast主要用于异步形式,比如创建虚拟机,在创建过程中可能需要很长
        #时间,如果RPC call显然对性能有很大的影响。cast()的第二个参数是
        #RPC调用的函数名,后面的参数作为参数被传入该函数
        cctxt.cast(ctxt, 'live_migration', instance=instance,
                   dest=dest, block_migration=block_migration,
                   migrate_data=migrate_data, **args)
二 远程调用——客户端
类ComputeAPI中的函数即为Compute服务提供给RPC调用接口,比如:
# nova/conductor/tasks/live_migrate.py
class LiveMigrationTask(base.TaskBase):
    def __init__(self, context, instance, destination,
                 block_migration, disk_over_commit, migration, compute_rpcapi,
                 servicegroup_api, scheduler_client, request_spec=None):
        ......
        self.compute_rpcapi = compute_rpcapi
                                ......
    def _execute(self):
                                ......
           #调用ComputerAPI类中提供的RPC接口
        return self.compute_rpcapi.live_migration(self.context,
                host=self.source,
                instance=self.instance,
                dest=self.destination,
                block_migration=self.block_migration,
                migration=self.migration,
                migrate_data=self.migrate_data)
三 远程调用——服务端
类ComputeAPI只是暴露给其他服务的RPC调用接口,Compute服务的RPC Server接受到RPC请求后,真正完成任务是nova.compute.manager模块。
# nova/compute/manager.py
class ComputeManager(manager.Manager):
                target = messaging.Target(version='4.13')
                ......
    def live_migration(self, context, dest, instance, block_migration,
                       migration, migrate_data):


从ComputeAPI到ComputeManager的过程即是RPC调用过程。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值