Cloud Foundry新版router源码分析

Spring-Cloud-Gateway源码分析系列 | Spring-Cloud-Gateway之Route初始化加载 推荐 Spring Boot/Cloud 视频: Java 微服务实践 - Spring Boot Java 微服务实践 - Spring Cloud Spring-Cloud-Gateway路由信息是通过路由定位器RouteLocator加载以及初始化的接下来阅读源码看下Spring-Cloud-Gateway是怎么一步一步的实现了路由的加载初始化。 首选我们还是在Spring-Cloud-... 阅读详情

调整格式太费力了,这里直接粘帖过来了,原文我写在自己的博客上了:http://lory-yang.com/2012/08/06/cloud_foundry_router/。

Cloud Foundry在几个月前改进了它的router,我们可以在新版cloudfoundry解密中看到它的介绍:

上个版本中。Router作为一个nginx脚本存在。所以的请求都必须经过Ruby代码,然后加以转发。这个设计干净利落,不过Ruby也因此转发了大量的数据,容易引起性能问题,所以下个版本中做了如下的改进。

新版CloudFoundry揭秘

   在新版本的设计中,他们使用Lua脚本来代替原先的Ruby脚本。而Lua脚本会对请求加以分析,转发给Ruby程序,然后Ruby程序再将分析的结果返回。这样一来,proxied request已经不再经过Ruby代码。逻辑和数据完美分离。性能和稳定性都大幅提高了。

  在前版设计中,当Router接收到请求后,会随机分配一个Droplet来处理这个请求,这种方式使得用户没有办法使用Session,因为连续的HTTP请求会被分发到不同的应用实例上处理。新版本设计中增加了对SESSION的支持,当Router发现用户的请求中带了cookie信息,它会在Cookie里暗藏一个Droplet的host,port地址。当有新的请求进来,Router通过解析Cookie得到上次的应用实例,然后尽量转发到同一台Droplet上。

那么本文就在此基础上,依据源码来做更加详细的分析。

Router工程

Router有一个独立的app目录,在vcap下面的router文件夹下。我们只需要关注两个部分:ext和lib。ext中有两个lua脚本,而lib中是ruby文件。

Nginx通过lua脚本发送lookup请求

总的来讲,Nginx通过lua脚本把lookup请求发送给由ruby代码建立的http server(这个server叫做uls server,也就是上图中的upstream locator svc),获取用户请求所指向的node的ip。那么本节主要研究Nginx如何通过lua发送这个lookup消息。

Nginx使用lua脚本是通过它的配置文件实现的。这个文件一般在:~/cloudfoundry/.deployments/devbox/deploy/nginx/nginx-0.8.54/conf/nginx.conf。我们可以看一下这个文件的内容,如果没有安装过,可以在vcap的源码的/dev_box/cookbooks/nginx/templates/defaults/ubuntu-nginx.conf.erb文件看。这个erb文件就是在chef安装cf时,填入参数,然后放到上述的conf目录下的。

那么这个文件的主要内容是:

access_by_lua '
-- add package.path andpackage.cpath
 package.path = package.path..";/root/cloudfoundry/.deployments/devbox/deploy/lua/lua-5.1.4/lib/lua/5.1/?.lua"
 package.cpath = package.cpath..";/root/cloudfoundry/.deployments/devbox/deploy/lua/lua-5.1.4/lib/lua/5.1/?.so"
 local uls = require ("uls")
 
ngx.log(ngx.DEBUG,"monitor trigger stats syncup")
 
local req = uls.generate_stats_request()
 
-- generate one subrequest to uls to update stats
 ngx.location.capture(
 "/vcapuls", { body = req }
 )
 ';

access_by_lua就是Nginx调用lua脚本来发送请求的配置,可以看 http://wiki.nginx.org/HttpLuaModule#access_by_lua 学习。那么在这个代码块中,首先把lua配置好了,包括lua文件,在package.path的路径中,就是上文提到的两个lua脚本。然后local req = uls.generate_stats_request()这行代码,其实是调用lua脚本中的一个函数,产生http request。这个函数可以在uls.lua文件中找到。

至此已经基本清楚了:Nginx配置好了lua,然后调用lua产生http request,然后Nginx将这个request发送给server。其他就不详细了,具体可以自己看代码

sticky session

新版本支持sticky session,这部分可以参考lua脚本:uls.lua,其中有函数专门解析request中的session,然后将这个信息加入到lookup request中,那么ruby在回应的时候会将其考虑在内。具体可以自己看代码。

请求的格式

这里码一下这个请求的格式,这段文字在uls.lua文件中:

Message between nginx and uls (as http body)
 nginx -> uls
 {
 "host": api.vcap.me,
 "backend_addr": 10.117.9.178:9022,
 "stats": [
 {
 "request_tags": xxx,
 "response_latency": xxx,
 "response_samples": xxx,
 "response_codes": {
 {"responses_xxx":xxx},
 {"responses_2xx":xxx}
 }
 },
 {
 "request_tags": xxx,
 "response_latency": xxx,
 "response_samples": xxx,
 "response_codes": {
 {"responses_xxx":xxx},
 {"responses_2xx":xxx}
 {"responses_5xx":xxx},
 }
 }
 ]
 }
 
nginx <- uls{
 "backend_addr": xxx,
 "request_tags": xxx,
 "router_ip": xxx
 }


第一部分是Nginx发出的请求格式,包括了host,tag,host就是用户发来的需要访问的url,而tag则是加密之后的参数。一个实际的例子:

1
{"host":"api.vcap.me","stats":[{"response_latency":0,"request_tags":"BAh7BjoOY29tcG9uZW50SSIUQ2xvdWRDb250cm9sbGVyBjoGRVQ=","response_codes":{"responses_2xx":1},"response_samples":1}]}

第二部分则是返回的response,包括了转发的ip以及tag。

Ruby端http server

现在的ruby文件主要负责建立一个http server供lua脚本查询ip,那么在router工程的lib文件中主要是/router/router_uls_server.rb文件。这个文件基于sinatra建立了一个server,而这个server在router.rb文件中被启动。而其他ruby则负责从NATS拿到其他组件的register信息,然后更新自己的router表。这部分也不是太难懂,就不展开了。

CloudFoundry开源云计算平台简介.rar CloudFoundry开源云计算平台简介rar,提供“CloudFoundry开源云计算平台简介”免费资料下载,主要包括Cloud Foundry的概述、Cloud Foundry的架构、使用Cloud Foundry部署应用等内容,可供学习使用。 立即下载

相关推荐

Chapter2、HDR流水线

HDR内容的获取(不同曝光时间的图片合成) 相机响应函数 HDR视频

qq_55621259的博客 2597

【Cloud Foundry】Could Foundry学习(三)——Router

在阅读的过程中有不论什么问题。欢迎一起交流 邮箱:1494713801@qq.com    QQ:1494713801     一、概述         Router组件在Cloud Foundry中是对全部进来的Request进行路由。         进入Router的request主要有两类:首先是来自VMCClient或者STS的管理型指令,这类request...

weixin_34326179的博客 196

支付漏洞防护绕过的一种方式

放完包后就到了提交订单的地方,可以发现,金额确实小了很多,合理的搭配的话还可以更低,再次前进可以发现,金额确实是这么多,后面就不支付了,到此就结束了。也就是说数量可以为负数,但是金额不能为0或者0以下,有什么方法可以绕过这个限制吗,其实并不难,既然可以为负数,只是对金额不能为0或者负数做了限制。我们可以尝试拼接法,利用负数加上正数让他的值变得很低,但是又大于0就可以了,这里利用购物车的结算方法,随机加一些在购物车里。这里为了方便查看数据包,我这边商品的数量选择3,点击立即购买并抓包。

2301_80115097的博客 1528

CloudFoundry源码分析:Router

Router的实现主要由两部分组成: 一个是lib/router/router.rb,主要作用和nats服务器交互,管理router表。一个是lib/router/router_uls_server.rb,主要是处理各种外部请求。 Router Router(lib/router/router.rb)主要通过注册事件和nats服务器交互,处理其他模块发布的信息,并统计一些运行信息。 rout

Tony的专栏 1300

AI驱动的iOS逆向工程自动化:14阶段工作流与Ghidra集成实践

逆向工程是软件安全分析的核心技术,通过反汇编、调试等手段解析程序内部逻辑与数据流。其原理在于将编译后的二进制代码还原为可理解的逻辑结构,从而发现潜在漏洞或理解软件行为。在移动安全领域,iOS逆向工程具有重要技术价值,能够用于安全审计、漏洞挖掘与恶意软件分析。传统iOS逆向依赖ipsw、class-dump、Frida等工具链组合,存在学习曲线陡峭与流程碎片化问题。本文介绍的ios-reverse-skills项目创新性地将14阶段逆向工程方法论封装为AI可调用的标准化脚本集,通过Ghidra脚本实现Swif

weixin_27268733的博客 432

腾讯ACE反作弊系统:内核驱动与AI行为分析如何守护游戏公平

在游戏安全领域,反作弊技术是保障公平竞技环境的核心防线。其基本原理是通过监控系统关键行为,识别并阻断非法的第三方程序干预。从技术实现看,现代反作弊方案普遍采用分层防御架构,结合用户态模块进行应用层检测,并依赖内核态驱动实现底层深度监控,以此构建纵深防御体系。这种技术的核心价值在于,它能有效对抗从简单内存修改到高级驱动级作弊等多种威胁,维护游戏经济系统和玩家体验的完整性。随着作弊手段的演进,行为分析与AI赋能变得至关重要,系统通过机器学习模型分析进程行为序列的异常模式,即使面对未知特征的外挂变种也能进行有效识

weixin_33978578的博客 742

cloud foundry之router源码分析

前面的文章已经介绍了整个cloud foundry的源码的启动过程,这篇文章介绍一下router方面的细节,毕竟外界访问cloud foundry的入口就是router。。 首先来看router的启动:/home/fjs/cloudfoundry/vcap/router/bin/router -c /home/fjs/cloudfoundry/.deployments/devbox/config

fjs的专栏 2118

核密度估计及其Python实践

一、参数估计简介 很多情况下,我们只有有限的样本集,而类条件概率密度函数p(x|ωi)和先验概率P(ωi)是未知的,需要根据已有样本进行参数估计,然后将估计值当作真实值来使用。 由给定样本集求解随机变量的分布密度函数问题是统计机器学习和概率统计学的基本问题之一。解决该问题的方法包括参数估计和非参数估计两大类: 1.参数估计方法 已知概率密度函数的形式而函数的有关参数未知,通过估计参数来估计概率密度函数的方法。有两种主要参数估计法:确定性参数估计方法是把参数看作确定而未知的, 典型方法为最大似然估计。随机参数

袁易学的博客(Yuan Yixue's Blog) 1万+

Cloud Foundry 源码解析一览(warden)

warden是其核心部分的资源管理容器,完成了各种资源分配的事情。 代码位置在:https://github.com/cloudfoundry/warden 这一部分也是我最想了解细节的地方,因为在一个paas平台中,资源的隔离才是最有价值的部分。 基础知识 rv= unshare(CLONE_NEWNS); unshare这个调用,可以把挂载的文件系统设置成只在新的挂载命名空间(mou

kent45的专栏 1687

Unity大世界流式加载:工业级架构与优化秘籍

游戏大厂Unity大世界流式加载框架全景解析:从《原神》《和平精英》等标杆案例出发,深入剖析工业级流式加载的完整技术架构。文章系统介绍了大世界分区块管理、异步加载机制、资源优化策略、多平台适配方案,以及业务联动与团队协作流程。重点阐述了Addressable与AssetBundle应用、空间触发器设计、性能自适应等核心技术,并展望AI预测加载、云游戏等未来方向。全面展现了大厂如何通过流式加载技术实现无缝开放世界体验的技术路径与实践经验。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 607

6、SAP HANA 建模全解析

本文全面解析了 SAP HANA 建模的核心内容,包括属性视图、分析视图和计算视图的创建与使用。文章详细介绍了建模工具的安装、不同视图类型的适用场景及操作步骤,并通过对比和案例分析帮助读者更好地理解建模流程。此外,还涵盖了建模过程中的注意事项及性能优化建议,为 SAP HANA 用户提供实用的建模指导。

juice的博客 203

cloudfoundry之router源码分析

cloud foundry之router源码分析 1      router目录结构 2      router组件的启动 每个组件启动都需要经过下列命令 exec_cmd("#{ruby_binary} #{vcap_launch} #{command} #{vcap_components["components"].join(" ")} -c #{deployment_conf

ximenghappy的专栏 3527

Vue - 详细完美解决 ElementUI MessageBox “多次“ 弹框问题,让其无论执行多少次都只弹出来一次(常见于请求拦截器多次触发弹框,导致弹出来很多个)详细示例代码,保证完美解决!

vue如何防止ElementUIMessageBox多次弹框,vueelement弹框弹出来很多次怎么办,elementvueMessageBox解决执行多次后出现多次弹框的问题,elementUI如何阻止MessageBox多次弹出来,vue+element解决多个请求同时报错,弹出多个消息框message,饿了么组件库MessageBox弹框频繁弹出解决方法,vue调用MessageBox出现多次弹框,vueelementMessageBox怎么只弹出一次,vue之axios请求

🏆 前端领域优质创作者 8196

Cloud Foundry中collector组件的源码分析

在Cloud Foundry中有一个叫collector的组件,该组件的功能是通过消息总线发现在Cloud Foundry中注册过的各个组件的信息,然后通过varz和healthz接口来查询它们的信息,最后再将各个组件收集过来的数据发送到指定的存储位置。 本文从collector的功能出发,主要讲述以上三个功能的源码实现。

木精灵的技术博客 3424

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Cloud Foundry中gorouter源码分析

         在Cloud Foundry v1版本中,router作为路由节点,转发所有进入Cloud Foundry的请求。由于开发语言为ruby,故router接受并处理并发请求的能力受到语言层的限制。虽然在v1版本中,router曾经有过一定的优化,采用lua脚本代替原先的ruby脚本,由lua来分析请求,使得一部分请求不再经过ruby代码,而直接去DEA访问应用,但是,一旦ro

rznice的专栏 1977

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Cloud Foundry技术全貌及核心组件分析

本文在从架构组成、核心模块功能、源代码分析等角度来全面剖析Cloud Foundry,同时会结合各行业的典型案例来讲解Cloud Foudry在具体应用场景中的表现。 架构设计及核心组件 从总体上看,Cloud Foundry的架构如图1所示。 图1 Cloud Foundry架构图 经过一年多的发展,Cloud Foundry的组件增加了很多。但核...

weixin_33709219的博客 362

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

CloudFoundry组件之间通信NATS MESSAGES

Cloud Foundry是业界领先的开源PaaS平台,它的内核采用Ruby开发。设计上使用以NATS消息系统为核心的松耦合组件架构,强调以NATS消息系统为核心的松耦合组件架构所带来的弹性。 NATS 一个轻量级的 发布-订阅, 分布式队列消息系统,基于EventMachine开发。 本文重点将列出CF系统中,都有哪些 "NATS MESSAGES",并且对其功能做简单介绍。

restkuan的专栏 1660

CloudFoundry源码分析:DEA

DEA(Droplet Execution Agent),主要流程都在agent.rb文件中实现。 由于CloudFoundry平台是以NATS为中心的,只要弄清楚了这个组件能够处理的NATS消息,也就清楚了这个组件的基本流程。DEA也不例外。 Agent主要注册了以下几种事件,下面分别介绍这些方法的实现流程 。 NATS.subscribe('dea.s

Tony的专栏 1461

Spring Cloud GateWay源码解析实战 - RoutePredicateHandlerMapping

package org.springframework.cloud.gateway.handler; import java.util.function.Function; import reactor.core.publisher.Mono; import org.springframework.cloud.gateway.config.GlobalCorsProperties; imp...

JavaEdge全是干货的技术号 2982

开发者的福利:Cloud Foundry

Cloud Foundry是一个流行的开源平台即服务(PaaS)。Cloud Foundry可以在您自己的部署基础架构上使用,也可以在腾讯云 Web服务,VMware或vSphere等任何IaaS(Infrastructure as a Service)上使用 。它可以使用BOSH部署系统进行部署 。Cloud Foundry提供了一个可轻松运行,扩展和维护应用程序的环境。Cloud Foundr...

5472

CloudFoundry源代码学习笔记之Health Manager

Health Manage是开源CloudFoundry的重要组件之一,其最终目标:智能监控,确保App运行良好,不用运维。 本文将为你揭开HM神秘的面纱,作者希望你能够通过本文,减少阅读HM源代码的难度。重点部分已加星( * ) - bin/   bulk_util.rb     打印测试样例 bulk 中每个droplet的基本信息   dea_tenancy.rb (与NA

restkuan的专栏 2000

Cloud foundry基础

Cloud Foundry 组件概述路由Router认证OAuth2 Server UAA 和 Login Server应用生命周期Cloud Controller 和 Diego BrainnsyncBBS 和 Cell Reps应用存储和执行BlobstoreDiego Cell服务Service Brokers通信Consul 和 BBS指标和日志LoggregatorMetrics Col...

赵英超的博客 7692

Cloudfoundry中查看router中所有路由信息

我们知道在CloudFoundry中,router是入口,那么它就要保存所有的域名和ip的对应关系,如何查看各个app和内部组件的真实ip:port呢?   登陆部署gorouter的机器,netstat -ant | grep 8082,gorouter默认会启动8082和80端口,如果你之前修改过就grep你修改之后的端口,看到8082在监听了吧,e.g. 127.0.0.1:8082,...

By Ulric Qin 497

cloud foundry源码启动(1)

新学期开始了,又要开始搞cloud foundry了。。。首先从cloud foundry源码的启动过程搞起: cloud foundry的启动入口文件是vcap_dev文件,它的主要作用的就是初始化一些基本的参数,最后则是由vcap文件来真正的启动cloud foundry的各个部分。 好了,我们就来分析vcap_dev文件的执行过程吧(这里用的各项都是默认的参数): options["n

fjs的专栏 1705
上一篇: cloud foundry 默认文件路径列表
下一篇: ruby 寻找类所在的文件
Lory_yang
博客等级 码龄18年 48粉丝 69原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值