Cloud Foundry中gorouter对StickySession的支持

Cloud Foundry作为业界出众的PaaS平台,在应用的可扩展性方面做得很优秀。

详细来讲,在一个应用须要横向伸展的时候,Cloud Foundry能够轻松地帮助用户做好伸展工作,也就是创建出一个应用的多个实例,多个实例地位相等,多个实例共同为用户服务,多个实例共同分担訪问压力。

大致来说,能够觉得是共同分担訪问压力,可是也不是针对全部该应用的訪问,都进行均衡,分发到不同的应用实例处。譬如:当Cloud Foundry的訪问用户訪问应用时,第一次的訪问,gorouter会将请求分发到应用的某个实例处,可是假设该用户之后的訪问都是有状态的,不希望之后的訪问会被分发到该应用的其它实例处。针对以上这样的情况,Cloud Foundry提供了自己的解决方式,使用StickySession的方式,保证请求依然分发给指定的应用实例。

本文即分析Cloud Foundry中gorouter关于StickySession的实现方式。

该部分内容须要对gorouter有一定的了解,能够參见笔者之前的博文:Cloud Foundry中gorouter源代码分析

关于StickySession的信息,gorouter所做的工作,主要分为两个部分:怎样给HTTP请求加入?StickySession、怎样通过StickySession辨别应用的详细实例。

怎样给HTTP请求加入?StickySession

在分析这个问题的时候,首先我们须要提出还有一个问题:什么情况下须要给HTTP请求加入?StickySession?

首先,来看这种一个方法setupStickySession的go语言实现:

func (h *RequestHandler) setupStickySession(endpointResponse *http.Response, endpoint *route.Endpoint) {
        needSticky := false
        for _, v := range endpointResponse.Cookies() {
                if v.Name == StickyCookieKey {
                        needSticky = true
                        break
                }
        }

        if needSticky && endpoint.PrivateInstanceId != "" {
                cookie := &http.Cookie{
                        Name:  VcapCookieId,
                        Value: endpoint.PrivateInstanceId,
                        Path:  "/",
                }

                http.SetCookie(h.response, cookie)
        }
}
      

紧接着,查看setupStickySession方法何时被调用的代码:

func (h *RequestHandler) HandleHttpRequest(transport *http.Transport, endpoint *route.Endpoint) (*http.Response, error) {
        h.transport = transport

        h.setupRequest(endpoint)
        h.setupConnection()

        endpointResponse, err := transport.RoundTrip(h.request)
        if err != nil {
                return endpointResponse, err
        }

        h.forwardResponseHeaders(endpointResponse)

        h.setupStickySession(endpointResponse, endpoint)

        return endpointResponse, err
}

在setupStickySession方法中,能够看到:首先进入一个循环语句块中,当endpointResponse中的cookies中有名为StickyCookieKey的话,将needSticky字段置为true,跳出循环。这里也就回答了什么时候须要给HTTP请求加入?StickySession的问题。关于StickyCookieKey的值,能够先看一下gorouter的设置:

const (
        VcapCookieId    = "__VCAP_ID__"
        StickyCookieKey = "JSESSIONID"
)

能够看到StickyCookieKey的值为JSESSIONID,而JSESSIONID是Tomcat对session id的称呼,在其它容器中就不一定叫JSESSIONID了。因此,假设平台运维者自己定义了一种容器的buildpack,而这个容器中对于session id的称呼不为JSESSIONID的话,那么Sticky Session在gorouter中将不能被实现,除非将这部分内容自行进行改写,或者改动该容器对session id的称呼。

紧接着在setupStickySession中,通过一个推断,来给response创建一个cookie,创建的cookie有Name字段,Value字段以及Path字段。最后通过http.SetCookie(h.response, cookie)来实现对response的设置加入?cookie。

读完setupStickySession方法的实现,如今进入调用该方法的HandleHttpRequest方法,该方法的主要工作是:将haproxy代理来的请求,转发给详细对应的DEA上的应用实例,最后构建该请求的response信息,并返回该响应信息。在返回response响应信息的之前,gorouter为该response信息设置了StickySession。

以上便是怎样给HTTP请求加入?StickySession,下面分析怎样通过StickySession辨别应用的详细实例。

怎样通过StickySession辨别应用的详细实例

当一个请求到达gorouter的时候,gorouter须要首先辨别该请求中是否带有StickySession的信息,假设有的话,,gorouter分析该请求中的对应信息,终于得到指定应用实例的信息,并将请求转发到该指定应用实例。详细实现代码例如以下:

func (p *proxy) lookup(request *http.Request) (*route.Endpoint, bool) {
        uri := route.Uri(hostWithoutPort(request))

        // Try choosing a backend using sticky session
        if _, err := request.Cookie(StickyCookieKey); err == nil {
                if sticky, err := request.Cookie(VcapCookieId); err == nil {
                        routeEndpoint, ok := p.registry.LookupByPrivateInstanceId(uri, sticky.Value)
                        if ok {
                                return routeEndpoint, ok
                        }
                }
        }

        // Choose backend using host alone
        return p.registry.Lookup(uri)
}

从源代码中能够看到,首先从请求中提取出uri,随后分析请求中是否带有StickyCookieKey,也就是JSESSIONID,若有的话,继续分析是否带有VcapCookieID,也就是__VCAP_ID__,若有的话,那说明是gorouter支持的StickySession,从sticky中找出value属性相应的值,也就是应用PrivateInstanceID,通过该ID寻找出详细相应的是应用的哪个实例,最后返回该应用实例的详细信息,当然包含终于该实例的IP:PORT。假设以上这些StickyCookieKey或者VcapCookieID不存在的话,也就是说该请求不支持StickySession,那么将直接通过uri,寻找某一个应用实例来为该请求服务。

以上便是Cloud Foundry中gorouter对StickySession的支持与实现。

转载请注明出处。

这篇文档很多其它出于我本人的理解,肯定在一些地方存在不足和错误。希望本文可以对接触Cloud Foundry v2中gorouter实现StickySession的人有些帮助,假设你对这方面感兴趣,并有更好的想法和建议,也请联系我。

我的邮箱:[email protected]

新浪微博:@莲子弗如清

Cloud Foundry中gorouter对StickySession的支持

时间: 2024-10-09 07:35:16

Cloud Foundry中gorouter对StickySession的支持的相关文章

Cloud Foundry中DEA与warden通信完成应用端口监听

在Cloud Foundry v2版本中,DEA为一个用户应用运行的控制模块,而应用的真正运行都是依附于warden.更具体的来说,是DEA接收到Cloud Controller的请求:DEA发送请求给warden server:warden server创建warden container并将用户应用droplet等环境配置好:DEA发送应用启动请求至warden serve:最后warden container执行启动脚本启动应用. 本文主要具体描述,DEA如何与warden交互,以保证最终

Cloud Foundry中warden的网络设计实现——iptable规则配置

在Cloud Foundry v2版本中,该平台使用warden技术来实现用户应用实例运行的资源控制与隔离. 简要的介绍下warden,就是dea_ng如果需要运行用户应用实例(本文暂不考虑warden container提供staging打包环境),则发送相应请求给warden server,由warden server来创建warden container,并在warden container内部运行应用实例,而warden container的具体实现中使用cgroups等内核虚拟化技术,

Cloud Foundry中DEA启动应用实例时环境变量的使用

在Cloud Foundry v2中,当应用用户须要启动应用的实例时.用户通过cf CLI向cloud controller发送请求,而cloud controller通过NATS向DEA转发启动请求.真正运行启动事宜的是DEA,DEA主要做的工作为启动一个warden container, 并将droplet等内容拷贝进入container内部.最后配置完指定的环境变量,在这些环境变量下启动应用的启动脚本. 本文将从阐述Cloud Foundry中DEA怎样为应用实例的启动配置环境变量. DE

Cloud Foundry warden container 安全性探讨

本文将从Cloud Foundry中warden container的几个方面探讨warden container的安全性. 1. warden container互访 1.1.  互访原理 在Cloud Foundry内部,用户应用的运行环境通过warden container来进行隔离. 其中,网络方面,container之间的互访如下图: 假设container1主动访问container3: 1.  container1从自身的虚拟网卡virtual eth0_0发起请求,由于自身内核路

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

原文链接:http://www.programmer.com.cn/14472/ 历经一年多的发展,Cloud Foundry的架构设计和实现有了众多改进和优化.为了便于大家了解和深入研究首个开源PaaS平台——Cloud Foundry,<程序员>杂志携手Cloud Foundry社区开设了“深入Cloud Foundry”专栏,旨在从架构组成.核心模块功能.源代码分析等角度来全面剖析Cloud Foundry,同时会结合各行业的典型案例来讲解Cloud Foudry在具体应用场景中的表现.

【Cloud Foundry】Could Foundry学习(二)——核心组件分析

在阅读的过程中有不论什么问题,欢迎一起交流 邮箱:[email protected]    QQ:1494713801 Cloud Foundry核心组件架构图例如以下: 主要组件:     Cloud Controller:实质上是VMC和STS交互的server端,它收到指令后发消息到各模快,管理整个云的执行.相当于Cloud Foundry的大脑. DEA:负责处理对所部署的App的訪问请求.事实上质是打包和訪问Droplet.当中Droplet是通过Stager组件将提交的源码及Clou

Cloud Foundry学苑简介

从计算机诞生到今天,我们可以认为数字技术经历了如图2所示三次大的浪潮:以大型机(Mainframe)为代表的第一台平台,以小型机(Mini或者Minicomputer)和PC(Personal Computer, 也叫微型机Microcomputer)为代表的第二代平台和以云计算为基础的第三代平台. 随着人们对云计算技术研究的深入,业界把云计算软件栈分成了三个层次,IaaS也叫I层云,PaaS也叫P层云,和SaaS也叫S层云. Cloud Foundry是VMware推出的业界第一个开源PaaS

基于Cloud Foundry平台部署nodejs项目上线

Cloud Foundry(以下简称CF),CF是Vmware公司的PaaS服务平台,Paas(Platform as a Service,平台即服务), 是为开发者提供一个应用运行的平台,有了这人平台,开发者无需搭建线上应用运行环境和服务(Mysql/mongodb/Rabbitmq等),包括硬件和软件(os/应用软件如tomcat/rails等)环境.开发者可专注代码开发,最终提供源码(或war包之类的)信息,上传至PAAS,即可运行:同时pass平台提供DNS服务,一些Webapp可以直接

Pivotal Cloud Foundry安全原理解析

云计算相关的技术几乎都对传统网络架构和安全规则产生一定的冲击,Pivotal Cloud Foundry(PCF)也不例外,去年8月为了说服专业安全组织同意PaaS部署方案,特意为他们深入讲了下PCF的安全机制,虽然这种原理性的东西不符合开博的宗旨,但是为了防止大家也要说服这样的组织,分享出来也算是云计算实务的一部分.不过说实话,个人以为既然我们开始拥抱云计算和大数据,那在安全上就应该有新的认识和实践. 本文是基于PCF1.2进行的说明,现在的版本里Availability Zone和App S