libcloud是apache下整合多种云服务接口的项目。最近,在研究libcloud代码的同时,将阿里云存储(Ali OSS)和百度云存储用libcloud storage driver规范进行封装,相当于在libcloud中添加了对阿里云存储和百度云存储的支持。

libcloud中对其支持的每个云存储,都提供response、rawresponse、connection和storagedriver类。每个云存储相应类都由诸多基类继承而来,能最大限度重用代码,发掘多个云存储间相似之处。

     libcloud中诸多云存储大致分为两类规范,两类规范的代表分别为cloudfiles和Amazon S3。
 
  CloudFiles Amazon S3
返回信息格式 JSON XML
数据组织形式 container + object bucket + object
认证方式 OAUTH认证(获取token) 请求签名
除这些之外,还有诸多细节上区别,比如请求头必须包含内容、container(bucket)和object的命名大小限制,还有返回状态码等等,不一一赘述。
     Openstack swift即是典型的CloudFiles式规范,而Google Storage和本人封装的Ali OSS遵循的则是Amazon S3式规范。
 
下面以CloudFiles和Amazon S3这两种代表性云存储为例,解析libcloud相应代码结构。
 
1. 响应类(Response和RawResponse)
     
     Response类接收httplib.HTTPResponse类对象和下一部分即将要介绍的Connection类对象作为初始化参数。获取HTTP响应信息中返回码、错误信息等,并提供对body的解析方法。
     为何要为返回信息单独派生一个RawResponse类呢?我的理解是在GET、PUT请求存取数据时,此时response body内容非空,使用HTTPConnection.send()上传body内容,而send()要求在endheaders()和getresponse()之间调用。Response类被调用流程不能满足此点,故派生类RawResponse。至于使用HTTPConnection.send()上传body数据,而不直接在request中指定body参数上传数据的原因,我想应是为了便于大数据分块上传,代码易于扩展。
 
     针对XML和JSON两种不同的返回信息格式,派生不同的子类,并分别重定义相应body解析方法。而后,根据S3和CloudFiles自身对返回信息规范,再次派生出相应的子类,用于处理解析各自HTTP response。
 
2. 连接类(Connection)
 
 
     connection是所有连接类的基类,它根据secure参数选择HTTP或HTTPS协议,建立到云端的连接。在类图中只列出了其较为重要的属性与方法。
     对某一云存储的具体connection,会根据其具体规范为headers和params赋值,抑或重定义request()函数。
     这里想说说Openstack中鉴权,鉴权过程在OpenStackBaseConnection类中重定义的morap_action_hook()函数中调用的_populate_hosts_and_request_paths (libcloud.common.openstack line. 262--300)中实现。大致流程为,先获取认证类,指定认证api版本,后执行认证过程:
osa = osa.authenticate(**kwargs),以此获得token和相应endpoint。
 
3. 存取驱动类(StorageDriver)
 
 
     libcloud中对云存储的访问,直接就是通过相应的StorageDriver进行的,对应的Response和Connection类都是为StorageDriver服务。
     StorageDriver类本身,定义了通用的StorageDriver结构,但其中具体的RESTful风格方法均未实现,在其子类中(BaseS3StorageDriver、CloudFilesStorageDriver)分别实现。
 

libcloud代码研究(一)——基本架构的更多相关文章

  1. libcloud代码研究(三)——bugs

    Bug 1:对不可迭代类进行迭代(libcloud.storage.driver.cloudfile line. 141-142)      使用libcloud连接自搭建swift服务,自己在服务器 ...

  2. libcloud代码研究(二)——云服务封装

    对Ali OSS和百度云存储的封装      先在libcloud.storage.provider文件中添加Ali OSS provider和Baidu provider,在DRIVERS中添加如下 ...

  3. dedecms代码研究二

    dedecms代码研究(2)从index开始现在继续,今天讲的主要是dedecms的入口代码.先打开index.PHP看看里面是什么吧.打开根目录下的index.php嗯映入眼帘的是一个if语句.检查 ...

  4. Ningx代码研究.

    概述 研究计划 参与人员 研究文档 学习emiller的文章 熟悉nginx的基本数据结构 nginx 代码的目录结构 nginx简单的数据类型的表示 nginx字符串的数据类型的表示 内存分配相关 ...

  5. 一段markdown编辑器代码研究

    一段markdown编辑器代码研究 说明 代码在 https://github.com/dukeofharen/markdown-editor 之所以选择这个来分析是一方面是因为它的代码结构比较简单, ...

  6. [转载]iOS6新特征:UICollectionView官方使用示例代码研究

    原文地址:iOS6新特征:UICollectionView官方使用示例代码研究作者:浪友dans 注:这里是iOS6新特征汇总贴链接 iOS6新特征:参考资料和示例汇总 这个链接可以学习到UIColl ...

  7. *DataSet序列化,这段代码研究

    DataSet序列化,这段代码研究研究.学习学习. using System; using System.Collections.Generic; using System.Linq; using S ...

  8. CWMP开源代码研究——git代码工程

    原创作品,转载请注明出处,严禁非法转载.如有错误,请留言! email:40879506@qq.com 声明:本系列涉及的开源程序代码学习和研究,严禁用于商业目的. 如有任何问题,欢迎和我交流.(企鹅 ...

  9. CWMP开源代码研究5——CWMP程序设计思想

    声明:本文涉及的开源程序代码学习和研究,严禁用于商业目的. 如有任何问题,欢迎和我交流.(企鹅号:408797506) 本文介绍自己用过的ACS,其中包括开源版(提供下载包)和商业版(仅提供安装包下载 ...

随机推荐

  1. SQL service

    依赖关系解决 ============================================================================================= ...

  2. 【USACO2006 Mar】滑雪缆车 skilift

    [USACO2006 Mar] 滑雪缆车 skilift Time Limit 1000 msMemory Limit 131072 KBytes Description 科罗拉多州的罗恩打算为奶牛建 ...

  3. 题解报告:hdu 2066 一个人的旅行

    Problem Description 虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王子,^0^),很多事,还能丰 ...

  4. vue-cli 打包优化

    1. 优化打包体积 先上2个图 (上图A是优化前的各个js大小对比视图,下图B是优化后,还未完全优化完成的,不过也可以看得出来对比) 图A是3个压缩文件,包括部分图片和使用的所有js,体积都偏大 图B ...

  5. 笨拙而诡异的 Oracle

    有这样一段 SQL 代码: 通过 C# 获取查询结果:    SQL 代码中有两个参数,且都是字符串类型,以上的 C# 代码是生成 Oracle SQL 代码所需要的参数.运行结果如下:   居然发生 ...

  6. synchronized关键字详解(一)

    synchronized官方定义: 同步方法支持一种简单的策略防止线程干扰和内存一致性错误,如果一个对象对多个线程可见,则对该对象变量的所有读取或写入都是通过同步方法完成的(这一个synchroniz ...

  7. CSS3悬浮动画效果

    利用CSS3的伪类元素hover以及transform,transition等动画属性,可以做出一些炫酷的动画效果.下面将一些项目中使用到的示例发布出来,供大家一起学习研究.演示地址:runjs. 浏 ...

  8. Element type "LinearLayout" must be followed by either attribute specifications, ">" or "/>"的解决办法

    看老师的word文档开始学习.复制了一段代码,在layout中新建了一个Android XML file,发现有提示错误. 代码如下: <?xml version="1.0" ...

  9. python自动化测试框架(一)

    1.开发环境 名称 版本 系统 windows 7 python版本 2.7.14 IDE pycharm2017 2.大致框架流程 :展示了框架实现的业务流程 3.框架介绍 3.1 ======完善 ...

  10. jQuery——this

    js注册事件this代表的dom对象 jQuery注册事件this代表的也是dom对象,所以需要$(this)转成jQuery对象