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

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

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

openstack创建虚拟机流程如下:

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

  1. openstack image list
  1. ----->START with options: [u'--debug', u'image', u'list']
  2. ###将命令行转化成url
  3. ----->command: image list -> openstackclient.image.v2.image.ListImage
  4. 4 ###发送请求
  5. ----->Starting new HTTP connection (): controller
  6. http://controller:35357 "GET /v3 HTTP/1.1" 200 250
  7. ##没有token,所以先请求token
    ----->Making authentication request to http://controller:35357/v3/auth/tokens
  8. http://controller:35357 "POST /v3/auth/tokens HTTP/1.1" 201 5229
  9. ##返回的token信息。
  10. 10
  11. {"token":
  12. 12 {
  13. 13 "is_domain": false,
  14. 14 "methods": ["password"],
  15. 15 "roles": [{
  16. 16 "id": "39a6815cad0e4e7c879de0092076ff3f",
  17. 17 "name": "admin"
  18. 18 }],
  19. 19 "expires_at": "2017-10-27T09:11:56.000000Z",
  20. 20 "project": {
  21. 21 "domain": {
  22. 22 "id": "default",
  23. 23 "name": "Default"
  24. 24 },
  25. 25 "id": "ffd1a0df301045f1b20eef7d9e126dbf",
  26. 26 "name": "admin"
  27. 27 },
  28. 28 "catalog": [{
  29. 29 "endpoints": [{
  30. 30 "url": "http://controller:8080/v1/AUTH_ffd1a0df301045f1b20eef7d9e126dbf",
  31. 31 "interface": "internal",
  32. 32 "region": "RegionOne",
  33. 33 "region_id": "RegionOne",
  34. 34 "id": "0ee0b857383a44d98970cce3fd0cdfd2"
  35. 35 },
  36. 36 {
  37. 37 "url": "http://controller:8080/v1/AUTH_ffd1a0df301045f1b20eef7d9e126dbf",
  38. 38 "interface": "public",
  39. 39 "region": "RegionOne",
  40. 40 "region_id": "RegionOne",
  41. 41 "id": "8c0c6d20c6c1468387282b9a4c5fd444"
  42. 42 },
  43. 43 {
  44. 44 "url": "http://controller:8080/v1",
  45. 45 "interface": "admin",
  46. 46 "region": "RegionOne",
  47. 47 "region_id": "RegionOne",
  48. 48 "id": "eb1f0c50aa1e45c2968da7a59a3054e0"
  49. 49 }],
  50.  
  51. ##返回信息中获得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"
  52. ----->Starting new HTTP connection (): controller
  53.  
  54. ##获得返回信息,其中有id,name,statues三项,能够显示出来。
  55. 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
  56. ------>RESP BODY:
  57. {
  58. "images": [{
  59. "status": "active",
  60. "name": "cirros",
  61. "tags": [],
  62. "container_format": "bare",
  63. "created_at": "2017-07-11T11:43:18Z",
  64. "size": ,
  65. "disk_format": "qcow2",
  66. "updated_at": "2017-07-11T11:43:18Z",
  67. "visibility": "public",
  68. "self": "/v2/images/d22d0398-8b12-406c-9ebb-285257c6d31f",
  69. "min_disk": ,
  70. "protected": false,
  71. "id": "d22d0398-8b12-406c-9ebb-285257c6d31f",
  72. "file": "/v2/images/d22d0398-8b12-406c-9ebb-285257c6d31f/file",
  73. "checksum": "f8ab98ff5e73ebab884d80c9dc9c7290",
  74. "owner": "ffd1a0df301045f1b20eef7d9e126dbf",
  75. "virtual_size": null,
  76. "min_ram": ,
  77. "schema": "/v2/schemas/image"
  78. }],
  79. "schema": "/v2/schemas/images",
  80. "first": "/v2/images"}
  81. 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
  82. clean_up ListImage:
  83. END return value:
  84. +--------------------------------------+--------+--------+
  85. | ID | Name | Status |
  86. +--------------------------------------+--------+--------+
  87. | d22d0398-8b12-406c-9ebb-285257c6d31f | cirros | active |
  88. +--------------------------------------+--------+--------+

在这个过程中能够清晰看出,请求都是通过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工作方式。

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

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

返回的结果部分如下

  1. {
  2. "access": {
  3. "token": {
  4. "issued_at": "2017-09-22T18:13:42.000000Z",
  5. "expires": "2017-09-22T19:13:42Z",
  6. "id": "6cfdf8c54e1b482c90bbacf53efc9623",
  7. "tenant": {
  8. "description": "Bootstrap project for initializing the cloud.",
  9. "enabled": true,
  10. "id": "3602a1190ab74fa4aa17ac4da1a7bbc2",
  11. "name": "admin"
  12. },
  13. "audit_ids": [
  14. "jnYGZYHbSbeejDSQm0ORxA"
  15. ]
  16. },
  17. "serviceCatalog": [
  18. {
  19. "endpoints": [
  20. {
  21. "adminURL": "http://192.168.252.134:8774/v2.1",
  22. "region": "RegionOne",
  23. "internalURL": "http://192.168.252.134:8774/v2.1",
  24. "id": "4b1950b5cc9c49c685f19cdb003601d3",
  25. "publicURL": "http://192.168.252.134:8774/v2.1"
  26. }
  27. ],
  28. "endpoints_links": [],
  29. "type": "compute",
  30. "name": "nova"
  31. },

通过一条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. 十一、Hadoop学习笔记————数据库与数据仓库

    数据仓库是集成的面向主题的数据库的集合 面向主题主要是宏观上解决某一类问题,集合性指数据集 数据库主要处理用于事务处理,数据仓库用于分析处理,数据库适用于操作型数据,便于增删改查, 数据仓库则用于挖掘 ...

  2. 2981:大整数加法-poj

    2981:大整数加法 总时间限制:  1000ms 内存限制:  65536kB 描述 求两个不超过200位的非负整数的和. 输入 有两行,每行是一个不超过200位的非负整数,可能有多余的前导0. 输 ...

  3. 2746:约瑟夫问题poj

    2746:约瑟夫问题 总时间限制:  1000ms 内存限制:  65536kB 描述 约瑟夫问题:有n只猴子,按顺时针方向围成一圈选大王(编号从1到n),从第1号开始报数,一直数到m,数到m的猴子退 ...

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

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

  5. 认识 var、let、const

    我们通过声明.初始化.值的可变性.作用域.变量提升以及在工作中如何使用等多个方面来详细了解var.let.const等关键字功能与特点. 声明 var,let:可以先声明,后赋值(初始化),默认值是 ...

  6. caffe+opencv3.3dnn模块 完成手写数字图片识别

    最近由于项目需要用到caffe,学习了下caffe的用法,在使用过程中也是遇到了些问题,通过上网搜索和问老师的方法解决了,在此记录下过程,方便以后查看,也希望能为和我一样的新手们提供帮助. 顺带附上老 ...

  7. hiho-1015- KMP算法

    #1015 : KMP算法 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在 ...

  8. UWP 用Thumb 控件仿制一个可拖动悬浮 Button

    参考了 http://www.cnblogs.com/zhanggaoxing/p/6403430.html,并加以改进. 最终效果::: Thumb 的原生事件 DragStarted,DragDe ...

  9. centos7 简单搭建lnmp环境

    1:查看环境: 1 2 [root@10-4-14-168 html]# cat /etc/redhat-release CentOS release 6.5 (Final) 2:关掉防火墙 1 [r ...

  10. 为开源社区尽一份力,翻译RocketMQ官方文档

    正如在上一篇文章中写道:"据我所知,现在RocketMQ还没有中文文档.我打算自己试着在github上开一个项目,自行翻译."我这几天抽空翻译了文档的前3个小节,发现翻译真的不是一 ...