常规的应用,大多数可以不经过任何修改即可部署于CloudFoundry云平台之上,但是在一些特殊情况下,总是不可避免地会出现一些细小的问题,如果在应用设计之初,就考虑到针对云平台的一些特殊情况,遵守云平台的规范,就会使应用更适应云平台环境,不止是CF平台,也包括其他的云平台,下边列举几条在应用设计之初应该考虑的情况:

1、避免使用本地文件系统

部署于CloudFoundry云平台的应用,在设计之时,应该避免对本地(服务器端)文件进行读写,原因如下:

1.1 应用实例的本地文件系统是短暂存在的

应用实例的本地文件系统依赖于当前应用实例的生命周期,这就意味着,当应用实例停止、重启或者崩溃的时候,原本分配与本实例的存储空间会被平台回收刷新病重新用于分配给新的应用实例,其中的所有数据即使是应用本身对这部分做出的修改也会被清除。

1.2 应用的不同实例的文件系统是各自独立的

在CloudFoundry环境中,所有的实例都是运行在一个“信息孤岛”之中,warden组件为每个实例构造了一个完全独立的运行环境,包括本地文件系统、内存等,即使是同一应用的不同实例,也是如此;而对于客户端来说,不同的客户端可能连到了不同的实例上,这就会出现什么现象,当一个客户端在应用的本地文件系统中写入了数据,另一个客户端同步读取,也会有可能读取不到任何数据,当然,如果刚好这两个客户端是连到了同一个实例上,而且实例在写入数据后没有发生类似重启、停止、崩溃的事件,那数据的读取还是正常的。

若有需求需要存储的数据需要贯穿应用实例的不同的生命周期,或者需要在不同的应用实例之间共享,最好的选择就是使用数据库或者Blob等存储服务,例如,可以使用部署于CloudFoundry环境上的MongoDB服务来存储非结构化的数据,使用其他关系型数据库如Mysql来存储结构化数据,另外,也可以使用如 Amazon S3, Google Cloud Storage, Dropbox,Box等公共服务,如果单是需要不同实例之间进行通讯或者数据共享,可以考虑使用Redis或者RabbitMQ等。

2、HTTP Session的非持久化与不可复制性

在客户端Cookie开启的情况下,CloudFoundry完全能够通过HTTP请求支持Session的关联和绑定,如果一个应用有多个实例,那么针对于某一客户端来说,它的所有请求,都会被路由到同一个应用实例,这就不会出现Session丢失的情况,这就允许服务器端可以对每个客户端进行一些Session临时数据的存储并在有效期内共享。

CloudFoundry平台本身不提供Session数据持久化和复制,如果一个应用实例出现崩溃或者停止、重启之类的事件,临时存储在HTTPsession中的数据将会丢失,这和上一条规范“避免本地文件系统读写”是密切相关的,当客户端与崩溃或者停止后重启的应用实例重新建立连接时,目标实例已经是一个全新的实例,而不是之前的实例,所以之前的session信息也已经不存在了。

对于那些在实例重启后仍然需要可用或者说可以在不同实例之间共享的Session数据,解决办法同上上一条规范:将数据保存在CloudFoundry的其他服务如redis、mysql或者其他开放的存储服务中。

3、HTTP和HTTPS端口的局限性

运行在CloudFoundry上的应用只能通过配置的URL接收数据,端口使用标准的HTTP端口-80和HTTPS端口-443。

CloudFoundry V2版本中的Mysql、redis、mongodb等服务可以通过CloudFoundry合作伙伴提供的客户端工具直接连接,而配置连接参数和认证参数可以通过查看绑定了该服务的应用的env.log文件或者CloudFoundry API接口获得。

CloudFoundry云环境中应用的特殊设计的更多相关文章

  1. 【新书推荐】《ASP.NET Core微服务实战:在云环境中开发、测试和部署跨平台服务》 带你走近微服务开发

    <ASP.NET Core 微服务实战>译者序:https://blog.jijiechen.com/post/aspnetcore-microservices-preface-by-tr ...

  2. Docker在云环境中的应用实践初探:优势、局限性与效能评测

    作者 商之狄 发布于 2014年11月10日 本文依据笔者所在团队的一些近期开发和应用的实践,整理出一些有意义的信息,拿出来和社区分享.其中既包括在云端应用Docker与相关技术的讨论,同时也有实施过 ...

  3. 阿里云环境中配置tomcat7可能出现的问题及解决方法

    前提是安装好了tomcat,但是输入ip+端口无法访问,那么情况有一下几种 (1)可能防火墙没有关闭 systemctl stop firewalld.service #停止firewall syst ...

  4. 四种方案:将OpenStack私有云部署到Hadoop MapReduce环境中

    摘要:OpenStack与Hadoop被誉为继Linux之后最有可能获得巨大成功的开源项目.这二者如何结合成为更猛的新方案?业内给出两种答案:Hadoop跑在OpenStack上或OpenStack部 ...

  5. 云原生时代的DevOps平台设计之道

    开发人员与运维人员是 IT 领域很重要的两大人群,他们都会参与到各种业务系统的建设过程中去.DevOps 是近年间火爆起来的一种新理念,这种理念被很多人错误的解读为"由开发人员(Dev)学习 ...

  6. 【转载】如何在FPGA设计环境中添加加时序约束

    转自:http://bbs.ednchina.com/BLOG_ARTICLE_198929.HTM 如何在FPGA设计环境中加时序约束    在给FPGA做逻辑综合和布局布线时,需要在工具中设定时序 ...

  7. Azure环境中Nginx高可用性和部署架构设计

    前几篇文章介绍了Nginx的应用.动态路由.配置.在实际生产环境部署时,我们需要同时考虑Nginx的高可用性和部署架构. Nginx自身不支持集群以保证自身的高可用性,商业版本的Nginx+推荐: T ...

  8. Nginx技术研究系列7-Azure环境中Nginx高可用性和部署架构设计

    前几篇文章介绍了Nginx的应用.动态路由.配置.在实际生产环境部署时,我们需要同时考虑Nginx的高可用性和部署架构. Nginx自身不支持集群以保证自身的高可用性,商业版本的Nginx+推荐: T ...

  9. 理解Docker(6):若干企业生产环境中的容器网络方案

    本系列文章将介绍 Docker的相关知识: (1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 ...

随机推荐

  1. 新版本ButterKnife的配置

    新版本的ButterKnife的添加方式发生了变化,然后摸索着记录了一下. 按照ButterKnife的官网描述,使用ButterKnife需要在Gradle中添加如下依赖: compile 'com ...

  2. codevs2622数字序列( 连续子序列最大和O(n)算法)

    /* 算法描述:维护一个s[p]表示累加和 并且更新最大值ans 如果s[p]<0 则从p+1重新累加 证明:设某个区间的起点和终点分别为s t 分两种情况 1.t<p:设s2表示1到s的 ...

  3. phpmyadmin安装出错,缺少 mysqli 扩展。请检查 PHP 配置

    下载了个phpmyadmin最新版本的,始终显示这样的内容,求助.如何解决哈?>缺少 mysqli 扩展.请检查 PHP 配置. <a href="Documentation.h ...

  4. c#使用Microsoft Excel 12.0 object Libary导出的Excel文件office2003不能打开!!~~(分享)

    -----转载:http://hi.baidu.com/zhang_zhu_1/item/f3d47d1f86bf037a70d5e87e 使用C#导出数据到Excel文件时,Excel 2007组件 ...

  5. 使用EditText搜索listview里面的内容,实现Listview跟随变动的情况

    1.布局的XML文件里面添加EditText控件(省略)控件id=mSearch ListView的id=admin_lv; 2.一.获取ListView展示的数据(通过适配器获取) 二.这个是我要说 ...

  6. UISegmentControl 、UIStepper

    UISegmentControl .UIStepper UISegmentControl 1. UISegmentedControl *segmentControl = [[UISegmentedCo ...

  7. QFormLayout

    这个是官方的文档,现在还没有翻译,有时间自己会把这个好好的翻译一下. QFormLayout类是用来管理表格的输入部件以及和它们相关联的标签. 也就是说QFormLayout这个布局一般情况下是用来在 ...

  8. 【USACO 1.4.4】母亲的牛奶

    [题目描述]  农民约翰有三个容量分别是A,B,C升的桶,A,B,C分别是三个从1到20的整数, 最初,A和B桶都是空的,而C桶是装满牛奶的.有时,约翰把牛奶从一个桶倒到另一个桶中,直到被灌桶装满或原 ...

  9. MyBatis学习笔记(2)——缓存

    一级缓存:基于PerpetualCache的HashMap本地缓存,其存储作用域为Session,当Session flush或 close之后,该Session 中的所有Cache将被清空 二级缓存 ...

  10. js变量声明与赋值以及函数声明

    if (!("a" in window)) { var a = 1; } alert(a); 结果:undefined 分析: 首先,所有的全局变量都是window的属性,语句 v ...