所有希望进入CF的外部请求,都要经过router的分析处理,配合nginx完成各种情况下的转发工作。
如何与外界(nginx, NATS)通信?答: 通过 /tmp/router.sock, 4222端口
- ext/
nginx/
对nginx的扩展有两文件
1. tablesave.lua --> 路由表的 '存储' 与 '加载'
有3种方式存储 [以字符串;临时文件;命名文件]
有2种方式加载 (返回 tables[1])
2. uls.lua
实现nginx 与 uls(Upstream Locator Server) 的交互。
对每一次request, 都要计算其 stats;
如果上面的 stats 没有同步,则将没同步stats存储到tablesave.lua提到的表里
第一次请求nginx时会生成对应的cookie,将cookie存储到tablesave.lua提到的表里
请求方式一: 从stats 表中转换后 -- 请求
请求方式二:从ngx里转换 & 从stats 表中转换 -- 请求
- router/
router.rb
监听router.register, router.unregister -- 对应分别执行下面将要提到的注册droplet, 注销droplet
每隔一段时间:计算rps( Grab top 5 clients responsible for the traffic),检查已注册的urls, 恢复active_apps(有的apps可能跑飞成了flushing_apps)
还有这几个方法,具体怎么实现,请查看源代码 ~_~
(下面这几个方法, 在Sinatra程序中, 访问'/'时会用到)
生成基于session的cookie;加密基于session的cookie;得到基于session的cookie;--> OpenSSL::Cipher::Cipher; Marshal加密
查找droplet --> 从数组droplets[]中取元素
注销droplet --> 传参('地址'),删除地址,更新varz
router_uls_server.rb
Sinatra程序,当访问到 '/' 时,会[更新uls统计信息;检查原droplet; 更新droplet统计信息] 等等。
----
lib/router.rb -->
配置[config_path, config_file, port, inet] NATS等;
解析options;
socket, NATS通信相关,nginx读写权限等
Router.server, Router.local_server = Thin::Server.new (启动上面的Sinatra程序!)
自注册成为VCAP::Component(设置好varz[..]啊!)
NATS.publish('router.start', @hello_message) -- 启动成功/每隔一段时间, 通知其监听
----
简单小结:
router 由两部分组成
一. nginx 相关部分
重点:router_uls_server.lua -- 这一部分与nginx,uls(Upstream Locator Server)有关。
我对这一部分仍然吃不透,不好多说。
好在这部分代码量很少,而且在其它地方也没有调用到。
如果你比较熟悉,欢迎和我交流。反之,你和我一样不太清楚,我相信也不会对CF学习/开发造成很大影响。
二. router 本身
重点:router/router.rb 里的几个方法,还有就是Sinatra程序。
Sinatra程序里面的几个方法,你要自己去阅读理解。
lib/router/router.rb 里的代码,大多数是和 droplet 有关(比如: register_droplet, unregister_droplet ),还有就是有几个方法在Sinatra程序里也有用到。
lib/router.rb 这是整个router的入口,阅读"router本身"源代码时_强烈建议_先它入手,一步步跟踪程序怎么运行。对你会非常有帮助!
上面说了这么多,我们回头看看: router组件核心部分就是这么3,4个文件,搞懂它基本上就OK了。
哦,,,我是故意忘了测试?!