目录

3.1应用程序生命周期:考虑不断的变化--运维同理心

3.2举例:多实例应用程序生命周期管理方案

3.2.1蓝 / 绿升级

3.2.2滚动升级

3.2.3并行部署

3.3协调多个不同的应用程序生命周期(案例:密码轮换和应用程序生命周期)

3.4不可变的基础设施 -- 处理临时运行时环境之可监控

3.5不可变的基础设施 -- 处理临时运行时环境之可预测


3.1应用程序生命周期:考虑不断的变化--运维同理心

作为应用开发者需要考虑运维阶段云原生应用全流程的可持续性,不能做甩手掌柜。通过下图不难发现,在整个应用生命周期中,创建应用只是开端,一个完整的应用生命周期应该包含创建应用源码、应用运行时环境部署、应用程序配置、应用的开机与关机到最后应用的销毁。

云原生应用作为云原生的3个实体之一,其特点就是高度的分布式以及不断的变化。变化的原因多种多样,有可能因为基础架构的故障、OS升级、补丁升级等。

综上,在应用开发阶段需要关注云原生应用在整个生命周期内的可管理性、弹性、响应性、成本管理。应用程序应该高度的自动化部署,基于精准的监控及成本控制实现应用实例的弹性伸缩以及合适的响应时效性。

3.2举例:多实例应用程序生命周期管理方案

3.2.1蓝 / 绿升级

蓝 / 绿升级即同一时刻只投产一个版本的应用,升级流程更加简单,但需消耗更多的云计算资源。如下图,蓝色方框与绿色方框代表了2个不同的应用版本,为了实现从蓝到绿的平滑过渡需要借助流量负载均衡设备对用户请求进行调度。

在升级开始前LB设备将所有的用户请求调度到蓝色服务集群,当升级进程开启后为保证前后服务一致性我们微调了LB的负载策略以供业务一致性测试,我们不难发现为保证服务一致性我们同时创建了相同服务承载容量的服务器集群,即绿色方框所示。当业务测试完成后,我们第二次调整LB的负载策略,将所有业务流量迁移到绿色方框内的服务器集群,至此我们便完成了应用升级流程。

这里需要注意由于零停机时间的限制,在第二次修改LB调度算法时我们可以使用较为温柔的切换算法,比如我们可以使用所谓“软关机”策略,在不中断既有会话的前提下将新建会话与既有会话分别调度,即保持既有会话的连续性不影响原有用户,仅对新建会话生效绿色服务器集群LB调度策略。

通过以上讲解我们不难发现,由于需要并发维护2套服务器集群,所以需要投入相应资源,这种升级方式的缺点便是此,消耗更多的云计算资源。但其优点也是显而易见的,在业务回退时的便捷程度是所有升级方案中较高的。

3.2.2滚动升级

滚动升级,也称为分组交替升级,确保多版本对外仍是一个逻辑上的单一实体,多个版本同时运行使得版本迭代更加敏捷,相比蓝绿升级交替升级过程中消耗的资源更少。 这就要求软件架构师在软件开发设计阶段考虑到不同版本的对外发布一致性,不能由于版本因素导致集群对外服务异常。

滚动升级流程如下图所示,由于与蓝绿升级较为相似我就不再赘述,我们只需要注意第二点,在升级流程开始后LB需要采用适当的调度策略将前端业务请求调度到两个不太的服务器集群中(即下图V1\V2)。相比蓝绿升级交替升级过程中消耗的资源更少。

3.2.3并行部署

并行部署即同时部署多个版本的应用程序,不同版本的应用将长期存在,它可能是2个版本也可以是更多的版本,理论上只要LB支持我们可以同时创建无数个并行发布的应用。

我猜测大家对这种部署模式最不看好,但我几乎可以肯定大多数互联网企业都是这样做的,他们为不同用户提供不同版本的应用,虽然这种软件设计要求最高,因为需要保证该部署模式对消费者透明为消费者提供一致性的服务,前端负载均衡的调度策略也需要额外的会话保持设计但却为企业带来了与众不同的的业务模式。我举个例子,某互联网企业设计了3个不太的广告推广算法,通过一段时间的测量通过适当的控制变量推广,我们可以轻而易举的量化不同广告推广算法的回报率,从而为广告主以及广告推广平台带来双赢。

3.3协调多个不同的应用程序生命周期(案例:密码轮换和应用程序生命周期)

以上我们说的是单个逻辑体的升级流程,在云原生环境下我们还需要考虑更多的依赖调用关系,比如分布式系统中要考虑升级对消费者以及生产者的依赖关系。举个例子,我们需要更新数据库的访问密钥,而在消费者源代码中未有合适定义导致在升级中消费者不能正常访问数据库,这种情况就需要我们提前识别并采用合适算法规避。

既然说到这就为各位详细说明如何在云原生环境下协调多个程序的生命周期,我们拿密码轮换这个例子来说明。下图是我们计划升级的两组应用,我们采用以下2个取巧设计保证生产者在更换密码时对消费者无感知。

1)密码在程序启动时配置

2)为了支持0停机时间的密码更换,服务允许有多个密码

我们还是以最初的网站聚合服务为例,帖子关系服务需要调用帖子服务,我们的最终目标是更新帖子关系服务的调用密码即从“first secret”切换到“second secret”,与此同时业务不能中断。

在整个变更流程的第一步我们需要先升级生产者,为生产者注入1套新密码即消费者更新后的调用密码,第一步完成后的状态应该如下图所示。需要注意,变更后的生产者需要支持多密码适配,即生产者可以匹配消费者提交的密码中查询本地密码数据库,只要任意密码匹配即可成功访问本地服务。

变更第二步,消费者升级本地代码为变更后状态,即将调用密码更新为“second secret”。最后一步,我们再次更新生产者,即移除原有调用密码,以便完成整个密码轮换。

3.4不可变的基础设施 -- 处理临时运行时环境之可监控

通过前文我们已近知道了我们面对的应用实例是千奇百怪的,于是乎我们总结了以下几点云原生应用的特点。

  1. 不断的被创建,不断的被销毁,虽然违背了“稳定即是好事,变换即是坏事”传统观念,但在云计算中变化是不可避免的甚至可以带来一直新的稳定。
  2. 在应用实例开启、关闭时需要告知上下游的消费者与生产者。在广播依赖关系时还需要知道我们面对的是不可靠的网络、高度分布式的应用实例组件。
  3. 无论应用是否正常,都需要持续不断的探测,循环比较期望状态与实际状态,如果发现期望状态与实际状态不一致,需要考虑通过冗余机制对其进行修复。

循环监测

任何情况下都需要循环检测

为保证云原生应用在不断变化中保持稳定,需要给云原生应用赋能新的特性,即应用程序生命周期状态的可见性(可监控)。

这个可监控性需要覆盖整个应用生命周期,需要考虑服务间的依赖关系与服务的健康状态。而通过前面的学习我们不难发现,单实例服务监控相对简单,因为其状态无需告知上下游,但企业级应用往往存在极为复杂的集群间调用关系链。应用的状态也不仅仅是上图所示的几个过程,它肯定会更加复杂。比如,当应用开机后可以正常相应请求并正确对外发布自己的健康状态,突然。。。一个宇宙粒子来袭。。。它没了,就这样没了,它无声无息的没了,消失了,甚至没来得及告诉上游或下游调用者。

3.5不可变的基础设施 -- 处理临时运行时环境之可预测

可预测性确保了检测的准确性,或者我们可以这样说,正是因为应用响应结果的可预测我们才能为应用监控配置正确的监控参数。正是因为我们知道应用实例运行正常的响应结果让我们得以预测其异常行为下的响应结果。

如何做到容器的可预测性、重复性?

  • 不允许修改单个容器镜像(禁止SSH到容器内)
  • 重视日志、指标的获取(将日志视为事件流)

请允许我使用加粗红色斜体来概括保证容器可预测性、相应结果可重复性的两大方法。这没什么好说的,这就是金科玉律,任何情况下都不允许修改单个容器的镜像,因为容器始终在变化,上一秒一个正在对外发布的容器实例,下一秒可能就会被销毁,修改单个容器是毫无意义的,如果希望纠正某个错误请直接修改容器基镜像。当然,为了保证可以找出导致错误的蛛丝马迹,请务必重视日志的地位,将容器的所有动作、指标通过日志传递出来,保证容器的所有操作有迹可循。

云原生模式--设计拥抱变化的软件(三)相关推荐

  1. 春松客服:通过开源加云原生模式,大规模交付智能客服系统 | Chatopera

    什么是智能客服系统 客服系统可以说,在 20 世纪六十年代,就成为现代企业的基础了,美国贝尔实验室最早研发商用计算机,就是为了实现在呼叫中心自动化的调度电话网络的接线,也就是说,是客服系统的高强度的作 ...

  2. 云原生数据库设计新思路

    本文作者为 PingCAP 联合创始人兼 CTO 黄东旭,将分享分布式数据库的发展趋势以及云原生数据库设计的新思路. 在讲新的思路之前,先为过去没有关注过数据库技术的朋友们做一个简单的历史回顾,接下来 ...

  3. 文末福利|云原生下Java的变化与趋势?程序员为什么不喜欢低代码?答案在这里!...

    很多大型企业都面临着全球快速数字化的压力:"数字化企业"以全新的商业模式出乎意料地杀入市场.这期间,首席架构师和CTO扮演着非常关键的角色,他们能够综合运用技术能力.沟通技巧和组织 ...

  4. 解读华为云原生数据库设计原则,打破传统数据库上云瓶颈

    摘要:一个优秀的自研数据库产品应该要具备哪些特性呢? 在云计算技术不断成熟的背景之下,云数据库开始崛起,并因为按需扩展.按需付费等优异特性获得中小企业及互联网客户的青睐. 虽然数据库上云是必然,但并不 ...

  5. QT案例 使用QGraphicsView和命令模式设计完成流程图功能软件,参考QT官方流程图案例【diagramscene】

    之前总结资料时候,看到一个Qt实现流程的专栏,后面就想着参考这个项目和官方的[diagramscene]项目,自己再写一个流程图软件来总结学习下,于是就想到使用QGraphicsView来完成相关功能 ...

  6. 云原生架构应该怎么设计?

    简介:阿里巴巴为大量各行各业的企业客户提供了基于阿里云服务的解决方案和最佳实践,以帮助企业完成数字化转型,并积累了大量经验和教训.阿里巴巴将企业的核心关注点.企业组织与 IT 文化.工程实施能力等多个 ...

  7. 云原生应用程序的架构应该怎么设计?

    介绍 云原生是一种将应用程序构建为微服务并在容器化和动态编排平台上进行运行的方法,这些平台充分利用了云计算模型的优势.云原生关注的是如何创建和部署应用程序,而不是在哪里运行.这些技术使组织能够在现代的 ...

  8. 阿里云原生开源大家族加入中科院软件所开源软件供应链点亮计 - 暑期 2021

    来源 | 阿里巴巴云原生公众号 2021 年,由中国开源软件推进联盟 COPU 牵头发布了<2021 中国开源发展蓝皮书>,涵盖当今全球开源的总体情况分析.开发者分析.项目分析.领域案例, ...

  9. 直播回顾 | 子芽CCF TF:云原生场景下软件供应链风险治理技术浅谈

    CCF TF(技术前线委员会,Tech Frontier Committee)是中国计算机学会(CCF)为企业界计算机专业人士创建的企业间常态化合作交流平台,创始委员由Intel.LinkedIn.M ...

最新文章

  1. 安装pyqt和pycharm配置
  2. 【直播回放】2小时全面剖析图像分类任务,学习CV必知
  3. 浅析JavaScript解析赋值、浅拷贝和深拷贝的区别
  4. 蛮力写算法_蛮力算法解释
  5. 2.3 基本算法之递归变递推 放苹果 python
  6. Kubernetes-基本介绍/核心功能/相关术语(一)
  7. 周鸿祎谈李国庆夫妇互撕:大事男人说了算,小事才听女人的
  8. mysql滚动条不见了,11-JS处理滚动条
  9. html5片转为base64,base64和图片的互转(HTML5的File实现)
  10. 十分钟利用windows7漏洞破解开机密码
  11. 不要重新发明轮子_请重新发明轮子
  12. Banner轮播图的基本使用
  13. 零基础入门数据挖掘-Task3 特征工程
  14. 【学习笔记】《Writing Science》10-13
  15. python爬iptv直播源_GitHub - xkloveme/iptv-m3u: python 爬的直播源数据
  16. 前端文件上传,这8种场景
  17. Java面试常考的 BIO,NIO,AIO 总结
  18. android sqlite #039;,问题详情_百度云推送_免费专业最精准的移动推送服务平台
  19. 利用python实现Diebold-Mariano检验
  20. UG NX 12 定向到草图

热门文章

  1. 能用5GWiFi就别用2.4GWiFi
  2. 计算机dmax函数怎么用,Excel教程中DMAX 函数和DMIN 函数的用法和实例
  3. 自动生成艾宾浩斯记忆规律背单词时间表的Matlab脚本
  4. 踩坑日记:浏览器只能访问百度,但是百度出来的页面访问不了问题
  5. java 读取rom文件_Android -- 读写文件到内部ROM,SD卡,SharedPreferences,文件读写权限...
  6. Git命令:本地项目上传到git码云,新建分支 删除分支 合并分支
  7. js 获取get参数方法
  8. AWS 解决方案架构师考点(IAM)
  9. keras安装与配置指南_Keras-快速指南
  10. MacBook装双系统(装win7 64位)