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. Spark 机器学习------逻辑回归

    package Spark_MLlib import javassist.bytecode.SignatureAttribute.ArrayType import org.apache.spark.s ...

  2. [Swift通天遁地]八、媒体与动画-(4)给相机添加CoreImage滤镜效果

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  3. [Swift通天遁地]九、拔剑吧-(12)创建Preview-Transition图像预览界面

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  4. NS2学习笔记(五)

    对无线网络,生成nam文件要使用namtrace-all-wireless, 而不是namtrace-all: set nf [open test_1.nam w] $ns_ namtrace-all ...

  5. STMP服务器发送邮件,本地可以发送但是服务器一直发送不成功;

    在官网上查看到信息 考虑到部分云服务商封禁了其内网对外 25 端口的访问, xxxxx 端口号: 2525 xxxxx 端口号: 587 然后,我换了一下端口号就行了,浪费了我三个小时时间,贼尴尬:

  6. EasyUI系列学习(四)-Droppable(放置)

    一.创建组件 1.使用标签创建一个放置区 <div id="pox" class="easyui-droppable" style="width ...

  7. Java Controller下兼容xls和xlsx且可识别合并单元格的excel导入功能

    1.工具类,读取单元格数据的时候,如果当前单元格是合并单元格,会自动读取合并单元格的值 package com.shjh.core.util; import java.io.IOException; ...

  8. java_基础知识_字符串练习题_计算两个字符串的最长公共字串长度

    package tek; Java算法——求出两个字符串的最长公共字符串 /** * @Title: 问题:有两个字符串str1和str2,求出两个字符串中最长公共字符串. * @author 匹夫( ...

  9. jQuery文档就绪

    很多jQuery代码都有如下片段: $(document).ready(function(){ //代码 }) 作用就是等文档结构加载完成后再去执行function中的代码,功能类似于window.o ...

  10. Android popupwindow和dialog监听返回键

    使用情况: 在activity中,出现了popupwindow和dialog,这个时候,如果点击返回键,它们消失了,但是一些操作还在继续.如:1.进行耗时操作,出现dialog提醒用户等待,这时,按下 ...