blog | 2016-08-17 go http 服务器编程 1. 初识http 是典型的 C/S 架构,客户端向服务端发送请求(request),服务端做出应答(response)。 golang 的标准库 net/http 提供了 http 编程有关的接口,封装了内部TCP连接和报文解析的复杂琐碎的细节,使用者只需要和 http.request 和 http.ResponseWriter 两个对象交互就行。也就是说,我们只要写一个 handler,请求会通过参数传递进来,而它要做的就是根据请求的数据做处理,把结果写到 Respons ...
blog | 2016-08-02 etcd 使用入门 1. etcd 简介coreos 开发的分布式服务系统,内部采用 raft 协议作为一致性算法。作为服务发现系统,有以下的特点: 简单:安装配置简单,而且提供了 HTTP API 进行交互,使用也很简单 安全:支持 SSL 证书验证 快速:根据官方提供的 benchmark 数据,单实例支持每秒 2k+ 读操作 可靠:采用 raft 算法,实现分布式系统数据的可用性和一致性 在这篇文章编写的时候,etcd 已经发布了 3.0.4 版本,被被用在 CoreOS、kubern ...
blog | 2016-07-16 flannel 源码分析 简介flannel 是为了解决容器的跨主机网络问题而出现的项目,可以提供多种类型的网络模型: 普通网络:udp、vxlan、hostgw 平台网络:gce、aws 使用之前,需要在 etcd 中写入要管理网络的配置,比如 : { "Network": "10.0.0.0/8", "SubnetLen": 20, "SubnetMin": "10.10.0.0& ...
blog | 2016-07-12 kubernetes 简介:kubernetes 架构介绍 什么是 kubernetes?kubernetes (经常被缩写成 k8s)是 google 开源的一套自动化容器管理平台,前身是 Borg,用于容器的部署、自动化调度和集群管理。目前 kubernetes 有以下的特性: 容器的自动化部署 自动化扩展或者缩容 自动化应用/服务升级 容器成组,对外提供服务,支持负载均衡 服务的健康检查,自动重启 因为容器本身就是可移植的,所以 kubernetes 容器集群也能跑在私有云、公有云或者混合云上面。 kubernetes 让应 ...
blog | 2016-06-30 weave 网络模型 简介weave 是 weaveworks 公司核心项目,也是解决 docker 网络问题的。和其他项目比较,weave 提供的功能更多,和其他系统的集成更完善。 weave 不会修改 docker 也有的网络配置,而是添加在容器中添加额外的虚拟网卡来搭建自己的网络。 安装老规矩,下面所有的环境都是在我 mac 笔记本上通过 docker-machine 创建和运行的。 这次我们就创建两台虚拟主机,主机名分别为 weave-1 和 weave-2。请确保你安装的 docker ...
blog | 2016-06-15 flannel 网络模型 简介Flannel 是CoreOS 下面的一个项目,目前被使用在 kubernetes 中,用于解决 docker 容器直接跨主机的通信问题。它的主要思路是:预先留出一个网段,每个主机使用其中一部分,然后每个容器被分配不同的 ip;让所有的容器认为大家在同一个直连的网络,底层通过 UDP/VxLAN 等进行报文的封装和转发。这么说还是会很不清不楚,那么这篇文章就试图解释到底 flannel 是怎么回事,希望读完本文再来看这段话能够明白它的意思。 安装和配置启动主机docker ...
blog | 2016-06-13 docker 跨主机网络:overlay 简介 简介docker 在早前的时候没有考虑跨主机的容器通信,这个特性直到 docker 1.9 才出现。在此之前,如果希望位于不同主机的容器能够通信,一般有几种方法: 使用端口映射:直接把容器的服务端口映射到主机上,主机直接通过映射出来的端口通信 把容器放到主机所在的网段:修改 docker 的 ip 分配网段和主机一致,还要修改主机的网络结构 第三方项目:flannel,weave 或者 pipework 等,这些方案一般都是通过 SDN 搭建 overlay 网络达到容器通 ...
blog | 2016-06-12 docker 容器的网络模式 简介docker 默认提供了四种模式,供容器启动的时候选择:bridge、none、container、host。前一篇文章已经介绍了 bridge 模式,这篇文章就介绍剩下的三种模式,已经它们可能的使用场景。 测试环境说明一下这篇文章中所有测试的基本配置和环境信息: 所有测试都是运行在 Mac 上的 virtualbox 虚拟机中,使用 docker toolbox 管理 docker 主机,使用说明可以参考之前的文章。 Mac OS virtualbox 5.0.20 ...
blog | 2016-06-01 docker 容器默认的网络模型 简介这篇文章介绍我们启动容器的时候,默认情况下 docker 是怎么组织网络,保证容器是可以连通的。 这里将不再介绍 docker 的基础使用,而是默认读者已经熟悉了 docker 各种命令行和概念,能创建、运行、查看容器。 除此之外,还需要有一定的网络基础知识,包括但是不限于: 二层网络和三层网络的区别和作用 ip 命令的使用 linux network namespace 的概念 virtual bridge 的概念 veth pair 的功能 好,下面就让我们开始吧 ...
blog | 2016-05-31 在 mac 系统配置 docker 开发环境 在这篇文章中,我们将介绍如何在 mac 平台下使用 docker toolbox 中提供的工具来运行第一个 docker 容器。 在 Mac 上安装 docker 环境docker 提供了 toolbox 方便 windows 和 mac 下运行容器,主要的功能组件有: docker-machine:管理 docker 主机,支持在 virtualbox、digitalocean、azure、rackspace 等上面直接创建一个安装了 docker 的主机。我们主要使用这 ...
blog | 2016-05-20 Python BaseHTTPServer 介绍 本文针对 python 2.7 版本,介绍了 BaseHTTPServer 这个库的使用方法。 这个库是 python 自带的标准库的一部分,不需要额外安装,在 linux 系统下,位置在 /usr/lib/python2.7/BaseHTTPServer.py。 HTTP 协议HTTP 请求(request)http 请求分为三个部分: 第一行:请求类型、地址和版本号 头部信息:HTTP header 数据部分 标准的 HTTP 请求是: GET / HTTP/1.1 ...
blog | 2016-04-06 docker 镜像介绍 这篇文章主要讲讲 docker 中镜像有关的知识,将涉及到下面几个方面: docker images 命令的使用 docker 和 registry 交互的过程,pull 命令到底做了什么 docker storage driver aufs 的格式和实际的组织结构 Dockerfile 原语和 docker 镜像之间的关系 简介 docker 镜像代表了容器的文件系统里的内容,是容器的基础,镜像一般是通过 Dockerfile 生成的 docker 的镜像是分层的,所 ...
blog | 2016-02-25 nova compute service 启动过程 OS 版本:Ubuntu 12.04 openstack 版本:icehouse 我们知道 nova-compute 服务可以通过: service nova-compute status/start/stop/restart 进行管理,我们可以从 /etc/init/nova-compute.conf 文件看到,背后调用的是 /usr/bin/nova-compute 可执行文件。这个文件的内容比较简单,主要调用 nova.cmd.compute:main 函数运行,我 ...
blog | 2016-02-01 nova scheduler 原理介绍和源码解析 TL;DR 介绍在 openstack 中,scheduler 负责从宿主机(运行 nova-compute 的节点)中根据一系列的算法和参数(CPU 核数,可用 RAM,镜像类型等 )选择出来一个,来部署虚拟机(instance)。openstack 官方网站上这张经典的图可以直观地看到 scheduler 的两个步骤:过滤(filter) + 权重计算(weighting)。 简单来说,过滤就是把不符合条件的宿主机去除掉,权重计算就是把剩下的主机根据某个值排序。如果这个 ...
blog | 2016-01-20 bottle 源码解析 这篇文章不会讲如何使用 bottle,如果感兴趣,直接看它们的官方文档。主要讲讲 web 框架的一些东西,阅读之前最好对下面的这些知识有一定的了解: 熟悉 HTTP 协议 对 python 有一定的了解 知道 wsgi 是干什么的 写过 web 应用 如果不太了解 web 框架,可以阅读我之前的一篇文章:什么是 web 框架?。 简介bottle 是一个极简的 python web 框架,可以用来用来快速搭建 web 应用,并不是开发复杂项目的第一选择,因为它并没有提供配 ...
blog | 2015-12-31 python 描述器简介 什么是 descriptorpython 的描述器是在 python 2.2 版本引入的一个特性,那么我们要搞清楚它添加进来要解决什么样的问题。 有时候,我们希望对对象的属性有更强的控制:比如希望某个值在一定的范围内(比如温度,年龄等),或者希望赋值的时候要是某个类型的值,再比如希望某个值根据另外的属性值动态地调整(表示身体健康状况的属性要根据体温变化)。如果你想到了 python 的 property 装饰器,很好!不过 property 的内部就是用描述器实现的,而且,如 ...
blog | 2015-11-23 python 和消息机制(二):Rabbitmq 概念和使用 rabbitmq 简介Rabbitmq 是 amqp 的 Erlang 实现,也是现在非常流行的一种消息机制。在前面一片文章,我们也提到了消息机制的几个优点: 异步(asynchronous):耗时的工作可以直接丢给消费者,不会阻塞生产者 可扩展(scale):消息机制的工作模式,在理论上可以让无限的消费者接入进来,使得横向扩展变得异常简单 模块化(modulize):生产者和消费者不需要知道双方的存在,而且可以使用不同的语言和框架,在物理上位于不同的地方。 消息机制当然 ...
blog | 2015-10-06 HTTP 断点下载功能实现 缘起最近在家要下载一个比较大的镜像文件,因为网络太差,每次都是下载到中间就停了,文件就下载失败。我用的是 chrome 自带的下载功能,就这样重试了4-5 次,每次都以失败告终。可恨的是,有时候下载到 80% - 90%,失败了还要从头重来。 后来我就想到 wget 命令行,上网搜了一下,发现 wget 是自带断点下载功能的。也就是说,如果中间连接断开,可以直接从已经下载好的地方继续开始。然后,直接使用 wget 搞定了任务。 如果之前已经有了一个下载部分的文件,也可以使用 ...
blog | 2015-10-01 通过 free 命令理解 linux 内存管理 简介linux 下面查看内存状态可以使用 free 命令,但是如果不了解 linux 内存管理机制的话,对输出也会摸不着头脑,这篇文章就说明一下各个数据的意思。 下面是我电脑上虚拟机,直接使用 free 命令的数据结果。 vagrant@precise64:~$ free total used free shared buffers cached Mem: 374256 330952 ...
blog | 2015-09-21 【翻译】什么是 web 框架? 原文地址: http://jeffknupp.com/blog/2014/03/03/what-is-a-web-framework/ Web 应用框架,简称为 web 框架,是编写 web 应用程序的基石。不管简单的博客系统,还是 Ajax 为主的应用,网络上所有的页面都是代码构成的。进来我发现,很多想学习诸如 Flask 或者 Django 等 web 框架的开发者,并不很了解 web 框架是什么,它们的作用和工作原理。这篇文章,我将会讲一下这个通常会被忽略的话题。希望读 ...
blog | 2015-08-30 python metaclass 入门简介 动态类型也是类型python 是一种动态类型语言,换句话说每个变量可以在程序里任何地方改变它的类型。想要获取变量的类型信息,可以使用 type: >>> a = 2 >>> type(a) int >>> a = '1' >>> type(a) str >>> type(str) type >>> type(type) type >&g ...
blog | 2015-08-16 使用 vi 模式操作tmux 屏幕 使用 tmux,配合上 vim,基本上可以告别鼠标。之所以说基本上,是因为要复制 tmux 屏幕上的内容一直还是用鼠标选择,然后 Cmd+C,Cmd+V。 这篇文章就讲讲 Mac 系统上,怎么像 VIM 那样在 tmux 屏幕上移动和选择文字。 配置使用 vim 模式Tmux 支持 vim 模式,这样就可以使用 hjkl 来上下左右移动,w跳一个单词等等。只要在 ~/.tmux.conf 文件加上下面这句配置: setw -g mode-keys vi 把内容自动复制到系统粘 ...
blog | 2015-06-11 python collections 学习教程 python 语言提供了 list,tuple,set,dict四种最常用的数据结构,能够满足绝大多数的需求,但是还有些情形需要更合适的数据结构。python 也提供了这些,放在了 collections 这个库。这篇文章主要介绍 collections 库提供的数据结构,它们的使用场景和简单的例子。 Countercounter 是一种特殊的字典,主要方便用来计数,key 是要计数的 item,value 保存的是个数。 from collections import Co ...
blog | 2015-05-28 python mock 库的使用 注:图片来自参考资料1 为什么需要 mock在写 unittest 的时候,如果系统中有很多外部依赖,我们不需要也不希望把所有的部件都运行一遍。比如,要验证分享到微博的功能,如果每次测试的时候都要真实地把接口调用一遍,不仅效率低,制造很多垃圾数据,还可能因为外部因素导致 unittest 失败。对于有些耗时更久,或者无法简单创建测试环境的系统,真实的测试就显得更不必要。 我们只需要知道代码按照预期执行,并调用了相关的外部接口。还是拿分享到微博这个功能做例子,分享部分的伪代码 ...
程序技术 | 2015-05-13 python 和消息机制(一):消息队列简介 简介消息队列是生产者消费者模型的扩展,主要特点是: 异步:把接受到的任务放到队列里面,以后处理 分布式:消费者/worker 可以方便地横向扩展 关于消息队列,这篇文章有详细的介绍。 这个系列的文章主要介绍 python 消息队列的有关知识,会讲到下面几个概念: amqp: Adcanced Message Queue Protocol,官网在这。 rabbitmq: Erlang 语言的amqp 协议实现 pyamqp:python message queue 的客户 ...
随笔感想 | 2015-04-19 love story in a python function 一直被拒型def my_love_story(): for girl in every_girl_I_liked: response = declare_love(girl) if response != "NO": raise RunTimeError("There must be something wrong with the girl.&quo ...
程序技术 | 2015-04-12 编写自己的 tftp 客户端(1) tftp 协议一般用来 PXE 协议中传输文件,因为协议内容比较简单,所以非常容易实现。关于 tftp 的详细信息,可以参考维基百科或者 RFC 1350。 这是两篇文章的第一篇,主要是 tftp 理论知识,第二篇是 python 实现的技术和细节还有具体程序的说明。 下面我会简单介绍 tftp 协议的主要内容,为后面编写 tftp client 和 server 做好准备。 tftp 发送流程 client 端向 server 端 69 端口发送 RRQ(读请求)或者 WR ...
程序技术 | 2015-03-29 socket 编程基础知识 这篇文章介绍了网络的基本概念,socket 编程的基础知识和 C 语言提供的 socket 库使用。 本文只考虑 ipv4,不考虑 ipv6。 只考虑网络上 AF_INET socket 类型,不考虑 UNIX 域协议以及其他类型。 TL;DR 概念什么是 socket计算机里面最令人烦的就是这些名词,它们都很抽象,而且解释起来就和没有解释差不多。socket 就是这样的一个概念,不过我还是要试着说明一下。 简单来说,socket 是对底层网络通信的一层抽象,让程序员可以 ...
程序技术 | 2015-03-24 salt api 配置和使用 ##准备工作 安装salt 使用 CherryPy 来实现 restful 的 api,供外部的程序调用。 根据官方的文档配置 salt repo: http://ppa.launchpad.net/saltstack/salt/ubuntu/ 然后使用命令 sudo apt-get update && sudo apt-get install salt-api -y 安装 salt-api。 添加用户salt-api 使用 eauth 验证系统(使用api所 ...