CloudFoundry中gorouter深入解读

导读

首先,所谓的深入解读比较标题党了哈:)只是给大家分享一下我的理解,希望共同进步

我们以一个问题开篇,主要介绍代码结构、接口交互、主要逻辑,最后稍微总结一下,希望能把你讲明白:)

 

背景问题

思考这么一个问题:paas是多租户的,每个app都希望有自己的域名,比如miui.com、miliao.com、xiaomi.com,为了提高可用性,每个app一般都会有多个instance。OK,想象一下,一个http request过来了,请求的是miui.com(至于怎么过来的CloudFoundry是不管的,自己可以做个cname之类的),CloudFoundry应该如何处理呢?

 

  • 针对这个域名的请求最终应该打到某个instance上,so,应该有个地方来保存路由信息,可不能让miui.com的请求打到miliao.com的instance上去
  • 既然有个路由表,那某个instance挂掉的时候或者扩容新增instance的时候,希望能够动态更新这个路由表
  • http协议本身是无状态的,如果一会请求instance a,一会请求instance b,就会存在session一致性问题,我们可以用一个简单的策略解决,达到这样的效果:上次这个用户请求打到哪个instance我们记录下来,下次仍使其打到这个instance上;第一次请求就随便喽,不过要有负载均衡的效果
  • app不光是http协议提供服务的,还有websocket的、tcp的呢,怎么整?

OK,gorouter就是来解决以上问题的,他保存了一张路由表在内存中,他来做转发,所有的请求都从router节点走,所以性能是个需要注意的问题,cf1.0中使用nginx+lua+ruby来搞效果不是很好,当然,还有一个更普遍的问题,可用性问题:) so,一般来讲,在CloudFoundry平台中,gorouter是部署多个的,前面加一层LVS

 

代码结构

gorouter的代码地址:https://github.com/cloudfoundry/gorouter,分了不少目录,我们简述一下各个目录的功能,可以认为是代码模块的划分了

 

  • common 通用代码,比如获取本机IP:LocalIP,生成UUID:GenerateUUID,通用组件struct定义:VcapComponent(gorouter设计成一个Component),/healthz接口返回的内容,http权限校验逻辑等等
  • config 故名思议,就是处理配置的,通过这个package可以读取gorouter的配置文件
  • example_config 里面只是一个配置文件,样例,yaml格式的
  • log 这个package是用来打印log的
  • proxy 最重要的package,gorouter作为路由节点主要就是干proxy这个事情的,里边定义了如何处理http请求,如何处理websocket请求,如何处理tcp请求
  • register 各个app来更新路由表的时候通过这个这个package中的Register和UnRegister方法处理
  • route 这个package里是一些数据结构,存储路由表相关信息
  • router main函数所在的位置
  • stats 保存了一些状态信息,貌似是存储了访问量比较大的app列表,还定义了一个数据结构heap,没仔细看
  • test目录没看,谁让他起这么个名字呢
  • util 工具性package,只有一个方法,写pid文件
  • varz 统计状态并存放到相应数据结构里,比如多少BadRequest,多少BadGatway之类的,/varz接口 会返回这里保存的信息

接口交互

gorouter提供了三个http接口,可以这么调用查看:

 

 

# 查看路由表信息的
curl http://router:routerPass@routerIp:routerPort/routes
# 健康检查接口
curl http://router:routerPass@routerIp:routerPort/healthz
# 状态信息查看接口
curl http://router:routerPass@routerIp:routerPort/varz

 

 

上面的router:routerPass分别是在配置文件中配置的user和pass,routerPort就是你配置的port,默认是8082,这个端口提供的接口都是管理性质的接口

gorouter还会同时启动一个http server来监听80端口,处理终端用户的访问请求,最新版本的gorouter直接使用了golang内置的net/http,之前版本还自己定义了蛮多东西

 

主要逻辑

CloudFoundry内部组件之间通信主要通过NATS来完成,NATS是一个轻量级的基于pub-sub机制的分布式消息队列系统,它负责衔接各组件。

gorouter启动的时候,会往router.start这个channel发送一条消息,之后就是周期性发送了,周期时间由配置项 publish_start_message_interval 指定,发送的消息内容是json格式,定义如下:

 

 

type RouterStart struct {
     Id                               string   `json:"id"`
     Hosts                         []string `json:"hosts"`
     MinimumRegisterIntervalInSeconds int      `json:"minimumRegisterIntervalInSeconds"`
}

 

 

表示说:hi,各位同仁,我是gorouter,我启动了,我的地址是xx,你们有人要注册路由么?如果有需要的话每隔一段时间要给我发一条消息哈

 

gorouter会订阅router.register,这是各个组件注册路由信息的channel

还会订阅router.unregister,如果有组件想unregister,就发消息到这个channel;另外,如果一个组件长时间(droplet_stale_threshold)不发消息给router.register,router也会把对应的instance从路由表摘掉,router会经常性来做测试,测试周期是:prune_stale_droplets_interval

 

gorouter已经启动运行一段时间了,一个新的组件加入了,比如dea,他不知道gorouter的地址,怎么办?dea可以给router.greet这个channel发消息,gorouter会订阅这个channel,收到消息之后router会回复一个消息,消息内容跟发往router.start的内容一样,这样dea就获取到gorouter的地址了

 

OK,通过以上通信,router填充好了本机的路由表信息,开工,接收外部请求:)

router会监控80端口,http协议,一个request过来,router的主要处理逻辑:

1、找到对应的instance,之前提到的session一致性问题就是在这里解决的,cookie中如果有之前的instanceId,就用对应的这个instance,否则就从app对应的Endpoint(保存了instance相关信息)池中随机选取一个

2、判断是否是TcpUpgrade,判断依据:http header中Connection字段的value是upgreade,Upgrade字段的value是tcp,如果是,就用tcp的方式来handle,否则继续

3、判断是否是WebSocketUpgrade,判断依据:http header中Connection字段的value是upgreade,Upgrade字段的value是websocket,如果是,就用websocket的方式来handle,否则继续

4、走到这,说明是个纯粹的http请求,handle it即可

 

总结一下,起一个web server来监听80端口,拿到一个http request,判断是否是upgrade,如果是就升级为websocket连接或tcp连接,否则就是纯粹的http连接。如果读者了解websocket,对这种处理方式应该感觉很亲切,但是这个所谓的tcp方式有用么?后端rpc接口根本没法用这种方式暴露……反正目前我是没看到有啥用处哈,纯粹就是为了扩展,防止一个类似websocket这种协议出现吧

 

总结

1、用NATS这种通信方式来链接各个组件,非常松耦合,因为路由表信息没必要严格做到数据一致性,这样一来,router很轻易的部署多个实例,大家都监听相同的channel就都可以得到路由信息了,很方便

2、新版本扩展性更好,所有依赖于http协议的通信方式都可以解决,比如websocket

3、后端rpc模块如何提供服务目前没法解决,感觉可以仅仅把router里的路由信息作为name service来用,业务代码从此处获取原始接口提供方,即多个rpc instance,然后程序内部自己failover,自己去call。没有想到好方法,如果你有的话欢迎交流哦:)

 

gorouter作为CloudFoundry平台的入口,承载了所有的流量,虽然是个很重要的模块,不过逻辑比较简单,先写这么多,有问题可以留言讨论~:)

 

参考资料

Cloud Foundry中gorouter源码分析:http://blog.youkuaiyun.com/shlazww/article/details/11974411

gorouter源码地址:https://github.com/cloudfoundry/gorouter

NATS:http://limengyun.com/cloudfoundry/nats.html

 

 

GoRouter实战:除了context.go,这些路由传参的‘坑’你踩过吗?(Flutter避坑指南) 本文深入探讨Flutter中GoRouter路由传参的常见问题与解决方案,包括基础传参陷阱、查询参数处理、复杂对象传递模式等。通过实战案例和代码示例,帮助开发者避免常见错误,提升路由管理的效率和安全性,特别适合中高级Flutter开发者参考。 阅读详情

相关推荐

Flutter教程之带有 GoRouter 的 Flutter Navigator 2.0,使用 go_router 包了解 Flutter 中的声明式路由机制(教程含源码)

GoRouter是基于Navigation2.0的Flutter应用程序的声明式路由器,用于降低复杂性,无论应用程序运行的平台如何(移动、Web或桌面),处理深度和动态链接以及数据驱动的路由,同时仍提供简单的使用开发人员的经验。Flutter中的Navigator小部件是一种命令式路由机制(Navigator1.0),Navigator2.0是声明式导航的标准参考,不会取代Navigator1.0,因为它们可以一起使用。现在什么是命令式和声明式?......

iCloudEnd的博客 1754

GoRouter - 一个用于帮助 Android App 进行组件化改造的框架 —— 支持模块间的路由、通信、解耦,Gradle插件支持8.0+,模块Application生命周期

GoRouter - 一个用于帮助 Android App 进行组件化改造的框架 —— 支持模块间的路由、通信、解耦,Gradle插件支持8.0+

wangyao5018的博客 1401

goRouter:goRouter 是一个非常灵活和轻量级的路由器,具有高性能

路由器 goRouter 是一个非常灵活和轻量级的路由器,具有高性能。 它非常适合小型项目或一些小型 Web 服务。 用法 话不多说,给你看代码: package main import ( "fmt" // import router "github.com/Barbery/goRouter" "net/http" ) func main () { // get the instance of router mux := goRouter . GetMuxInstance () // add routes // Note: In goRouter, the routes is full match(by default, native router in golang is prefix match). mux

Flutter go_router 路由管理全面指南

go_router是一个 Flutter 的第三方路由插件,相比 Flutter 自带的路由,go_router更加灵活,而且简单易用。在 App 应用中,如果你想自己控制路由的定义和管理方式,那么它将十分有用。同时,对于 Web 应用来说,go_router也提供了很好的支持。使用go_router后,你可以定义 URL 的格式,使用 URL 跳转,处理深度链接以及其他一系列的导航相关的应用场景。@override。

yihanss的博客 5981

Go-gorouter一个简单高性能的Http路由器

gorouter 一个简单、高性能的Http路由器(支持正则,轻松创建RESTFul API)

TNS-12516及ORA-12516错误解决

在客户端进行sqlplus连接报错如下: ORA-12516: TNS: 监听程序找不到符合协议堆栈要求的可用处理程序 在/home/oracle/product/10.2.0/db_1/network/log/listener.log中查看到错误如下: TNS-12516: TNS:listener could not find available handler with matchin

KEL 2万+

gorouter:高性能Go语言HTTP路由框架

???? gorouter:高性能Go语言HTTP路由框架 项目介绍 gorouter 是一个专为Go语言设计的高性能HTTP路由框架,旨在为开发者提供一个轻量级、高效的解决方案,用于构建服务器和API。无论你是构建一个简单的Web应用,还是一个复杂的微服务架构,gorouter 都能帮助你快速、高效地处理HTTP请求。 项目技术分析 核心技术 路由系统:gorouter 提供了一个强大的路由系统,支...

gitblog_01089的博客 546

UR机械臂正逆运动学解析:从DH参数到8组解的完整求解策略

本文深入解析UR机械臂的正逆运动学求解策略,从DH参数原理到完整的8组解求解方法。详细介绍了正运动学的坐标变换过程,以及逆运动学中Atan2函数和三角恒等变换的应用,并揭示了8组解的产生机制。通过实际案例和调试技巧,帮助工程师掌握UR机械臂运动学求解的核心技术。

weixin_29094775的博客 413

GoRouter简易指南:构建高效的HTTP路由系统

GoRouter简易指南:构建高效的HTTP路由系统 项目介绍 GoRouter 是由开发者 xujiajun 提供的一个简单且高性能的HTTP路由器,专为Go语言设计。它旨在轻松构建RESTful APIs和Web框架。与其他选项相比,如 julienschmidt/httprouter(不支持正则表达式)和 gorilla/mux(相对较慢),GoRouter结合了正则支持与速度优势,非常适合...

gitblog_00362的博客 473

从PX4的FRD到Mavros的FLU:手把手教你正确配置`setpoint_raw/local`话题发布无人机目标点

本文详细解析了PX4的FRD与Mavros的FLU坐标系转换问题,手把手教你正确配置`setpoint_raw/local`话题发布无人机目标点。通过实战指南和常见错误排查,帮助开发者避免方向错乱问题,提升无人机控制精度。

weixin_33712987的博客 422

长鑫存储面试真题解析:DRAM工程师的工程直觉与产线思维

DRAM作为现代计算系统的底层存储基石,其性能与可靠性高度依赖半导体物理基础、工艺窗口控制和电路-系统协同设计。理解电荷保持机制、位线电容耦合效应、信号完整性约束等核心原理,是突破传统数字IC思维、构建真实产线语感的关键。在晶圆厂级工程实践中,TEM缺陷识别、BIST空间聚类分析、Retention失效定位等能力,直接关联良率爬坡与客户系统稳定性。本文聚焦长鑫存储一线技术面试中高频出现的工艺-电路-测试三维问题,融合‘电荷保持’‘信号完整性’等热词,还原DRAM工程师必备的系统性建模能力与闭环验证思维,覆盖

weixin_34293246的博客 336

Cloud Foundry中gorouter源码分析

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

rznice的专栏 1977

LPC2124定时器实现跑马灯

文章目录一、keil 4新建工程 一、keil 4新建工程 1、Create New Project,注意,最好添加进一个新建好的文件夹里,keil不会帮你新建。 2、添加设备类型:NXP目录下的LPC2124 3、选择启动文件Startu.s 4、new 一个file,保存命名为.c文件 5、添加进project里,右击,add 选中,添加 6、设置编译输出.hex文件 ...

qq_37937830的博客 5753

gnatsd server 结构解析

花了几天时间通读了一遍gnatsd,在此做下笔记。 来源cloudfoundry,是一个开源轻量高性能的消息系统,gorouter依赖它来作为消息系统,进行PUB/SUB操作。 官方地址:http://nats.io/ 项目地址:https://github.com/apcera/gnatsd gnatsd的代码结构如...

weixin_33967071的博客 341

宇树GO2-YOLOv5在Jetson Orin上的部署避坑实践

本文详细记录了在宇树GO2四足机器人搭载的Jetson Orin平台上部署YOLOv5目标检测模型的完整实践过程。文章重点分享了从ARM架构认知、网络连接解决方案、Archiconda环境搭建、PyTorch版本精准匹配到依赖安装与性能验证的核心步骤与避坑指南,旨在帮助开发者高效完成边缘计算环境下的算法部署。

app77的博客 669

linux系统下XDMA驱动的安装与测试问题总结

先看两个常见的问题。一个是驱动安装问题,一个是驱动测试错误;error 512 能识别PCIE的设备,但是The kernel modle installed correctly, but no devices were recognized.

whm128的博客 3802

flutter开发实战-go_router使用

go_router是一个Flutter的第三方声明式路由插件,使用路由器API提供一个方便的、基于url的API,用于在不同屏幕之间导航。可以定义URL模式、使用URL导航、处理深度链接以及许多其他与导航相关的场景。使用模板语法解析路由路径和路由查询(query)参数;支持单个目标路由展示多个页面(子路由);重定向:可以基于应用状态跳转到不同的URL,比如用户没有登录时跳转到登录页;使用 StatefulShellRoute 可以支持嵌套的 Tab 导航;

一名开发者 3325

YOLOv11来了,使用YOLOv11训练自己的数据集和推理(附YOLOv11网络结构图)

YOLOv11 由 Ultralytics 在 2024 年 9 月 30 日发布, 最新的 YOLOv11 模型在之前的 YOLO 版本引入了新功能和改进,以进一步提高性能和灵活性。YOLO11 在快速、准确且易于使用,使其成为各种对象检测和跟踪、实例分割、图像分类和姿态估计任务的绝佳选择。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 28万+

Tweepy 中 Twitter API v2 的 Expansions 与 Fields 完整指南

Tweepy 的 Twitter API v2 客户端([tweepy/client.py](https://link.gitcode.com/i/9e9fcfe0206feff7046892a31caedbac))为每个端点都预留了 `expansions` 与各类 `*_fields` 参数,用于按需获取关联数据对象(如作者、被引用推文、媒体、投票、地点)以及补充的元数据字段。本文基于 [do

gitblog_00042的博客 487

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

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

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

【Flutter 工程】006-路由跳转:go_router

GoRouter是一个用于Flutter应用程序的导航库,它提供了一种简单而强大的方式来管理应用程序的导航栈和路由。它可以帮助你组织和管理Flutter应用程序中的页面导航,使页面之间的跳转和参数传递更加方便。简单易用:GoRouter的API设计简单直观,易于使用和理解。它提供了一个简洁的接口来定义和管理应用程序的路由规则。路由规则定义:你可以使用GoRouter定义应用程序的路由规则。通过指定路径和相应的构造器函数,你可以将路由规则与Flutter Widget相关联。

訾博(ZiBo)的博客 2915

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Gorouter:云原生的HTTP负载均衡器

Gorouter:云原生的HTTP负载均衡器 Gorouter是一个由Cloud Foundry社区开发的L7层HTTP路由器,它是Cloud Foundry平台默认部署的一部分,并且可以在cf-deployment中找到。这个强大的开源项目不仅用于路由流量,还提供了动态更新路由表和高级性能特性。 项目介绍 Gorouter通过NATS消息总线动态管理其路由表,实现了高效、灵活的路由策略。它支持通...

gitblog_00002的博客 389

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Flutter 中使用 go_router

go_router是一个功能强大且灵活的路由管理库,支持路由参数、嵌套路由、重定向和导航守卫等功能,使得在复杂应用中进行路由管理变得更加简洁和清晰。

weixin_42766526的博客 1985

GoRouter:为Android应用组件化改造提供强大支持

GoRouter:为Android应用组件化改造提供强大支持 在现代Android应用开发中,组件化架构已成为提升开发效率、降低维护成本的重要手段。GoRouter作为一个新兴的Android路由框架,旨在帮助开发者轻松实现应用组件化改造,支持模块间的路由、通信和解耦。 项目介绍 GoRouter是一个开源的Android路由框架,它提供了自动生成路由帮助类、模块Application生命周期管理...

gitblog_00116的博客 565

Flutter 路由革命:GoRouter 完全指南

这时,GoRouter 应运而生,它是由 Flutter 团队维护的官方推荐路由库,旨在简化 Navigator 2.0 的复杂性。维护团队 🟢 Flutter 团队 🟢 Flutter 团队 🟡 社区 🟡 社区。Web 支持 🟢 优秀 🟡 需要配置 🟢 优秀 🟢 优秀。深度链接 🟢 内置 🟡 需要实现 🟢 内置 🟢 内置。路由守卫 🟢 强大 🟡 需要实现 🟢 强大 🟢 强大。类型安全 🟢 优秀 🟡 一般 🟢 优秀 🟡 一般。文档质量 🟢 优秀 🟡 一般 🟢 良

tangweiguo03051987的博客 1723

gorouter 安装部署

本文记录下 gorouter的 部署 & 启动 过程。 部署 先部署golang环境,下载golang 包:https://storage.googleapis.com/golang/go1.4.2.linux-amd64.tar.gz,解压到 /home/work/local/go 增加环境变量: *echo "ex...

weixin_34043301的博客 190

gorouter源码分析

本文严格意义上讲,也不能算是原创,大量参考了sslazww的文章,并在其基础上,加上自己的理解。主要是更多的源码解释。 gorouter   The originalrouter is backed by nginx, that uses Lua code to connect to a Ruby server that-- based on the headers of a cl

ndzj981479673的专栏 2880
上一篇: CloudFoundry中buildpack介绍与自定义实践
下一篇: CloudFoundry中cf logs命令报权限错
UlricQin
博客等级 码龄17年 21粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值