Openstack学习笔记之——Neutron-server服务加载与启动源码分析(三)

本文是在学习Openstack的过程中整理和总结,由于时间和个人能力有限,错误之处在所难免,欢迎指正!

Neutron-server服务加载与启动源码分析(二)中搞定模块功能的扩展和加载,我们就回到Neutron-server服务加载与启动源码分析(一)中的_run_wsgi函数

<span style="font-size:14px;">def _run_wsgi(app_name):
    app = config.load_paste_app(app_name)
    ifnot 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</span>

app =config.load_paste_app(app_name)在这里就完成模块功能的扩展和加载,接下来看

<span style="font-size:14px;">server = wsgi.Server("Neutron")
    server.start(app, cfg.CONF.bind_port, cfg.CONF.bind_host,
                workers=cfg.CONF.api_workers)</span>

创建一个neutron的服务端,然后启动这个server

这边配置文件中默认的api_workers为0

<span style="font-size:14px;">def start(self, application, port, host='0.0.0.0', workers=0):
        """Run a WSGI server with the givenapplication."""
        self._host = host
        self._port = port
        backlog = CONF.backlog

        #获取socket信息
self._socket = self._get_socket(self._host,
                                       self._port,
                                        backlog=backlog)

        self._launch(application, workers)</span>
<span style="font-size:14px;">def _launch(self, application, workers=0):
        service = WorkerService(self, application)
        if workers <1:
            # workers小于1直接运行在当前的进程
            self._server = service
            service.start()
            systemd.notify_once()
        else:
            # API服务运行一定数量的子进程
            # 等待间隔时间默认0.01s
            self._server = common_service.ProcessLauncher(wait_interval=1.0)
            self._server.launch_service(service, workers=workers)</span>

执行完_run_wsgi函数,就完成service.start()的执行,也就完成neutron_api= service.serve_wsgi(service.NeutronApiService)的工作。

<span style="font-size:14px;">def main():
    ……
    try:
        pool = eventlet.GreenPool()

        neutron_api = service.serve_wsgi(service.NeutronApiService)
        api_thread = pool.spawn(neutron_api.wait)

        try:
           neutron_rpc = service.serve_rpc()</span>

我们启动了一个wsgi的服务,并且把资源加载和扩展等等准备工作都做好了,“万事具备只欠东风”,现在就从线程池中spawn一个线程来监听neutron api命令,这里再啰嗦一句neutron api命令到来之后,最后是路由到neutron.api.v2.base中的Controller中进行处理。

main函数最后就是执行neutron_rpc =service.serve_rpc())是通过plugin实现的,开始一个或者多个Rpcworker,并监听请求,监听topics中消息队列。我的理解是这个是用来监听neutron内部组件之间的通信。

至此Openstack neutron服务启动过程中的资源加载和扩展的源码简单解析完成了。

时间: 2024-10-29 03:40:22

Openstack学习笔记之——Neutron-server服务加载与启动源码分析(三)的相关文章

Android应用setContentView与LayoutInflater加载解析机制源码分析

[工匠若水 http://blog.csdn.net/yanbober 转载烦请注明出处,尊重分享成果] 1 背景 其实之所以要说这个话题有几个原因: 理解xml等控件是咋被显示的原理,通常大家写代码都是直接在onCreate里setContentView就完事,没怎么关注其实现原理. 前面分析<Android触摸屏事件派发机制详解与源码分析三(Activity篇)>时提到了一些关于布局嵌套的问题,当时没有深入解释. 所以接下来主要分析的就是View或者ViewGroup对象是如何添加至应用程

Android图片加载库Picasso源码分析

图片加载在Android开发中是非常重要,好的图片加载库也比比皆是.ImageLoader.Picasso.Glide.Fresco均是优秀的图片加载库. 以上提到的几种图片加载库各有特色.用法与比较,网上已经很多了. 出于学习的角度,个人认为从Picasso入手较好.代码量小,同时API优美,很适合我们学习. 今天笔者就Picasso的源码进行分析,抛出一些图片加载的技术细节供园友参考. PS:建议园友先大致看一下源码. 我们对图片加载的要求 1.加载速度要快 2.资源消耗要低 3.加载图片不

别翻了,这篇文章绝对让你深刻理解java类的加载以及ClassLoader源码分析【JVM篇二】

目录 1.什么是类的加载(类初始化) 2.类的生命周期 3.接口的加载过程 4.解开开篇的面试题 5.理解首次主动使用 6.类加载器 7.关于命名空间 8.JVM类加载机制 9.双亲委派模型 10.ClassLoader源码分析 11.自定义类加载器 12.加载类的三种方式 13.总结 14.特别注意 @ 前言 你是否真的理解java的类加载机制?点进文章的盆友不如先来做一道非常常见的面试题,如果你能做出来,可能你早已掌握并理解了java的类加载机制,若结果出乎你的意料,那就很有必要来了解了解j

android Listview分批加载+自动加载(附源码下载)

直接上代码,代码有注释: public class TestForListviewActivity extends Activity implements OnScrollListener { private ListView mListview = null; private View mFooterView; private PaginationAdapter mAdapter; private Handler handler=new Handler(); private boolean i

Android Studio 3.5测试版加载SDK java源码

参考博客:http://blog.sina.com.cn/s/blog_c3eb50230102wt1g.html 1.下载adnroid-28的源码 在Android Studio中加载不到源码的下载链接,所在在Android Studio中下载不到源码. 所以,需要借助 android-sdk_r24.4.1-windows.zip 下载源码,这个zip的下载链接 https://dl.google.com/android/android-sdk_r24.4.1-windows.zip?ut

【学习笔记】 多线程资源管理器(附流程图附源码)

<奇怪的大冒险>教程视频连接:http://www.taikr.com/course/222笔记结合了前7课的视频内容,感谢新总提供的免费视频PS:部分字段.属性和方法的命名与视频教程中有出入. 资源管理器核心的集合一共有三个:1.等待加载的资源队列 private Queue <ResLoadRequest> m_QueWaitLoadAsset = new Queue< ResLoadRequest >(); 2.当前正在加载的资源列表 private List &

Android 图片加载框架Universal-Image-Loader源码解析

Universal-Image-Loader(项目地址)可以说是安卓知名图片开源框架中最古老.使用率最高的一个了.一张图片的加载对于安卓应用的开发也许是件简单的事,但是如果要同时加载大量的图片,并且图片用于ListView.GridView.ViewPager等控件,如何防止出现OOM.如何防止图片错位(因为列表的View复用功能).如何更快地加载.如何让客户端程序员用最简单的操作完成本来十分复杂的图片加载工作,成了全世界安卓应用开发程序员心头的一大难题,所幸有了Universal-Image-

高性能javascript学习笔记系列(1) -js的加载和执行

这篇笔记的内容主要涉及js的脚本位置,如何加载js脚本和脚本文件执行的问题,按照自己的理解结合高性能JavaScript整理出来的 javascript是解释性代码,解释性代码需要经历转化成计算机指令的过程,这个过程就会带来一定的性能损耗,所以在js中做性能的优化是必须的 javascript的阻塞特性:浏览器在执行js代码的时候,不能做其他的任何事情,因为浏览器使用单一的进程来处理用户界面的刷新和javascript的脚本执行,也就是说什么时候执行js脚本影响着用户对页面的使用体验(之所以js

【转】ViewPager学习笔记(一)——懒加载

在项目中ViewPager和Fragment接口框架已经是处处可见,但是在使用中,我们肯定不希望用户在当前页面时就在前后页面的数据,加入数据量很大,而用户又不愿意左右滑动浏览,那么这时候ViewPager中本来充满善意的预加载就有点令人不爽了.我们能做的就是屏蔽掉ViewPager的预加载机制.虽然ViewPager中提供的有setOffscreenPageLimit()来控制其预加载的数目,但是当设置为0后我们发现其根本没效果,这个的最小值就是1,也就是你只能最少前后各预加载一页.那么,这时候