CloudFoundry源代码学习笔记之router

CloudFoundry 的外部请求路由主要通过 router 进行处理,它结合 nginx 完成转发工作。router 主要包含 nginx 配置与自身两部分。重点在于 router_uls_server.lua 和 router/router.rb 文件,尤其是Sinatra程序中的方法。了解 router 对 CF 学习与开发至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

所有希望进入CF的外部请求,都要经过router的分析处理,配合nginx完成各种情况下的转发工作。


- config.yml
  如何与外界(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 --> droplets << 元数据('地址', app_id, tags); 刷新active_apps

      注销droplet --> 传参('地址'),删除地址,更新varz


      添加tag_metrics; 添加active_app; 刷新active_apps

    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了。

哦,,,我是故意忘了测试?!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值