neutron-server是neutron的核心组件之中的一个。负责直接接收外部请求,然后调用后端对应plugin进行处理。

其核心启动过程代码主要在neutron.server包中。

__init__.py文件里包含一个main()函数,是WSGIserver開始的模块,而且通过调用serve_wsgi来创建一个NeutronApiService的实例。然后通过eventlet的greenpool来执行WSGI的应用程序,响应来自client的请求。

主要过程为:

eventlet.monkey_patch()

绿化各个模块为支持协程(通过打补丁的方式让本地导入的库都支持协程)。

config.parse(sys.argv[1:])

if not cfg.CONF.config_file:

sys.exit(_("ERROR: Unable to find configuration file via the default"

" search paths (~/.neutron/, ~/, /etc/neutron/, /etc/) and"

" the '--config-file' option!"))

通过解析命令行传入的參数。获取配置文件所在。

pool = eventlet.GreenPool()

创建基于协程的线程池。

neutron_api = service.serve_wsgi(service.NeutronApiService)

api_thread = pool.spawn(neutron_api.wait)

serve_wsgi方法创建NeutronApiService实例(作为一个WsgiService),并调用其的start()来启动socketserver端。

#neutron.service

def serve_wsgi(cls):

try:

service = cls.create()

service.start()

except Exception:

with excutils.save_and_reraise_exception():

LOG.exception(_('Unrecoverable error: please check log '

'for details.'))

return service

neutron.service.NeutronApiService类继承自neutron.service.WsgiService。其create方法返回一个appname默觉得“neutron”的WsgiService对象;start方法则调用_run_wsgi方法。

def start(self):

self.wsgi_app = _run_wsgi(self.app_name)

_run_wsgi方法主要是从api-paste.ini文件里读取应用(最后是利用neutron.api.v2.router:APIRouter.factory来构造应用)。然后为应用创建一个wsgi的服务端,并启动应用。主要代码为。

def _run_wsgi(app_name):

app = config.load_paste_app(app_name)

if not app:

LOG.error(_('No known API applications configured.'))

return

server = wsgi.Server("Neutron")

server.start(app, cfg.CONF.bind_port, cfg.CONF.bind_host,

workers=cfg.CONF.api_workers)

# Dump all option values here after all options are parsed

cfg.CONF.log_opt_values(LOG, std_logging.DEBUG)

LOG.info(_("Neutron service started, listening on %(host)s:%(port)s"),

{'host': cfg.CONF.bind_host,

'port': cfg.CONF.bind_port})

return server

至此,neutron server启动完毕。之后。须要创建rpc服务端。

try:

neutron_rpc = service.serve_rpc()

except NotImplementedError:

LOG.info(_("RPC was already started in parent process by plugin."))

else:

rpc_thread = pool.spawn(neutron_rpc.wait)

rpc_thread.link(lambda gt: api_thread.kill())

api_thread.link(lambda gt: rpc_thread.kill())

这些代码创建plugin的rpc服务端,并将api和rpc的生存绑定到一起,一个死掉,则另外一个也死掉。

pool.waitall()

最后是后台不断等待。

下图总结了neutron-server的核心启动过程。

OpenStack 中的neutron-server启动过程的更多相关文章

  1. Android系统进程间通信(IPC)机制Binder中的Server启动过程源代码分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6629298 在前面一篇文章浅谈Android系 ...

  2. 曹工说Redis源码(3)-- redis server 启动过程完整解析(中)

    文章导航 Redis源码系列的初衷,是帮助我们更好地理解Redis,更懂Redis,而怎么才能懂,光看是不够的,建议跟着下面的这一篇,把环境搭建起来,后续可以自己阅读源码,或者跟着我这边一起阅读.由于 ...

  3. openstack学习笔记一 虚拟机启动过程代码跟踪

    openstack学习笔记一 虚拟机启动过程代码跟踪 本文主要通过对虚拟机创建过程的代码跟踪.观察虚拟机启动任务状态的变化,来透彻理解openstack各组件之间的作用过程. 当从horizon界面发 ...

  4. 曹工说Redis源码(5)-- redis server 启动过程解析,以及EventLoop每次处理事件前的前置工作解析(下)

    曹工说Redis源码(5)-- redis server 启动过程解析,eventLoop处理事件前的准备工作(下) 文章导航 Redis源码系列的初衷,是帮助我们更好地理解Redis,更懂Redis ...

  5. 曹工说Redis源码(2)-- redis server 启动过程解析及简单c语言基础知识补充

    文章导航 Redis源码系列的初衷,是帮助我们更好地理解Redis,更懂Redis,而怎么才能懂,光看是不够的,建议跟着下面的这一篇,把环境搭建起来,后续可以自己阅读源码,或者跟着我这边一起阅读.由于 ...

  6. ES系列(一):编译准备与server启动过程解析

    ES作为强大的和流行的搜索引擎服务组件,为我们提供了方便的和高性能的搜索服务.在实际应用中也是用得比较爽,但如果能够更深入一点.虽然网上有许多的文章已经完整说明,ES是如何如何做到高性能,如何做到高可 ...

  7. Eureka Server启动过程

    前面对Eureka的服务端及客户端的使用均已成功实践,对比Zookeeper注册中心的使用区别还是蛮大的: P:分区容错性(⼀定的要满⾜的)C:数据⼀致性 A:⾼可⽤:CAP不可能同时满⾜三个,要么是 ...

  8. 【源码】Redis Server启动过程

    本文基于社区版Redis 4.0.8       1. 初始化参数配置 由函数initServerConfig()实现,具体操作就是给配置参数赋初始化值: //设置时区 setlocale(LC_CO ...

  9. keil c51中C程序的启动过程

    汇编是从org 0000h开始启动,那么keil c51是如何启动main()函数的?keil c51有一个启动程序startup.a51,它总是和c程序一起编译和链接.下面看看它和main()函数是 ...

  10. Android FM学习中的模块 FM启动过程

    最近的研究FM模,FM是一家值我正在学习模块.什么可以从上层中可以看出. 上层是FM按钮的操作和界面显示,因此调用到FM来实现广播收听的功能. 看看Fm启动流程:例如以下图: 先进入FMRadio.j ...

随机推荐

  1. 如何获得getElementById的length这个数值?

    a=document.getElementById("a").innerHTML.length;我觉得你应该这么写 如果是文本框的话document.getElementById( ...

  2. 基于visual Studio2013解决C语言竞赛题之1062高与矮

       题目 解决代码及点评 /************************************************************************/ /* 62 ...

  3. 引用iscroll的一个封装方法

    var Page = function(cid, data,callback) { var _self = this; var cid = $(cid); var currPage=1; // 下拉上 ...

  4. 手机端viewport的设置规范

    <meta name="viewport" content="initial-scale=1.0, minimum-scale=1.0, maximum-scale ...

  5. cocos2dx+lua编译Android项目

    一.简单介绍 cocos2dx版本号:3.2 二.问题及解决方式 1.为项目开启Native支持,把项目转为C++项目. 1>.项目开启C++ Native支持,操作例如以下图 watermar ...

  6. android用canvas绘制两种波纹效果

     波形效果有几种不同的呈现形式,比如从中间向四周散开的波形,也就是熟知的水涟漪:还有上下波动的曲线,像五线谱等.英文中可以称作Wave或者Ripple,所以暂且叫它们WaveView.WaveLayo ...

  7. C++基础学习笔记----第七课(面向对象的基本概念)

    主要讲面向对象的基本概念和一些概念,以及实现简单的面向对象C++程序. 类和对象 基本概念 类和对象是面向对象中的两个基本概念,类是指一类事物,是一个抽象的概念.对象是指某一个类的实体,是一个具体存在 ...

  8. c#中,DataTable 过滤重复行

    虽然网上有很多DataTable过滤重复行的方法,但是本菜还是认为自己写的这个方法最靠谱,这里的参数是传递的DataTable值,返回的是一个已经过滤相同字段StuId,ExamNum的DataTab ...

  9. Shell 输入/输出重定向

    大多数 UNIX 系统命令从你的终端接受输入并将所产生的输出发送回​​到您的终端.命令通常从标准输入的地方读取输入,默认是终端.标准输出,默认情况下是终端. 重定向命令列表如下: 命令 说明 comm ...

  10. 基于MMSeg算法的中文分词类库

    原文:基于MMSeg算法的中文分词类库 最近在实现基于lucene.net的搜索方案,涉及中文分词,找了很多,最终选择了MMSeg4j,但MMSeg4j只有Java版,在博客园上找到了*王员外*(ht ...