开始学习openstack源码,源码文件多,分支不少。按照学习的方法走通一条线是最好的,而网上推荐的最多的就是nova创建虚机的过程。从这一条线入手,能够贯穿openstack核心服务。写博文仅做学习笔记整理,多为借鉴网上大牛的分析。因为涉及到的知识点很多,所以分期来比较写合适。

openstack有3中创建虚拟机的方法,分别是:命令行创建,dashboard界面创建和api接口创建。

前两种方式最终还是调用openstack的Restful API去工作。

openstack创建虚拟机流程如下:

通过命令行查看镜像列表来调试整个过程:

openstack image list
 ----->START with options: [u'--debug', u'image', u'list']
###将命令行转化成url
----->command: image list -> openstackclient.image.v2.image.ListImage
4 ###发送请求
----->Starting new HTTP connection (): controller
http://controller:35357 "GET /v3 HTTP/1.1" 200 250
##没有token,所以先请求token
----->Making authentication request to http://controller:35357/v3/auth/tokens
http://controller:35357 "POST /v3/auth/tokens HTTP/1.1" 201 5229
##返回的token信息。
10
{"token":
12 {
13 "is_domain": false,
14 "methods": ["password"],
15 "roles": [{
16 "id": "39a6815cad0e4e7c879de0092076ff3f",
17 "name": "admin"
18 }],
19 "expires_at": "2017-10-27T09:11:56.000000Z",
20 "project": {
21 "domain": {
22 "id": "default",
23 "name": "Default"
24 },
25 "id": "ffd1a0df301045f1b20eef7d9e126dbf",
26 "name": "admin"
27 },
28 "catalog": [{
29 "endpoints": [{
30 "url": "http://controller:8080/v1/AUTH_ffd1a0df301045f1b20eef7d9e126dbf",
31 "interface": "internal",
32 "region": "RegionOne",
33 "region_id": "RegionOne",
34 "id": "0ee0b857383a44d98970cce3fd0cdfd2"
35 },
36 {
37 "url": "http://controller:8080/v1/AUTH_ffd1a0df301045f1b20eef7d9e126dbf",
38 "interface": "public",
39 "region": "RegionOne",
40 "region_id": "RegionOne",
41 "id": "8c0c6d20c6c1468387282b9a4c5fd444"
42 },
43 {
44 "url": "http://controller:8080/v1",
45 "interface": "admin",
46 "region": "RegionOne",
47 "region_id": "RegionOne",
48 "id": "eb1f0c50aa1e45c2968da7a59a3054e0"
49 }], ##返回信息中获得token,并获得image服务的入口。
##再次请求image服务
----->REQ: curl -g -i -X GET "http://controller:9292/v2/images?marker=None" -H "User-Agent: osc-lib/1.3.0 keystoneauth1/2.18.0 python-requests/2.12.4 CPython/2.7.12" -H "X-Auth-Token: {SHA1}7b4a526303024850fd85c54c830599ad94641d7a"
----->Starting new HTTP connection (): controller ##获得返回信息,其中有id,name,statues三项,能够显示出来。
RESP: [] Content-Length: Content-Type: application/json; charset=UTF- X-Openstack-Request-Id: req-5bae1adb--438a-93f2-e2e4cfc6664c Date: Fri, Oct :: GMT Connection: keep-alive
------>RESP BODY:
{
"images": [{
"status": "active",
"name": "cirros",
"tags": [],
"container_format": "bare",
"created_at": "2017-07-11T11:43:18Z",
"size": ,
"disk_format": "qcow2",
"updated_at": "2017-07-11T11:43:18Z",
"visibility": "public",
"self": "/v2/images/d22d0398-8b12-406c-9ebb-285257c6d31f",
"min_disk": ,
"protected": false,
"id": "d22d0398-8b12-406c-9ebb-285257c6d31f",
"file": "/v2/images/d22d0398-8b12-406c-9ebb-285257c6d31f/file",
"checksum": "f8ab98ff5e73ebab884d80c9dc9c7290",
"owner": "ffd1a0df301045f1b20eef7d9e126dbf",
"virtual_size": null,
"min_ram": ,
"schema": "/v2/schemas/image"
}],
"schema": "/v2/schemas/images",
"first": "/v2/images"}
GET call to None for http://controller:9292/v2/images?marker=d22d0398-8b12-406c-9ebb-285257c6d31f used request id req-553123bd-6373-4306-9e72-fff4737b49b4
clean_up ListImage:
END return value:
+--------------------------------------+--------+--------+
| ID | Name | Status |
+--------------------------------------+--------+--------+
| d22d0398-8b12-406c-9ebb-285257c6d31f | cirros | active |
+--------------------------------------+--------+--------+

在这个过程中能够清晰看出,请求都是通过URL的方式发送的相应服务,这就是一个基于RESTFUL 的架构。

总结openstack image list 命令生效的过程:

  1. 在本地将openstack image list命令转化成URL。
  2. 以restful的方式请求image服务,但没有认证所以不成功。
  3. 以restful的方式请求keystone获取token。
  4. 通过keystone返回的服务列表获取image的服务入口。
  5. 以restful的方式请求image服务,获取list信息。

Restful API:

RESTFUL即远程调用函数接口的设计风格,对http协议包装,使其能够满足REST方法,即restful api。

远程:使用http协议,用类似网站请求的流程。

调用函数接口:通过不同的URL请求地址调用不同的函数接口(API)。

设计风格:不同于本地函数调用,所有的API都可以看做是资源,使用URL调用。

例如请求openstack token的过程,一个标准的restful api工作方式。

http://192.168.252.134:5000/v2.0/tokens

该命令是一条URL,http://192.168.252.134:5000是keystone服务的入口 /v2.0/tokens是对应的keystone的restful api的接口。

返回的结果部分如下

{
"access": {
"token": {
"issued_at": "2017-09-22T18:13:42.000000Z",
"expires": "2017-09-22T19:13:42Z",
"id": "6cfdf8c54e1b482c90bbacf53efc9623",
"tenant": {
"description": "Bootstrap project for initializing the cloud.",
"enabled": true,
"id": "3602a1190ab74fa4aa17ac4da1a7bbc2",
"name": "admin"
},
"audit_ids": [
"jnYGZYHbSbeejDSQm0ORxA"
]
},
"serviceCatalog": [
{
"endpoints": [
{
"adminURL": "http://192.168.252.134:8774/v2.1",
"region": "RegionOne",
"internalURL": "http://192.168.252.134:8774/v2.1",
"id": "4b1950b5cc9c49c685f19cdb003601d3",
"publicURL": "http://192.168.252.134:8774/v2.1"
}
],
"endpoints_links": [],
"type": "compute",
"name": "nova"
},

通过一条URL调用了openstack环境中的函数,操作通过认证,返回下一步要使用的认证token。

熟悉openstack应该了解,keystone认证成功之后除了返回token之外,还会返回所有服务的组件接口,及restful接口。

REST

REST(Representational State Transfer 表现层状态转移)是一种软件架构风格、设计风格,而不是标准。主要用于客户端和服务端的API交互,它的优势在于更简洁、清晰、可读性强。

RESTFUL

满足REST约束条件和原则的应用程序或设计就是Restful,即Rest风格的应用

RESRFUL 特征

一、请求方式:

REST构建于HTTP协议之上,遵循并扩展和规范了传统HTTP协议中的标准方法,

以下是RESTful API定义的标准方法:

GET 查询资源
POST 增加资源
PUT 更新资源
HEAD 验证,包括用户身份的验证和资源的验证
DELETE 删除资源

二、资源化:

REST要求URL的格式遵守统一的规范,所有资源都具有唯一的ID。具体到OpenStack中,每个资源都有一个UUID,作为全局唯一的标识。

我们用instances来表示虚拟机的集合,每一个instance(虚拟机实例)具有全局唯一的UUID

在以上的过程中能够看到,restful和URL有着千丝万缕的联系。最后简单总结:

Restful 设计模式 和 网站设计模式的对比:

不同点:数据格式

网站数据传输格式有多种,常见为text/html 而restful为json格式。

相同点:架构设计

都需要相同的架构,即服务器程序(appach,nigix)+ WSGI(接口)+ 应用程序。

额外补充:

与Restful的设计风格不同的其他设计风格:

1.SOA : 面向服务的架构 【组件模型】【将服务通过定义良好的接口和契约联系起来】

2.SOAP : 简单对象访问协议 一种数据交换协议规范,是一种轻量的、简单的、基于XML的协议的规范

3.RPC : 远程过程调用协议 从一台机器(客户端)上通过参数传递的方式调用另一台机器(服务器)上的一个函数或方法(服务)并得到返回的结果【调用本地函数/方法一样去调用远程的函数/方法】

4.微服务:
    A 独立的进程的方式存在,互相之间并无影响
    B 接口方式更加通用化
    C 倾向于分布式去中心化的部署方式,在互联网业务场景下更适合

nova创建虚拟机源码分析系列之一 restful api的更多相关文章

  1. nova创建虚拟机源码分析系列之五 nova源码分发实现

    前面讲了很多nova restful的功能,无非是为本篇博文分析做铺垫.本节说明nova创建虚拟机的请求发送到openstack之后,nova是如何处理该条URL的请求,分析到处理的类. nova对于 ...

  2. nova创建虚拟机源码分析系列之三 PasteDeploy

    上一篇博文介绍WSGI在nova创建虚拟机过程的作用是解析URL,是以一个最简单的例子去给读者有一个印象.在openstack中URL复杂程度也大大超过上一个例子.所以openstack使用了Past ...

  3. nova创建虚拟机源码分析系列之七 传入参数转换成内部id

    上一篇博文将nova创建虚机的流程推进到了/compute/api.py中的create()函数,接下来就继续分析. 在分析之前简单介绍nova组件源码的架构.以conductor组件为例: 每个组件 ...

  4. nova创建虚拟机源码分析系列之六 api入口create方法

    openstack 版本:Newton 注:博文图片采用了很多大牛博客图片,仅作为总结学习,非商用.该图全面的说明了nova创建虚机的过程,从逻辑的角度清晰的描述了前端请求创建虚拟机之后发生的一系列反 ...

  5. nova创建虚拟机源码分析系列之八 compute创建虚机

    /conductor/api.py _build_instance()  /conductor/rpcapi.py  _build_instance() 1 构造一些数据类型2 修改一些api版本信息 ...

  6. nova创建虚拟机源码分析系列之四 nova代码模拟

    在前面的三篇博文中,介绍了restful和SWGI的实现.结合restful和WSGI配置就能够简单的实现nova服务模型的最简单的操作. 如下的内容是借鉴网上博文,因为写的很巧妙,将nova管理虚拟 ...

  7. nova创建虚拟机源码系列分析之二 wsgi模型

    openstack nova启动时首先通过命令行或者dashborad填写创建信息,然后通过restful api的方式调用openstack服务去创建虚拟机.数据信息从客户端到达openstack服 ...

  8. MyCat源码分析系列之——SQL下发

    更多MyCat源码分析,请戳MyCat源码分析系列 SQL下发 SQL下发指的是MyCat将解析并改造完成的SQL语句依次发送至相应的MySQL节点(datanode)的过程,该执行过程由NonBlo ...

  9. MyCat源码分析系列之——BufferPool与缓存机制

    更多MyCat源码分析,请戳MyCat源码分析系列 BufferPool MyCat的缓冲区采用的是java.nio.ByteBuffer,由BufferPool类统一管理,相关的设置在SystemC ...

随机推荐

  1. 【epub.js|翻译|原创】开源中间件epub.js的使用及其中文文档

    epub是最流行的电子书规范之一,网络上对于Java Web有不少合适的方法来解析和呈现,但是关于epub.js的介绍比较少(尽管github上已经2K星了),更多的是概念性的内容,如: epub.j ...

  2. ptrdiff_t 和 size_t

    size_t和ptrdiff_t常常用来指示数组长度. size_t常用于表示数组的大小,可以一般的将他看为 typedef unsigned int size_t,实质是一个无符号整形.包含在头文件 ...

  3. java.lang.ClassCastException: com.sun.proxy.$Proxy2 cannot be cast to...异常

    异常: Exception in thread "main" java.lang.ClassCastException: com.sun.proxy.$Proxy2 cannot ...

  4. Swift 线程安全数组

    欢迎大家前往腾讯云社区,获取更多腾讯海量技术实践干货哦~ 作者:BigNerdCoding 有并发的地方就存在线程安全问题,尤其是对于 Swift 这种还没有内置并发支持的语言来说线程安全问题更为突出 ...

  5. javascript 45种缓动效果BY司徒正美

    javascript 45种缓动效果 参数 类型 说明 el element 必需,为页面元素 begin number 必需,开始的位置 change number 必需,要移动的距离 durati ...

  6. webpack安装配置

    webpack安装 1.安装之前你必须要安装node.js,如果你没安装可以在node.js网去下载node.js 2.全局安装webpack,打开cmd输入npm install webpack - ...

  7. 如何配置 Health Check?- 每天5分钟玩转 Docker 容器技术(107)

    容器状态是 UP 的,应用就是健康的吗? 还真不一定!Docker 只能从容器启动进程的返回代码判断其状态,而对于容器内部应用的运行情况基本没有了解. 执行 docker run 命令时,通常会根据 ...

  8. idea快速搭建springboot项目

    Spring Boot是由Pivotal团队提供的全新框架,设计目的是用来简化新Spring应用的初始搭建以及开发过程.它主要推崇的是'消灭配置',实现零配置. 那么,如何在idea中创建一个spri ...

  9. SharePoint 2013 引发类型为“System.ArgumentException”的异常。 參数名: encodedValue

    SharePoint 2013 引发类型为"System.ArgumentException"的异常. 參数名: encodedValue 具体错误信息 说明: 运行当前 Web ...

  10. 《Pro Android Graphics》读书笔记之第六节

    Android UI Layouts: Graphics Design Using the ViewGroup Class Android ViewGroup Superclass: A Founda ...