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的人有些帮助,假设你对这方面感兴趣,并有更好的想法和建议,也请联系我。

我的邮箱:shlallen@zju.edu.cn

新浪微博:@莲子弗如清

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

  1. Cloud Foundry中 JasperReports service集成

    Cloud Foundry作为业界第一个开源的PaaS解决方案,正越来越多的被业界接受和认可.随着PaaS的发展,Cloud Foundry顺应潮流,充分发挥开源项目的特点,到目前为止,已经支持了大批 ...

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

    在Cloud Foundry v2版本号中,该平台使用warden技术来实现用户应用实例执行的资源控制与隔离. 简要的介绍下warden,就是dea_ng假设须要执行用户应用实例(本文暂不考虑ward ...

  3. Cloud Foundry中通用service的集成

    目前,CloudFoundry已经集成了很多第三方的中间件服务,并且提供了用户添加自定义服务的接口.随着Cloud Foundry的发展,开发者势必会将更多的服务集成进Cloud Foundry,以供 ...

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

    在Cloud Foundry v2中,当应用用户须要启动应用的实例时.用户通过cf CLI向cloud controller发送请求,而cloud controller通过NATS向DEA转发启动请求 ...

  5. Cloud Foundry中vmc tunnel与caldecott原理

    在Cloud Foundry中,用户可以vmc create-service创建一个service instance,但是常规情况下,用户不能手动地进一步对service instance进行设计.以 ...

  6. Cloud Foundry中DEA与warden通信完毕应用port监听

    在Cloud Foundry v2版本号中,DEA为一个用户应用执行的控制模块,而应用的真正执行都是依附于warden. 更详细的来说,是DEA接收到Cloud Controller的请求:DEA发送 ...

  7. Cloud Foundry warden container 安全性探讨

    本文将从Cloud Foundry中warden container的几个方面探讨warden container的安全性. 1. warden container互訪 1.1.  互訪原理· 在Cl ...

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

    原文链接:http://www.programmer.com.cn/14472/ 历经一年多的发展,Cloud Foundry的架构设计和实现有了众多改进和优化.为了便于大家了解和深入研究首个开源Pa ...

  9. Cloud Foundry技术资料汇总

    来自:http://cnblog.cloudfoundry.com/2012/05/ 本文是Cloud Foundry的一个简单上手指南和资料汇总,内容将根据产品的发布定期更新. Cloud Foun ...

随机推荐

  1. vs15

    vs15 preview5 离线安装包 vs15 preview5 离线安装包   1.介绍 vs15是微软打造的新一代IDE,全新的安装方式.官网介绍如下(https://blogs.msdn.mi ...

  2. JAVA实现前几秒几分钟几天前几年源码

    package com.date; import java.text.ParseException; import java.text.SimpleDateFormat; import java.ut ...

  3. Multiplication Puzzle

    题目大致意思是:一个整数序列包含N个1~100的整数(3<=N<=100),从中取出一个数并和相邻两边的整数相乘,依次进行下去直到只剩下首尾两个数为止,求最终的得到的和的最小值.两边的数不 ...

  4. 李洪强iOS开发Swift篇---11_变量&常量&元组

    李洪强iOS开发Swift篇---11_变量&常量&元组 说明: 1)终于要写一写swift了.其实早在14年就已经写了swift的部分博客,无奈时过境迁,此时早已不同往昔了.另外,对 ...

  5. 李洪强iOS开发之-环信02.1_环信 SDK 2.x到3.0升级文档

    李洪强iOS开发之-环信02.1_环信 SDK 2.x到3.0升级文档 SDK 2.x 至 3.0 升级指南 环信 SDK 3.0 升级文档 3.0 中的核心类为 EMClient 类,通过 EMCl ...

  6. 更好的 SQL 模式的 10 条规则

    更好的 SQL 模式的 10 条规则 2015-06-17 11:57:392353浏览1评论 在创建新表和数据仓库时,要做很多决定.一些在当时似乎无关紧要的地方,却让你和用户在数据库的生命期内感到痛 ...

  7. 以面到点的学习MFC

    市面上讲解学习MFC的书籍不胜其多,但是阅读的同学呢,看了一些内容以后,就无法阅读下去了,觉得MFC好难,有的呢,就会直接去看别人写的程序,不管是大或小,有时候也能明白一点点,但是总是走不出自己开发设 ...

  8. AT&T汇编中系统调用和C函数调用的使用

    我的博客:www.while0.com 区别: 系统调用的参数存储在寄存器中,函数调用的则存储在堆栈中. 系统调用使用中断方式,函数调用使用call指令 相同之处: 都有返回值和输入值 返回值都存储在 ...

  9. How to: Use a Custom User Name and Password Validator

    在wcf中使用自定义的用户名和密码验证方式 https://msdn.microsoft.com/en-us/library/aa702565.aspx http://www.codeproject. ...

  10. USACO3.41Closed Fences(几何)

    这题水的真不易..300多行 累死了 对着数据查错啊 枚举每个边上的点到源点 是否中间隔着别的边  每条边划分500份就够了  注意一下与源点在一条直线上的边不算 几何 啊,,好繁琐 参考各种模版.. ...