上次学习了Nova创建虚拟机的过程,这次来看一下Glance是如何创建镜像的。相比于Nova,Glance源码使用了大量的代理模式和装饰器模式,阅读代码时候一个不仔细就会一脸懵X。根据上次说的Openstack套路,我们通过setup.cfg直奔主题——glance/cmd/api.py:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
def main():
try:
config.parse_args()
config.set_config_defaults()
wsgi.set_eventlet_hub()
logging.setup(CONF, 'glance')
notifier.set_defaults()
if cfg.CONF.profiler.enabled:
_notifier = osprofiler.notifier.create("Messaging",
oslo_messaging, {},
notifier.get_transport(),
"glance", "api",
cfg.CONF.bind_host)
osprofiler.notifier.set(_notifier)
osprofiler.web.enable(cfg.CONF.profiler.hmac_keys)
else:
osprofiler.web.disable()
server = wsgi.Server(initialize_glance_store=True)
server.start(config.load_paste_app('glance-api'), default_port=9292)
server.wait()
except KNOWN_EXCEPTIONS as e:
print(e)
fail(e)
阅读全文

作为已经比较成熟的IAAS开源解决方案,OpenStack已经发布了19个版本,目前稳定版是Stein,并且下一个版本Train也预计在10月发布。可以说,从代码架构角度来说对于初学者来说已经略微复杂,但最核心的组件有以下几个:

  1. Nova:负责虚拟机相关。
  2. Glance:负责镜像相关。
  3. Cinder:负责存储相关。
  4. Neutron:负责网络相关。
  5. Keystone:负责鉴权以及服务注册。

大体架构如下图:

all.png

阅读全文

能看到这篇文章的小伙伴肯定已经知道什么是Scrapy以及Scrapy-Redis了,基础概念这里就不再介绍。默认情况下Scrapy-Redis是发送GET请求获取数据的,对于某些使用POST请求的情况需要重写make_request_from_data函数即可,但奇怪的是居然没在网上搜到简洁明了的答案,或许是太简单了?

这里我以httpbin.org这个网站为例,首先在settings.py中添加所需配置,这里需要根据实际情况进行修改:

1
2
3
4
5
SCHEDULER = "scrapy_redis.scheduler.Scheduler"  #启用Redis调度存储请求队列
SCHEDULER_PERSIST = True #不清除Redis队列、这样可以暂停/恢复 爬取
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter" #确保所有的爬虫通过Redis去重
SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.SpiderPriorityQueue'
REDIS_URL = "redis://127.0.0.1:6379"

阅读全文

原文,文章作者也是《Hands-On Dependency Injection in Go》的作者,向原作者表示感谢。


你是否曾经由于添加某个新功能却导致另一个功能出问题?修复好这个,另一个又出问题,就好象打地鼠一般。

你是否曾经花费大量的时间调试Bug,最后却发现问题潜伏在另一个、甚至毫不相关的模块中?

这些问题都是由于高耦合引起的。

在这篇文章中,我们来使用解偶的方式来让代码更加易于理解、维护、测试。

阅读全文

go get命令使用socket代理

发布在 Golang

由于某些不可描述的原因,国内使用go get命令安装某些包的时候会超时导致失败,比如net包、sys包、tools包等。第一种解决办法就是自己从git上下载后添加链接到GOPATH中,比如:

1
2
3
4
5
6
7
8
9
git clone https://github.com/golang/net.git $GOPATH/src/github.com/golang/net

git clone https://github.com/golang/sys.git $GOPATH/src/github.com/golang/sys

git clone https://github.com/golang/tools.git $GOPATH/src/github.com/golang/tools

ln -s $GOPATH/src/github.com/golang $GOPATH/src/golang.org/

cd $GOPATH/src/golang.org/ && mv golang x

阅读全文

IPFS初窥3

发布在 区块链

上一篇文章中记录到了IPFS的BitSwap协议,今天接着往下看关于Object的部分。

Merkle DAG

Merkle DAG是IPFS核心概念之一,在Git的数据结构上进行了改造。理解Merkle DAG之前先来了解下Merkle Tree

阅读全文

IPFS初窥2

发布在 区块链

上一篇文章中初步介绍了IPFS的基本概念和使用方法,今天更深入一些了解IPFS的设计理念。

根据 第三版 白皮书,IPFS体系可以分为7层:

  1. 身份:负责节点的身份生成和认证。
  2. 网络:负责节点间的网络连接,可以配置使用各种网络协议。
  3. 路由:维护路由信息来找出特定的节点和对象。默认使用DHT,可以替换。
  4. 交换:一个新型的块交换协议(BitSwap)来高效管理块分发。有点类似超市,对数据复制有激励。交易策略可以替换。
  5. 对象:带有链接的、内容寻址的不可变对象组成的Merkle DAG,可以代表任意数据结构。比如文件层级和通信系统。
  6. 文件:受到Git启发的版本控制文件层级系统。
  7. 命名:自验证的可变命名系统。
阅读全文

IPFS初窥

发布在 区块链

虽然区块链有很多令人兴奋的特性,但是也有其固有的缺点。比如,文件或者长度较长的文本信息就不适合存储在链上。那么如何解决这个缺点呢?一个解决方案就是IPFS(Interplanetary File System)——星际文件系统。

本文作为简介篇不打算涉及网络及数据结构相关知识(比如什么是协议、什么是树、什么是图……),不过我相信各位看官既然能找到本文网络基础应该不是问题。

阅读全文

墨卡托坐标转经纬度

发布在 Golang

今天获取百度地图数据时候发现其坐标都是类似12945050.96,4826978.52这种而非常见的经纬度,之前获取百度外面商家信息时就发现了这个问题但没深入研究,搜索后发现这种表示方法叫做墨卡托坐标。不得不说,关于坐标的标准还真是挺多的,根据经纬度查询位置可以使用这个网站

阅读全文
作者的图片

Roy

君以国士待我,我必以国士报君。


野生程序猿


China