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. P3258 [JLOI2014]松鼠的新家 树链剖分

    这个题就是一道树剖板子题,就是每走一步就把所有的经过点加一就行了.还有,我的树剖板子没问题!!!谁知道为什么板子T3个点!我不管了!反正这道题正常写A了. 题干: 题目描述 松鼠的新家是一棵树,前几天 ...

  2. JSP-Runoob:JSP 点击量统计

    ylbtech-JSP-Runoob:JSP 点击量统计 1.返回顶部 1. JSP 点击量统计 有时候我们需要知道某个页面被访问的次数,这时我们就需要在页面上添加页面统计器,页面访问的统计一般在用户 ...

  3. Nginx网站用Let’sEncrypt证书开HTTPS

  4. 浅谈IO优化

    三层结构 磁盘(存储).VM(卷管理)和文件系统.专有名词不好理解,打个比方说:磁盘就相当于一块待用的空地:LVM相当于空地上的围墙(把空地划分成多个部分):文件系统则相当于每块空地上建的楼房(决定了 ...

  5. B. Mashmokh and ACM(dp)

    http://codeforces.com/problemset/problem/414/B B. Mashmokh and ACM time limit per test 1 second memo ...

  6. NS2学习笔记(五)

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

  7. viewDidUnload,viewDidLoad,viewWillAppear,viewWillDisappear的作用以及区别

    viewDidLoad:在视图加载后被调用 viewWillAppear:视图即将可见时调用.默认情况下不执行任何操作 viewDidAppear: 视图已完全过渡到屏幕上时调用 viewWillDi ...

  8. Spring-Security-OAuth2微信网页授权

    @Controller public class Controller1 { @Autowired private OAuth2ClientContext context; @Bean @Scope( ...

  9. Educational Codeforces Round 42 (Rated for Div. 2)

    A. Equator(模拟) 找权值的中位数,直接模拟.. 代码写的好丑qwq.. #include<cstdio> #include<cstring> #include< ...

  10. node 第三方包学习

    时间格式化 moment var moment = require('moment'); moment().format();