- 博客(49)
- 收藏
- 关注
原创 Nova API服务 之 创建虚拟机流程(2)
1、servers资源底层Controller对象的create方法调用compute API的create方法。Compute API类的create方法:/nova/nova/compute/api.pyclass API(base.Base): def create(self,context,instance_type, ...):
2016-10-31 23:03:48 1102
原创 Nova API服务 之 创建虚拟机流程(1)
本小节,将以虚拟机创建请求为例,分析底层Controller类的HTTP请求处理方法。一、回忆总结1、处理HTTP请求的核心工作都在底层Controller对象中定义。Resource对象在底层Controller对象的基础上,实现数据的转化工作。2、Resource对象首相将传入的对象反序列化。然后将数据交给底层Controller对象中相应的处理方法处理。最后将底层Cont
2016-10-31 21:03:44 2427
原创 Nova API服务 之 处理HTTP请求的流程
一、回顾1、Nova API服务的主要功能都在osapi_compute_app_v2应用程序中实现。osapi_compute_app_v2应用程序对应的工厂方法是APIRouter类的factory方法。APIRouter类的factory方法会返回一个APIRouter对象。当客户端发送HTTP请求的时候,会调用APIRouter对象的__call__方法。2、APIRout
2016-10-30 22:44:13 2789 2
原创 第8章 创建型模式---单例模式
一、单例模式1、定义:保证一个类仅有一个实例,同时提供能对该实例加以访问的全局访问方法。 2、解决思路:(1)、在类中,要构造一个实例,就必须调用类的构造函数。因此,为了在类的外部调用类的构造函数而创建实例,需要将构造函数的访问权限设为protected或private.(2)、需要提供全局访问点,就需要在类中定义一个static函数,返回在类中唯一构造的实例。二、
2016-10-30 13:21:12 289
原创 第6章 迪米特法则
一、定义1、应尽量减少其他对象之间的交互,对象只和自己的朋友交谈,及对其他依赖的类越来越少(不要和太多的类发生关系)。2、尽量不要让类和类之间建立直接的关系,这样可以减少类之间的依赖,降低类之间的耦合。3、一个类应该对自己需要耦合的类知道的最少,只知道其public方法,其内部如何复杂跟自己没有关系,也叫最少知识原则。二、迪米特法则核心观念是类间解耦、低耦合,类的复用率才可以提
2016-10-30 12:42:47 388
原创 第5章 接口隔离原则(ISP)
一、定义1、接口:分为两种(1)、实例接口:Java中声明一个类,然后用new关键字产生一个实例,是对一个类型事物的描述,这是一种接口。 例如:定义Person类,然后使用Person zhangsan = new Person()产生实例,Person类就是zhangsan的接口。(2)、类接口:使用interface关键字定义的接口。2、定义(1)、使用多个专门的接
2016-10-29 21:53:30 716
原创 第4章 依赖倒置原则(DIP)
一、定义1、模块间要依赖抽象,不要通过具体的实现类。依赖关系通过接口(抽象)进行编程,这就降低客户与实现模块间的耦合。(接口或抽象类不依赖于实现类,实现类依赖接口或抽象类 面向接口编程OOD) 包含三层含义:(1)高层模块不应依赖于低层模块,两者都应该依赖其抽象(2)抽象不应该依赖细节 (3)细节应该依赖于抽象2、高层模块和底层模块的概念(1)低层模块:每个逻辑的实现
2016-10-29 21:00:49 858
原创 Nova API服务之Nova API服务的启动
Nova API的启动和工作流程。openstack的每个组件都提供API服务,用于接收和处理客户端的HTTP请求。Nova API服务是一个RESTful API服务。1、Nova API服务的启动2、着重介绍与虚拟机资源有关的url请求的处理流程3、虚拟机创建的HTTP请求处理过程15.2.1 Nova API服务的启动1、Nova API的地图引导: /etc/nov
2016-10-28 22:25:50 2148
原创 Nova框架介绍
openstack是云计算平台。云计算,核心功能就是通过虚拟机实现对服务器计算资源(CPU资源)的分配。虚拟机的管理显然是云计算平台的核心功能。 接下来几节主要分析openstack Nova如何实现对虚拟机的管理。1、掌握虚拟机的创建请求及启动流程2、了解Nova RPC服务的启动流程3、掌握Nova Scheduler虚拟机调度算法4、了解Nova Conductor服务
2016-10-28 20:56:18 5380 1
原创 vim安装YouCompleteMe 插件
vim安装youcomplete插件,折磨我好久,装不好硬是要把它装好,结果最后终于装好这个补全的插件。为了需要安装的人少走弯路,我的安装过程如下(主要提供步骤):1、先看你的vim版本是多少。我的是vim 7.4.52貌似支持python。但是还是不行说是不支持YCM。 最后只能安装vim8.0,手动安装。 具体可以vim --version看来下python和python3是否
2016-10-28 11:13:48 3535
转载 Python模块包中__init__.py文件的作用
在eclipse中用pydev开发Python脚本时,我遇到了一个这样的现象,当我新建一个pydev package时,总会自动地生成一个空的__init__.py文件,因为是python新手,所以很不了解这个空文件的作用是什么,因为没有什么东西可写在这里,所以我直接把这个文件给删掉了,结果我的包图标自动变为文件夹图标了,这是怎么回事呢!原来在python模块的每一个包中,都有
2016-10-25 16:29:33 12855
原创 第3章 里氏替换原则(LSP)
一、定义(1)、所有使用基类的地方必须能够使用子类进行替换,而程序的行为不会发生任何变化(替换为子类之后不会产生错误或者异常)。 只有这样,父类才能真正被复用,子类能够在父类的基础上增减新的属性和行为。才能真正的实现多态行为。(2)、当子类继承父类的时候,子类就拥有了父类的属性和行为。(注意:只是类型而已) 但是如果子类覆盖父类的某些方法,那么原来使用父类的地方就可能出现错误。
2016-10-23 20:24:52 2639
原创 第2章 单一指责原则(SRP)
一、单一指责原则(single responsibility principle, SRP)什么是类的职责?以及怎么划分类的职责1、单一指责的定义:应该有且仅有一个原因引起类的变更。 变化的原因就是所说的"职责"。2、如果一个类有多个引起它变化的原因,也就意味着这个类有多个职责。即把多个职责耦合在一起了。3、“职责”的粒度不好量化。实际开发中,这个原则最容易违反二、单一指责的优
2016-10-22 12:49:53 836
转载 深刻理解Python中的元类(metaclass)
一、类也是对象在理解元类之前,你需要先掌握Python中的类。P在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段。在Python中这一点仍然成立:>>> class Objectvue(object): pass>>> my_object = Objectvue()>>> print my_object类同样也是一种对象。是的,没错,就是对象。只要你使用关键
2016-10-21 23:22:26 2817 2
原创 第1章 UML基础:类的关系
前前后后犹豫好久,到底是写不写设计模式,毕竟自己不是科班出身,最后还是决定根据大神博客和设计模式之禅写下几种常见的设计模式,等到后面使用的时候再来复习。不管是跟着什么资料在学习,记住一定要思考,一定要敲代码,一定要升华!!!1、类的关系1.1、继承(is-a)和实现:继承表示父子关系(子类是特殊的父类),实现有点像接口继承。 1.2、依赖(use-a):表示一个类要使用(u
2016-10-20 13:01:12 1206
原创 RabbitMQ学习小结(六)----远程调用
一、引出问题1、前面的例子都有个共同点,就是发送端发送消息出去后没有结果返回。如果只是单纯发送消息,当然没有问题了,但是在实际中,常常会需要接收端将收到的消息进行处理之后,返回给发送端。2、处理方法描述:发送端在发送信息前,产生一个接收消息的临时队列,该队列用来接收返回的结果。其实在这里接收端、发送端的概念已经比较模糊了,因为发送端也同样要接收消息,接收端同样也要发送消息。3、
2016-10-19 23:30:25 1228
原创 RabbitMQ学习小结(五)----主题交换机
前面的一小节路由键是精确匹配的,路由键的功能,通过设置路由键,可以将消息发送到相应的队列,这里的路由键是要完全匹配,比如info消息的只能发到路由键为info的消息队列。有时用需要路由键模糊匹配,本篇主要演示了路由键模糊匹配的工作方式,主要依赖于使用另一种更复杂的交换机—— 主题交换机。一、主题交换机1、发送到主题交换机(topic exchange)的消息不可以携带随意什么样
2016-10-19 16:58:47 1587 1
原创 RabbitMQ学习小结(四)----路由
关于交换机的使用,已经能实现给所有接收端发送消息,但是如果需要自由定制,有的消息发给其中一些接收端,有些消息发送给另外一些接收端,要怎么办呢?这种情况下就要用到路由键了。一、路由路由键的工作原理:每个接收端的消息队列在绑定交换机的时候,可以设定相应的路由键。 发送端通过交换机发送信息时,可以指明路由键 ,交换机会根据路由键把消息发送到相应的消息队列,这样
2016-10-19 15:58:25 1899
原创 RabbitMQ学习小结(三)----交换机
前面都只使用了一个队列,消息是依次发送给绑定到该队列的接收端。每次消息都只会发送给其中一个接收端,如果需要将消息广播出去,让每个接收端都能收到,那么就要使用交换机。本篇演示了交换机的工作方式。一、发布/订阅1、上小节搭建工作队列,每个消息任务只能分发给一个工作者(消费者)。 分发一个消息给多个消费者。这中模式称为"发布/订阅"。2、构建简单的日志系统。第一个程序负责发送日志消息,
2016-10-18 23:43:05 4956
原创 RabbitMQ学习小结(二)----工作队列
演示了多个接收端情况下,消息发送的工作方式。本小节将对工作队列(Work Queues)做一个了解。一、简介在Hello World中,学会从队列中发送和获取消息。实际应用中,并不是简单的接收和发送。当需要复杂的需求时,为了提升效率,一个消费者处理不过来。 在这篇教程中,我们将创建一个工作队列(Work Queue),它会发送一些耗时的任务给多个工作者(Worker)。工作
2016-10-18 22:15:21 4269
原创 RabbitMQ学习小结(一)----hello world
一、RabbitMQ介绍RabbitMQ是一个消息代理。核心原理:接收和发送消息。RabbitMQ将发送消息和接收消息进行解耦,由此来实现应用程序的异步处理。如果将RabbitMQ视为一个服务,从大方向来看,RabbitMQ做了三件事情:1. 收取请求 存储 交换 路由2. 存储请求信息 3. 分发请求引用官网原文,你可以把它想像成一个邮局:你把信件放入邮
2016-10-18 20:49:52 3728
原创 python 中的%s和%r、str.format()函数
%r是repr %s就是str>>> print '%r' % 'a''a'>>> print '%s' % 'a'a>>> class Example(object): ... __repr__ = lambda cls: '(repr)'... __str__ = lambda cls: '(str)'... >>> example = Exampl
2016-10-18 15:40:08 8181
原创 11.3.2、基于消息通信的RPC调用 之 RabbirMQ分析
本小节内容:分析RabbitMQ的工作原理。在openstack中,主要是Nova用到了RPC调用。将介绍Nova如何通过RabbitMQ实现RPC调用。一、openstack Nova的服务间通信机制Openstack Nova中是由许多组件构成的。而不同的服务之间,都是通过RPC来实现通信。同时,由于采用的是AMQP协议,因此组件之间具有很强的松耦合性。表现在:(1)、
2016-10-17 22:04:14 1391
原创 11.3.1 基于消息通信的RPC调用之 AMQP简介
RESTful API是一套基于HTTP协议的通信机制。但是,这样的通信机制存在一下不足:(1)、由于采用的是HTTP协议,客户端服务器之间所能传送的消息仅限于文本。(2)、客户端与服务器之间采用同步机制。当发送HTTP请求时,客户端需要等待服务器的响应。(3)、客户端和服务器之间可以单独开发,但是还是存在耦合。例如:客户端发送请求时,必须知道服务器的地址,且保证服务器正常工作
2016-10-17 20:13:34 1503
原创 11.2.5、搭建RESTful API 之 实现WSGI服务的URL映射
问题引出:对于一个稍具规模的网站来说,实现的功能不可能通过一条URL来完成。如何定义多条URL,也是RESTful API考虑的问题。
2016-10-12 22:43:42 2012 1
原创 11.2.4、搭建RESTful API 之 利用类来实现
通过上一节的学习,已经可以很容易的添加和删除功能模块了。但是还存在一下不足:(1)、上一节过滤器和应用程序都是用方法来实现的。对于实现比较复杂的功能显然不是很好(2)、通过httpd.serve_forever()来启动WSGI服务,使得一个进程对应一个WSGI服务。对于ESGI服务的启动、关闭和暂停都需要直接对进程进行操作,带来了很多不便。(3)、利用类来实现过滤器和一个应用程序
2016-10-12 22:28:58 407
原创 python单下划线/双下划线总结
Python 用下划线作为变量前缀和后缀指定特殊变量_xxx :不能用’from module import *’导入__xxx__ :系统定义名字__xxx :类中的私有变量名核心风格:避免用下划线作为变量名的开始。因为下划线对解释器有特殊的意义,而且是内建标识符所使用的符号,我们建议程序员避免用下划线作为变量名的开始。一般来讲,变量名_xxx被看作是“
2016-10-12 09:25:23 5874 2
原创 11.2.3、搭建RESTFUL API 之 带过滤器的WSGI服务
1、如果把一个WSGI服务的所有功能都放在一个方法中,显然不利于扩展。2、如果把每一个独立的小功能放在一个方法里,而整个WSGI服务,是由若干个方法串联起来的一个大应用程序。3、当需要对WSGI服务进行扩展时,只需要往WSGI服务中添加或删除某些方法。添加或删除方法只需要简单的修改configure.ini配置文件即可。具有很强的伸缩性。代码实例:配置文件configu
2016-10-11 21:24:34 511
原创 11.2.2、搭建RESTful API之使用PasteDeploy定制WSGI服务
WSGI服务的相关相关基础只是前面已经介绍,而且Paste模块也有所介绍。现在就一步一步实现paste模块的每个功能。一、知识点讲解1、为什么需要 PasteDeploy 模块? 一个 WSGI服务 的核心部分,是它的应用程序。如果WSGI服务的应用程序修改了,那么WSGI相应的功能也就改变了。2、通过配置文件来配置 WSGI 服务的应用程序,当需要对WSGI服务的应用程序进行修改
2016-10-10 23:36:14 774
原创 linux grep命令和sed命令
本着做事情够用的原则,要不然无穷无尽,简单使用下grep命令和sed命令。1、grep语法:grep pattern filenamepattern (搜索的字符串、数字等,也可以使用正表达式,通配符等等)filename (文件/目录 或者 .)参数参数函数-i忽略大小写-w全词匹
2016-10-09 18:28:48 5613 1
原创 linux shell 管道命令(pipe)使用及与shell重定向区别
管道命令操作符是:”|”,它仅能处理经由前面一个指令传出的正确输出信息,也就是 standard output 的信息,对于 stdandard error 信息没有直接处理能力。然后,传递给下一个命令,作为标准的输入 standard input.管道命令使用说明:先看下下面图:command1正确输出,作为command2的输入 然后comand2的输出作为,coman
2016-10-09 17:39:10 1885
原创 python 网络编程socket
socket模块详解,通过这些基础知识可以使我们更好的理解网络编程。一、网络知识的一些介绍1、socket 是网络连接端点。 例说:当你的Web浏览器请求www.jb51.net上的主页时(即就是发送HTTP请求),web浏览器会创建一个socket对象并命令它去连接www.jb51.net的web服务器主机,web服务器也会对来自的请求在一个socket对象上进行监听。客户端和服
2016-10-09 15:31:29 1732
原创 openstack nova 基础知识——eventlet
openstack的Eventlet库在openstack服务中上镜率很高,尤其是在服务的多线程 和 WSGI服务器并发处理请求的情况下,深入理解eventlet库很有必要。这也是进入nova世界的关键,涉及一个很重要的概念:"协程"。eventlet库是由second life开源的高性能网络库,从eventlet的源码可以知道,其主要依赖两个关键的库:(1)、greenlet
2016-10-08 23:26:19 2713
原创 详解例说Paste模块(PasteDeploy)
使用PasteDeploy定制WSGI服务一、为什么引入Paste模块?(1)、当看到openstack的api-paste.ini中大量出现的composite、pipline、filter、app之后顿时感觉不淡定了,这些都是什么玩 意?详细研究一番,却有意外的收获,明白了openstack使用这套东西的高明之处。(2)、一个WSGI服务的核心部分,是它的应用程序。
2016-10-08 20:47:31 10314 5
原创 IndentationError: unindent does not match any outer indentation level
【问题】 一个python脚本,本来都运行好好的,然后写了几行代码,而且也都确保每行都对齐了,但是运行的时候,却出现语法错误: IndentationError: unindent does not match any outer indentation level【解决过程】 1.对于此错误,最常见的原因是,的确没有对齐。但是我根据错误提示的行数,去代码中看了下,
2016-10-07 21:34:48 4150
原创 WSGI、webob、routes实例
程序代码:from wsgiref.simple_server import make_serverfrom routes import Mapper,middlewarefrom webob import Request,Responseimport webob.decimport webob.excclass Controller: @webob.dec.wsgify
2016-10-07 21:31:15 1554
原创 routes的 middleware.RoutersMiddleware
RoutesMiddleware将HTTP的URL请求应声到相应WSGI函数,并且将路由匹配结果存到environ环境变量中去。from routes.middleware import RoutesMiddlewareapp = RoutesMiddleware(wsgi_app, map) # map is a routes.Mapperapp = RoutesMiddlewa
2016-10-07 20:06:25 1220
原创 Routes模块详解
大神博客,对我的基础只是补充起到很好的帮助。http:://blog.csdn.net/spch2008/article/details/ 表示感谢。开始启程!!!一、开始routes模块之旅例子1:直接上代码:from routes import Mappermap = Mapper() #生成的是 Mapper()实例对象print mapprint type(
2016-10-07 18:40:21 10861 2
原创 python内置的高阶函数
一、什么是高阶函数(1)、变量可以指向函数,对变量和函数的调用效果是一样的。 函数也是一个对象,在python中一切都是对象。 abs函数实现了__call__方法,所以 f = abs 调用是一样 (2)、函数名其实就是指向函数的变量。 函数名和普通变量没有区别,只是指向的是函数对象 通过上面的例子引出高阶函数的概念(3)高阶函数:能
2016-10-07 16:55:09 3175
原创 完善装饰器函数
@decorator可以动态实现函数功能的增加,但是,经过@decorator“改造”后的函数,和原函数相比,除了功能多一点外,有没有其它不同的地方?(1)、在没有decorator的情况下,打印函数名代码:def f1(x): passprint f1.__name__输出:(2)、有decorator的情况下,再打印函数名代码:def
2016-10-07 15:55:12 745
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人