本文将试图以CloudFoundry中的消息组件NATS为主要线索,以在CF中广泛使用的并发和网络编程框架EventMachine为侧重,来串联整个CF主线功能的工作原理,力求能用简单直接的方式描述出较多的架构细节和系统设计。
需要准备的知识:
EventMachine(EM)的基础知识和使用方法,可以参考不久前的介绍:Research on EventMachine
关于NATS源码级别的介绍,可以参考我们之前的这篇文章:Research on NATS
一、以NATS为线索部署CloudFoundry的更多细节
我们之前曾写过一系列的基于dev_setup的安装与部署文章:
Part 1、单节点安装:
http://blog.csdn.net/resouer/article/details/7939952
Part 2、基于Iaas进行多节点部署:
http://blog.csdn.net/resouer/article/details/8010756
在上述文章的描述中,我们其实已经可以看到NATS在我们部署CF时所扮演的关键角色。没错,是否跟NATS沟通顺畅,也是我们检验各个组件正常工作的重要标准之一。所以,我们在这里着重解决两个问题:
1、如何以模板为基础安装CF集群?
2、如何为这个集群实现LB和Custom Domain?
回忆一下我们之前的工作步骤:
- 先按照Step A安装单节点CF的VM
- 使用该VM做模板,克隆出所需数目的VM
- 用NATS把每一个安装了完整CF的VM连接起来
- 进行一些其他配置
- 分别启动所需的组件
好了,在上面文章的基础上,我们这次提供一个更加清晰的部署策略:(后面的版本组件会不断增加,但是这里的思想是确定的)
Nginx Load Balancer:使用Nginx为Router做负载均衡,绑定LB到*yourdomain.com
Router:作为LB的server,3个节点
Cloud Controller:2个节点,共享文件系统和配置数据库
Health Manager:与CC共用2节点
DEA:3个节点,数量根据应用不同而不同,一般根据资源需求动态添加
Service Gateway:1个节点,不支持集群,一种服务需要一个Gateway
Service Node:2个节点,根据需求可动态添加,一般一种服务1~2个节点
NATS:轻量级不支持集群,只能在单节点上
其他:服务工具类组件,打包组件,用户控制组件各1-2节点(图中未画出,具体类似于service_lifecycle的各个节点)
![](https://img-my.csdn.net/uploads/201210/19/1350657136_3174.png)
接下我们需要到这些节点中做下面的简单工作:
1、login到每个VM中,比如CloudController
2、找到./devbox/config/cloud_controller.yml中nats://nats:nats@172.17.4.219:
3、修改该IP为NATS的IP,
4、对其它的node做这项工作,然后启动该节点上需要的那几个组件即可(../vcap_dev start xxx xxx ...)
然后是一些额外的配置工作,包括:
1、配置CC的external_url,以及CC和HM的共享文件和数据库(参见Part 2里的说明以及 Step 5. Other things TODO部分)
2、多个service node的编号
3、单独启动nats节点上的nats-server服务
4、Custom Domain、Muti-router与Nginx LB的配置
需要重点补充下4 的操作。在Part 2 里我们提到过:在你的IaaS层的网络功能里把*.yourdomain.com绑定到这个LB上。这样所有对该URL的访问会首先经过该LB(当然该LB也可以是个Nginx集群)。
而在前面的额外配置中,api.yourdomain.com已经分配给CC了。其实CloudFoundry之所以能解析api.yourdomain.com到你的CC,靠的是Router的路由功能,这在后面的原理部分会详细说明。
所以,当你执行vmc targert api.yourdomain.com时,你的request实际上是这样转发的:
vmc target api.yourdomain.com -> LB -> LB选择某一个Router -> Router选择某一个CloudController
二、以NATS和EM为主线的CloudFoundry源码导读
1、NATS
这里我们关注的问题有两个:
1、NATS客户端的生命周期与组件的运行关系如何?
2、NATS是否负责处理CF中所有管理类消息的中转?
首先强烈学习官方的README:https://github.com/derekcollison/nats
阅读源码的话,请重点关注server,connection,sublist这几个部分,动手实验的时候使用nats-server -c "your_config_file"来用自己新写的配置文件启动nats server。具体的参数表在这里:
https://github.com/derekcollison/nats/blob/master/lib/nats/server/options.rb#L10
NATS作为CF的神经网络,负责者组件之间的通讯和交互工作: