博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
07.计算Nova→4.源码→2.RPC机制
阅读量:5039 次
发布时间:2019-06-12

本文共 2367 字,大约阅读时间需要 7 分钟。

  1. Nova 中各个服务之间的通信使用了基于 AMQP 实现的 RPC 机制
  2. 其中 nova-compute、nova-conductor 和 nova-scheduler 在启动时都会注册一个 RPC Server监听有谁要连我,而 nova-api 因为 Nova内部并没有服务会调用它提供的接口,所以无需注册,下面以nova-compute为例
    1. 通常是供其它组件调用的封装库。换句话说,该模块通常并不会由本模块调用。
      1234567891011121314151617
      #nova/nova/compute/api.pyfrom nova.compute import rpcapi as compute_rpcapiclass API(base.Base):"""API for interacting with the compute manager."""def start(self, context, instance):"""Start an instance."""LOG.debug("Going to try to start instance", instance=instance)instance.task_state = task_states.POWERING_ONinstance.save(expected_task_state=[None])self._record_action_start(context, instance, instance_actions.START)#调用类 nova.compute.rpcapi.ComputeAPI 中的接口self.compute_rpcapi.start_instance(context, instance)
    2. 类nova.compute.rpcapi .ComputeAPI中的函数即为Compute服务提供给 RPC调用的接口,其他服务调用前需要首先 import 这个模块。
      1234567891011
      #nova/nova/compute/rpcapi.pyclass ComputeAPI(object):'''Client side of the compute rpc API. '''def start_instance(self, ctxt, instance):version = self._ver(ctxt, '4.0')cctxt = self.router.client(ctxt).prepare(server=_compute_host(None, instance), version=version)cctxt.cast(ctxt, 'start_instance', instance=instance)
      RPC cast 主要用于异步形式,比如创建虚拟机,在创建过程可能需要很长时间,如果使用 RPC call (call方法是远程过程调用带有返回值的方法)显然对性能有很大影响。cast()的第二个参数是RPC 调用的函数名(cast方法是远程过程调用,不带有返回值的方法),后面的参数将作为参数被传入该函数
      这里为什么写的是Client呢:这个是RPC请求的封装,或者说是RPC封装的client端,该模块封装了RPC请求调用
    3. nova.compute.rpcapi .ComputeAPI 只是暴露给其他服务的 RPC 调用接口,Compute 服务的RPC Server 接受到 RPC 清求后,真正完成任务的是nova.compute.manager 模块
      123456789
      #nova/nova/compute/manager.pyclass ComputeManager(manager.Manager):"""Manages the running instances from creation to destruction."""@wrap_exception()@reverts_task_state@wrap_instance_event(prefix='compute')@wrap_instance_faultdef start_instance(self, context, instance):"""Starting an instance on this host."""
      这个才是真正服务的功能实现,也是RPC的服务端,即处理RPC请求的入口,实现的方法通常和rpcapi实现的方法一一对应。
    4. 从nova.compute.rpcapi.ComputeAPI到nova.compute.manager.ComputeManager 的过程即是RPC 调用过程
    5. 例子:对一个虚拟机执行关机操作  由下面的过程也可以知道OpenStack项目的目录结构并不是根据组件严格划分,而是根据功能划分。比如compute目录并不是一定在nova-compute节点上运行,而主要是和compute相关
      1. API节点:
        1. nova-api接收用户请求在nova/api目录
        2. nova-api调用nova/compute/api.py
        3. compute/api调用nova/compute/rpcapi.py
        4. rpcapi.py向目标计算节点发起stop_instance()RPC请求
      2. 计算节点:
        1. 收到stop_instance()请求
        2. 调用nova/compute/manager.py的callback方法回调函数stop_instance()
        3. 调用libvirt关闭虚拟机

转载于:https://www.cnblogs.com/LeisureZhao/p/11238976.html

你可能感兴趣的文章
多变量微积分笔记24——空间线积分
查看>>
Magento CE使用Redis的配置过程
查看>>
poi操作oracle数据库导出excel文件
查看>>
(转)Intent的基本使用方法总结
查看>>
Mac 下的Chrome 按什么快捷键调出页面调试工具
查看>>
Windows Phone开发(24):启动器与选择器之发送短信
查看>>
JS截取字符串常用方法
查看>>
Google非官方的Text To Speech和Speech Recognition的API
查看>>
stdext - A C++ STL Extensions Libary
查看>>
Django 内建 中间件组件
查看>>
bootstrap-Table服务端分页,获取到的数据怎么再页面的表格里显示
查看>>
进程间通信系列 之 socket套接字及其实例
查看>>
天气预报插件
查看>>
Unity 游戏框架搭建 (十三) 无需继承的单例的模板
查看>>
模块与包
查看>>
mysql忘记root密码
查看>>
apache服务器中设置目录不可访问
查看>>
嵌入式Linux驱动学习之路(十)字符设备驱动-my_led
查看>>
【NOIP模拟】密码
查看>>
java容器---------手工实现Linkedlist 链表
查看>>