欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Nova中的RPC讲解

程序员文章站 2022-05-11 17:25:53
...
一 注册过程
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调用过程。
相关标签: Nova