openstack nova 基础知识——wsgi

Openstack Nova(七)----Instance 创建(nova WSGI) 古人云: 三思而后行 但对我们来说, 有什么地方值得去思呢?任何事情, 如果能够身临其境,了解其来龙去脉,肯定是最好的学习方式。但是在代码走读时, 人不能像机器一样,去把代码都运行一次, 亲身去感受下。但是我们能在脑袋里运行代码, 但这里也有问题, 代码多了, 脑袋就不够用了,这个时候就要学会思。不再废话, 回到我们的问题。上一章中, nova 命令行已经发送了一个基于HTTP的RESTful请求过 阅读详情

激励自己的话:

在微博上看到一句话:一件事成功的概率只有1%,但是要是做上100遍的话,成功的概率将会是63%,这句话对现在的我真是一个极大的鼓励。


正文:

在nova源码中看到了wsgi这个模块,不懂,于是谷歌去,又全是英文啊!

官方网站:http://wsgi.readthedocs.org/en/latest/index.html


1.  什么是wsgi?

Web服务器网关接口(Python Web Server Gateway Interface,缩写为WSGI)是Python应用程序或框架和Web服务器之间的一种接口,已经被广泛接受, 它已基本达成它了可移植性方面的目标。WSGI 没有官方的实现, 因为WSGI更像一个协议. 只要遵照这些协议,WSGI应用(Application)都可以在任何实现(Server)上运行, 反之亦然。


2.  如何实现WSGI?

看了几个例子,发现有这么几个“角色”:application、server、client,它们之间的关系是client发送请求给server,server转发这个请求给application,然后application进行一系列操作之后,将响应发送给server,server再将响应转发给client,server就起一个转发的作用。

WSGI就在application和server之间发挥作用:

首先是在server中定义了一个start_response(status,  response_headers,  exc_info=None)方法,返回值是一个write()函数,也就是在必须在执行过start_response()函数之后,才能执行write()方法。还定义了environ变量,即环境变量,里面存放的是server接收到的client端的环境变量。WSGI就是规定了server要将start_response和environ发送给application。

然后就是application就要有接收这两个参数的“接口”了,这个“接口”可以以各种方式实现:方法、函数、类都可以。接受到之后,就要在application端调用start_resopnse()方法,而且这个调用一定要在return之前。WSGI就是规定了application要实现接收这两个参数的“接口”,并且执行start_response()。

server在接收到application的响应之后,就开始write()数据给client,首先要判断start_response()方法执行了没有,如果没有执行,那么就报出:AssertionError("write() before start_response()") 这样的异常。如果执行了start_response(),那么write()就顺利执行。


经过这样的“接口”设计,就可以让application在任何server上运行了?Maybe吧!


3.  如何使用wsgi?

这里具一个简单的例子,是从官网上看到的,觉得很简单,很具有代表性:

#! /usr/bin/env python

# Our tutorial's WSGI server
from wsgiref.simple_server import make_server

def application(environ, start_response):
   “”“这个就是application,实现了接收这两个参数的接口,并且在下面调用了start_response()”“”
   # Sorting and stringifying the environment key, value pairs
   response_body = ['%s: %s' % (key, value)
                    for key, value in sorted(environ.items())]
   response_body = '\n'.join(response_body)

   status = '200 OK'
   response_headers = [('Content-Type', 'text/plain'),
                  ('Content-Length', str(len(response_body)))]
   start_response(status, response_headers)

   return [response_body]

# Instantiate the WSGI server.
# It will receive the request, pass it to the application
# and send the application's response to the client
# 这个是server,在它内部定义了start_response()方法和environ变量,并且调用application
httpd = make_server(
   'localhost', # The host name.
   8051, # A port number where to wait for the request.
   application # Our application object name, in this case a function.
   )

# Wait for a single request, serve it and quit.
httpd.handle_request()

如果想看server内部是如何实现的话,可以看一下PEP333上的这个例子:

import os, sys

def run_with_cgi(application):

    environ = dict(os.environ.items())
    environ['wsgi.input']        = sys.stdin
    environ['wsgi.errors']       = sys.stderr
    environ['wsgi.version']      = (1, 0)
    environ['wsgi.multithread']  = False
    environ['wsgi.multiprocess'] = True
    environ['wsgi.run_once']     = True

    if environ.get('HTTPS', 'off') in ('on', '1'):
        environ['wsgi.url_scheme'] = 'https'
    else:
        environ['wsgi.url_scheme'] = 'http'

    headers_set = []
    headers_sent = []

    def write(data):
        if not headers_set:
             raise AssertionError("write() before start_response()")

        elif not headers_sent:
             # Before the first output, send the stored headers
             status, response_headers = headers_sent[:] = headers_set
             sys.stdout.write('Status: %s\r\n' % status)
             for header in response_headers:
                 sys.stdout.write('%s: %s\r\n' % header)
             sys.stdout.write('\r\n')

        sys.stdout.write(data)
        sys.stdout.flush()

    def start_response(status, response_headers, exc_info=None):
        if exc_info:
            try:
                if headers_sent:
                    # Re-raise original exception if headers sent
                    raise exc_info[0], exc_info[1], exc_info[2]
            finally:
                exc_info = None     # avoid dangling circular ref
        elif headers_set:
            raise AssertionError("Headers already set!")

        headers_set[:] = [status, response_headers]
        return write

    result = application(environ, start_response)
    try:
        for data in result:
            if data:    # don't send headers until body appears
                write(data)
        if not headers_sent:
            write('')   # send headers now if body was empty
    finally:
        if hasattr(result, 'close'):
            result.close()

4.  eventlet中的wsgi

因为nova中用的是eventlet中的wsgi,所以再来看一下wsgi在eventlet中是怎么实现的。其实不用看源码也可以知道evenlet中,将和服务器建立的连接放在了绿色线程中,socket用的也是绿化过的socket。简单的使用,如下示例:

from eventlet import wsgi
import eventlet

def hello_world(env, start_response):
    start_response('200 OK', [('Content-Type', 'text/plain')])
    return ['Hello, World!\r\n']

wsgi.server(eventlet.listen(('', 8090)), hello_world)


参考资料:

http://webpython.codepoint.net/wsgi_tutorial

http://www.python.org/dev/peps/pep-0333/

http://eventlet.net/doc/modules/wsgi.html



详解:OpenStack nova OpenStack–Nova架构介绍 Nova,首次出现在openstack的“Austin”版本中,提供大规模、可扩展、按需自助服务的计算资源,支持裸机、虚拟机和容器,依赖keystone的认证服务,neutron的网络服务,glance的镜像服务。 nova架构图如下: nova-api:接收rest消息,包括HTTP请求,服务间通信 nova-scheule:选择合适的主机 nova-conductor:数据库操作和复杂流程控制 nova-compute:虚拟机生命周期管理和资源管理,负责处理虚机和 阅读详情

相关推荐

OpenStack设计与实现(五)RESTful API和WSGI

在上一篇博客中我们提到过,OpenStack每个项目内部的服务进程之间是通过消息总线来通讯的,而在各个项目之间则是通过RESTful API来进行通讯的,在这一篇博客中,我们就来详细的讨论一下OpenStack各个项目之间的通讯。一、什么是RESTfulRESTful是目前最流行的一种互联网软件架构。REST(Representational State Transfer,表述性状态转移),如果一个

xingjiarong的专栏 4924

WSGI一简单的WSGI Application(二)

目录 一:WSGI协议的组成 二:代码理解 ( 一)先实现一个简单的应用 ( 二)运行这个简单应用 三:理解WSGI 四:WSGI 中间件和Werkzeug 预备知识:WSGI一Web 框架基础(一) 理解了上面的代码之后,我们继续看看WSGI 协议。 一:WSGI协议的组成 WSGI分为两部分 一::WebServer 或者Gateway , 功能:就...

qq_39820671的博客 2371

openstack nova-api启动流程

一、预备知识     nova-api服务启动过程比较简单,难点在于它用到的一些库不了解,建议先了解一下python paste.deploy,routes,webob这些这些模块。     paste.deploy        主要是通过解析/etc/nova/api-paste.ini,根据指定的name来加载wsgi app。     webob         WebOb是

不忘初心,方得始终 5742

Python Web开发中的WSGI协议简介

在Python Web开发中,我们一般使用Flask、Django等web框架来开发应用程序,生产环境中将应用部署到Apache、Nginx等web服务器时,还需要uWSGI或者Gunicorn。一个完整的部署应该类似这样: Web Server(Nginx、Apache) <-----> WSGI server(uWSGI、Gunicorn) <-----&g...

weixin_30315435的博客 320

openstack开发实践(四):Nova源码解析

nova-api服务解析 nova-api服务介绍 nova作为openstack云中的计算组织控制器,负责支持openstack云中实例生命周期的所有活动,先前在nova组件手动安装https://blog.youkuaiyun.com/weixin_41977332/article/details/104031168 中介绍了nova架构中的各个服务组件及其功能。在nova的设计过程中,很注重各个服务组件...

weixin_41977332的博客 1406

[nova]nova api执行过程分析

我总结了一下,想要通过读懂源代码来学习一个新技术,大概可以分为三个步骤走: 1.理解相关的类库的功能及使用。 2.理清代码中对象的继承及调用关系。 3.阅读代码了解细节 相关类库 paste.deploy/webob/routes 1.paste.deploy 官方文档:http://pythonpaste.org/deploy/http://pythonpaste.

u012977347的博客 1983

WebServer和python app之间的联系

WebServer和App的那些事webserver服务器与python app的联系是比较简单的。根据WSGI接口协议,App端只要定义def simple_app(environ, start_response)一个接口两个参数的callable obj就可以了。 在WebServer端则需要:import os, sysdef run_with_cgi(application): en

bin381的专栏 955

RS485设备联网避坑指南:塔石串口服务器在MODBUS平台中的3个关键配置项

本文针对塔石串口服务器在MODBUS物联网平台接入中的常见问题,详细解析了三个关键配置项:工作模式选择、远程端口与保活机制、寄存器映射与轮询策略。通过对比错误与正确配置案例,帮助工程师避开配置陷阱,实现RS-485设备的稳定、高效联网,提升批量部署的成功率与系统可靠性。

weixin_29281941的博客 407

深入理解WSGI

WSGI(Web Server Gateway Interface)是Web服务器与Python Web应用或框架之间的建议标准接口,用于促进跨Web服务器的Web应用的可移植性。根据PEP 3333提案说明,WSGI只是一种协议,而不是一个框架。WSGI力求简洁和通用,所以共规范了三种组件:Application,Server和Middleware。 组件Application Application可以是一个函数、方法、类或者实现了call方法的示例。 如果是一个函数

u010049696的专栏 501

ExcelVBA批量添加PDF文件

如图1所示,"BOM-01.xlsx"工作簿中的Sheet1工作表根据B列图号单元格中的内容,在图2所示的文件夹中找到对应的PDF文件,然后嵌入到相应的N列,双击N列中所示的图标,会打开PDF文件,是源文件的副本,即删除源文件,也可以打开N列的文件。 图1 根据B列的图号在N列嵌入对应的PDF文件 图2 PDF文件 图3 文件格式 Sub 导入文件() Ap...

qq389445046的博客 5578

3U 与 SV630A 伺服实现 CANLINK 通讯

SD410这组参数特别重要,这个32位特别重要,是防止数值乱码的关键。

weixin_42714122的博客 2698

Django 源码小剖: 响应数据 response 的返回

响应数据的返回 在 WSGIHandler.__call__(self, environ, start_response) 方法调用了 WSGIHandler.get_response() 方法, 由此得到响应数据对象 response. 如今所要做的, 便是将其返回给客户端. 在 Django 源码小剖: 初探 WSGI 中, 简要的概括了请求到来时 django 自带服务器的执行关系, 摘抄...

weixin_33712881的博客 270

MIMIC数据库基本信息分析

一、MIMIC数据库中26张表介绍 数据库中一共有26张表,记录患者入院的各种信息,每张表的介绍如下所示。 表格名 信息 admission 患者基本信息,比如性别、种族、语言、宗教、婚姻、入院和出院时间、死亡时间等 callout 提供病人准备从ICU转出或者已经从ICU转出时相关信息 caregivers 记录医护人员信息(ID、类型、附加...

m0_37520426的博客 1万+

openstack nova api模块分析

原文: https://www.ibm.com/developerworks/community/blogs/e93514d3-c4f0-4aa0-8844-497f370090f5/entry/openstack_nova_api?lang=en 本文翻译IBM openstack技术博客。参杂部分个人理解,记录下学习过程。 Nova-api实现分析 Nova API 在

记录学习、实践过程 1万+

智能汽车域控制器FOTA升级方案探讨

上文提到的Entry属性,包括Active 属性, Bootable 属性, Successful 属性, Retrycnt 属性 ,Active 属性用于标志槽的优先级,bootloader优先选择Active 属性=1的槽启动,Bootable 属性标志槽可否可启动,Successful 属性标志槽是否成功启动过,Retrycnt 属性标志槽可尝试启动的次数。芯片启动后,首先进入Bootloader阶段,此阶段将读取存储系统的分区属性,根据属性值进行逻辑判断,并确定进入哪个分区,详见流程图。

huibian1234的博客 1570

大厂校招:星宸科技嵌入式面试及参考答案(5万字长文)

当一个新的硬件设备被插入系统时,内核会发送一个设备事件通知 udev,udev 会根据设备的属性和规则,为该设备创建一个合适的设备文件。通过去除不必要的驱动程序、禁用不需要的功能、选择合适的内核配置选项、优化内核编译选项和定制内核模块等方法,可以减小内核的大小和复杂性,提高系统的性能和稳定性。上半部通常是在中断关闭的情况下执行的,以确保中断处理的原子性。处理碎片化内存是内存管理中的一个重要问题,可以采用内存压缩、内存池管理、伙伴系统、首次适应算法和最佳适应算法等方法来减少内存碎片的产生,提高内存的利用率。

大模型大数据攻城狮的专栏 2929

OpenStack学习笔记之——OpenStack Nova解析

由于工作原因接触OpenStack不久,下面对自己的Openstack的学习资料进行简单的总结和梳理,之前对于云计算及Openstack几乎没有接触过,这方面的学习也几乎是从零开始,所以有一些理解错误和不全面的地方,望不吝赐教和指正。 本文主要是对Openstack核心组件Nova进行初步的分析和解读。   1.      基础概念 Openstack云中实例(instances)生命周期

Hcloud 5513

30天入门 SAP BTP 开发系列之二:了解 SAP BTP Region 的概念,包含账号申请的详细步骤

SAP BTP 的 Region,实际是一组按地理位置划分的、由 SAP 或合作 Hyperscaler 承载的基础设施栈。这些基础设施栈至少包含多可用区网络、对象存储、计算节点及自动化运维等服务。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1466

openstack组件nova代码解析(ocata版本)--nova.api.openstack.wsgi

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33722405的博客 777

Autosar MCAL-S32K324 Fls配置-基于EB

Autosar MCAL Flash配置,基于S32K324,EB软件

赞的博客 1516

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

WSGI 在 OpenStack 中的应用

OpenStack 是一个极其庞大的项目,由数十个独立的服务(Nova, Neutron, Cinder, Glance, Keystone 等)组成。WSGI 在其中扮演了最基础、最统一的 HTTP API 通信基石的角色。

漫谈网络 736

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

openstack组件nova代码解析(ocata版本)--nova.wsgi

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34186128的博客 214

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

OpenStack学习笔记之--OpenStack Nova 架构

Openstack是一系列开源技术组合在一起提供了一个可扩展性很强的云操作系统,我们可以把它想象成一个软件可以把你的硬件资源想亚马逊的Amazon Web Services提供给大家使用,它主要有三部分组成 Swift:提供对象/块存储,它大概类似于Rackspace的Cloud Files 和亚马逊的S3(Simple Storage Service)Glance:为Nova提供发现,

xiangmin2587的专栏 2万+

OpenStack模块(T版)—Placement与Nova计算服务详解

前言一、Nova服务简介1.1 Nova的元数据1.2 VM实例化流程二、Nova架构与重要组件2.1 Nova架构模式三、Nova服务部署3.1 nova组件部署3.2 控制节点Nova服务配置3.3 计算节点Nova服务配置(c1、c2)3.4 验证(controller节点操作)总结 前言 在安装Nova模块之前,需先安装Placement组件,Placement在openstack的Stein版本之前,属于Nova组件的一部分。该组件需要在Nova之前安装。 一、Nova服务简介 1、Nova(O.

Mr_XHC的博客 2730
上一篇: openstack nova 基础知识——eventlet
下一篇: python中的装饰器——@
hackerain
博客等级 码龄16年 753粉丝 220原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值