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调用过程。