PaaS 7层动态路由的若干实现

随着Docker的出现,PaaS、CaaS(Container As A Service)、甚至DCOS(DataCenter OS)呈现了爆发式的发展。而在PaaS中,因为实例一般默认为动态IP,对于7层调用(比如http请求),需要7层动态路由获取应用域名(或虚IP)和后端实例的映射关系,以提供7层服务;而对于4层调用(比如rpc调用),可以通过动态LVS或名字服务(或基于zookeeper/etcd等实现的服务注册和发现工具)进行调用。

简单举例,开发者在PaaS里创建了一个APP,包含若干个实例,然后为APP绑定某个域名。用户对APP发出请求,需要经过后端实例的处理才能正确的返回。那么作为7层动态路由,核心就是获取域名(或虚IP)与后端实例的对应关系并作为反向代理完成请求转发。

这里简单讨论下7层动态路由的若干实现。因为nginx是一个高性能的反向代理服务器,以是否基于nginx实现7层动态路由,可以将这些实现大概分为两大类。

第一类,不依赖nginx,项目自身实现了反向代理的功能。

CloudFoundry可以说是第一代的开源PaaS项目,其模块gorouter即为一个动态路由实现(同时支持4层和7层)。以 CloudFoundry (release v164)为例,使用nats作为消息总线,对各模块调用和消息传递进行解耦。可以看下gorouter (tag 45ca951297)的代码,registry/registry.go里实现了相应逻辑代码,以获取域名和后端实例的对应关系。其大概流程为:

实例启动后向nats发布消息,gorouter则会订阅这些消息,从而获取应用域名和后端实例的对应关系;同时gorouter使用goroutine实现了高性能的请求处理和转发,支持4层和7层调用。

Docker出现后,基于Docker的轻量级PaaS纷纷涌现,大家可能会把实例信息(如IP信息等)存储在redis(或其它数据存储)。开源项目DINP基本就是这样的实现,dinp-router fork自CloudFoundry的gorouter (tag 45ca951297),更改了部分代码,以获取应用域名和redis中存储的后端实例的对应关系,从而实现了7层动态路由的功能。

类似的,dotCloud的hipache则是利用nodejs的http库实现了请求转发,后端实例信息则可以存储在redis中。

当然,很多工程师在7层的选型上还是更信赖nginx,毕竟nginx在性能、稳定性、扩展性上都是不二之选。基于nginx来实现7层动态路由,大概又有两种实现思路。

其一,基于名字服务(或基于zookeeper/etcd等实现的服务注册和发现工具),通过watch或定时调度,将注册的后端实例更新到 nginx配置文件的upstream中,从而实现后端的(准)实时变化。这方面也有如confd等的开源工具。confd基于golang的 template库,将nginx配置文件作为模板;支持consul/etcd/redis/zookeeper等诸多后端存储,通过watch或定时调度从这些后端获取实例信息,并更新到nginx配置文件模板,从而实现(准)实时的7层动态路由。这种实现逻辑简单,稳定性高,但在大规模应用时 nginx可能会较频繁的reload。

其二,基于nginx-lua实现。每次用户请求到达相应upstream时,通过nginx-lua从redis等数据存储中获得后端实例信息,从而实现请求的转发。nginx获取redis数据需要进行一次网络请求,同机房的时延一般是毫秒级,但在大访问量时可能存在一定问题,因此可以使用 lua-shared-dict作为系统缓存。

参考:

https://github.com/openresty/lua-nginx-module

http://segmentfault.com/a/1190000004128807?luicode=10000359&luicode=10000359

本文转自d1net(转载)

时间: 2024-10-31 14:02:26

PaaS 7层动态路由的若干实现的相关文章

《IP路由协议疑难解析》一1.3 动态路由

1.3 动态路由 IP路由协议疑难解析 上一节简要概述了什么是IP路由选择,指出了在大型网络中启用动态路由协议的必要性.本节将讨论IP路由协议分类及特征.虽然所有路由协议都以收集路由信息,支撑路由器转发数据包为己任,但可根据路由协议所转发的流量类型,将其分为两大类:单播路由协议和多播路由协议. 前文已指出,IP的作用是提供编址方案,以标识网络中的各个子网或不同场所.IP包头中的目的地址即为数据包的"归宿".IP包发送方的IP地址存储在包头的源IP地址字段内.IP子网(或简称为子网)是一

思科模拟器静态路由和动态路由配置

思科模拟器 静态路由,动态路由 RIP配置 动态路由协议 RIP 命令就两行比较简单 实验拓扑图如下: 更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Network/lyjs/ 要想实现pc1 和pc2 通讯就要对R1 ,R2,R3 进行配置 1. 静态配置命令格式如下: 对于R1 Router>en Router#conf Configuring from terminal, memory, or network [terminal]?

什么是动态路由

动态路由是指路由器能够自动地建立自己的路由表,并且能够根据实际实际情况的变化适时地进行调整. 动态路由机制的运作依赖路由器的两个基本功能:对路由表的维护:路由器之间适时的路由信息交换. 路由器之间的路由信息交换是基于路由协议实现的.通过图2的示意,我们可以直观地看到路由信息交换的过程.交换路由信息的最终目的在于通过路由表找到一条数据交换的"最佳"路径.每一种路由算法都有其衡量"最佳"的一套原则.大多数算法使用一个量化的参数来衡量路径的优劣,一般来说,参数值越小,路径

如何将静态路由发布到动态路由

打开随书光盘中第6章练习"06 将静态路由发布到动态路由.pkt",如图6-22所示,河北师大和软件学院有各自独立的网络,有独立的IT部门管理自己的网络.Router1是访问Internet的出口.河北师大的内部网络配置EIGRP协议,可以认为是一个自制系统.软件学院的内部网络配置RIP协议,可以认为是一个自制系统.Router3模拟Internet的路由器,PC4模拟Internet的一个计算机. ▲图6-22 静态路由再发布实验的网络拓扑 1.实验环境 网络中的计算机和路由器已经按

分析备份路由器与动态路由

根本就无法知道主路由器已瘫痪,会继续向该路由器发包,导致传输中断,正在通信的计算机只有在另外发送Proxy ARP请求或重新启动之后才能找到备份路由器以进行传输. 目前备份路由器的应用非常广泛,同时其作用也更加的突出.对于某些企业或组织的某些关键业务数据的网络传输,要求网络设备高度的可靠性,而且需要维护方便.Cisco 路由器的备份技术有多种.这里介绍一下路由器自身的备份技术及线路备份技术.一般来说,路由器是建立局域网与广域网连接的桥梁.3lian 素材 所谓的路由器自身的备份技术是为了解决路由

动态路由与静态路由的区别

    静态路由 静态路由是指由网络管理员手工配置的路由信息.当网络的拓扑结构或链路的状态发生变化时,网络管理员需要手工去修改路由表中相关的静态路由信息.静态路由信息在缺省情况下是私有的,不会传递给其他的路由器. 当然,网管员也可以通过对路由器进行设置使之成为共享的.静态路由一般适用于比较简单的网络环境,在这样的环境中,网络管理员易于清楚地了解网络的拓扑结构,便于设置正确的路由信息. 动态路由 动态路由是指路由器能够自动地建立自己的路由表,并且能够根据实际实际情况的变化适时地进行调整. 动态路由

移动端基于动态路由的架构设计

好久好久没写过文章了,一是最近项目太忙了,没时间写.二是也没有时间学习新的东西,想写点什么却又无从下笔.一味的去写这个API怎么用,那个新技术怎么用,又显的没意思.没有项目经验总结的技术知识讲解,总感觉有些苍白. 最近在做混合App开发这块,从开始的ionic 框架,到后来的mui框架,让我在混合开发这块有了更深的理解,如果在这块要写点什么无非漫天盖地的这个指令怎么用,那个模版怎么用,数据怎么进行双向绑定,等等,但是这些网上已经很多资料了,等不太忙了,我想我会总结一篇这些框架的使用心得吧.但是我

android的framework层动态修改原生输入法高度

问题描述 android的framework层动态修改原生输入法高度 framework层的修改(点击textview后,底层能动态控制输入法的高度显示) 解决方案 表达清楚,想要的效果什么样的!

《Python自动化运维:技术与最佳实践》一3.3 生成动态路由轨迹图

3.3 生成动态路由轨迹图 scapy(http://www.secdev.org/projects/scapy/)是一个强大的交互式数据包处理程序,它能够对数据包进行伪造或解包,包括发送数据包.包嗅探.应答和反馈匹配等功能.可以用在处理网络扫描.路由跟踪.服务探测.单元测试等方面,本节主要针对scapy的路由跟踪功能,实现TCP协议方式对服务可用性的探测,比如常用的80(HTTP)与443(HTTPS)服务,并生成美观的路由线路图报表,让管理员清晰了解探测点到目标主机的服务状态.骨干路由节点所