网站建设费计入哪个科目,wordpress手机版下载,现在建网站软件,wordpress 弹幕插件简介#xff1a;开发之痛#xff1a;稳定的测试环境#xff0c;怎么就那么难。对于生产环境#xff0c;准确、稳定最重要#xff0c;我们推荐以应用为中心的基于OAM和IaC的实践方式#xff1b;对于测试环境#xff0c;隔离、低成本和稳定的依赖是最重要的#xff0c;我…简介开发之痛稳定的测试环境怎么就那么难。对于生产环境准确、稳定最重要我们推荐以应用为中心的基于OAM和IaC的实践方式对于测试环境隔离、低成本和稳定的依赖是最重要的我们推荐基于稳定环境的隔离测试环境的实践复用稳定环境通过流量隔离和数据隔离来生成测试环境。通过环境建设我们解决了研发过程中的资源冲突。 专栏策划雅纯
志愿编辑jimmy、吕瑞星
“对于生产环境准确、稳定最重要我们推荐以应用为中心的基于OAM和IaC的实践方式。
对于测试环境隔离、低成本和稳定的依赖最重要我们推荐基于稳定环境的隔离测试环境的实践复用稳定环境通过流量隔离和数据隔离来生成测试环境。“
以下是详细内容。
环境这个概念大多数开发者都很熟悉。一个稳定、可预期、低成本的环境也是大家一致的诉求。
如下图所示,我们将环境分为生产环境、测试环境、开发环境3类。很多时候我们会把生产环境、测试环境、开发环境隔离开就像图上的那个防火墙一样分为线下环境和线上环境。 但在实际情况下考虑公司体量和开发成本等诸多因素环境的使用和划分会发生一些变化。
例如基于成本考量首先要保证的是生产环境一切以提供服务为核心要务其次是测试环境在迁移至线上环境之前我们需要在类似于生产环境的测试环境中进行相应的验证只有在测试环境中验证无误才可以迁移至生产环境从而保证系统稳定的过渡。
生产环境 对于生产环境准确、稳定的运行是相当重要的也产生了大量的运维和治理的诉求。
如果测试环境给配置一个节点就够了生产环境就要考虑备份、主备、分流、容灾等诸多问题其目的都是为了保障环境的稳定运行。
准确、稳定是生产环境和别的环境的最大区别。这一特点带来了大量的运维的和服务治理的配置诉求如何有效维护这些配置也是我们基于OAM模型、以IaC的方式来管理配置的初衷上篇文章中有做分享。
小编注云效AppStack正是基于OAM的云原生应用交付平台企业可以通过应用编排、占位符、变量等声明式定义实现一套编排多环境差异化部署同时基于版本和基线实现环境一键拉起、一键回滚。感兴趣的同学点击文末阅读原文可以免费使用。生产环境包含了很多种配置如应用配置、应用镜像、应用运维配置、基础设施运维配置等。这些不同的配置和镜像的内容是由不同的同学关注和管理的。
开发修改代码代码发布会改变镜像和配置应用运维会主动修改应用运维配置基础设施运维会修改基础设施配置。所有的配置改动都会对生产环境产生影响带来生产环境的变化进而可能带来风险。
因此生产环境的运维和和管理显然应该是由开发和运维来共同负责的。
测试环境 测试环境是另一类重要环境。测试环境包含两种类型一种是集成环境一种是预发环境。预发环境也就是类生产环境。集成环境主要用于集成测试或者功能性的验证预发环境主要在验收的过程中使用。 测试环境的目标是用尽可能少的资源进行独立的测试做到隔离、复用、模拟。
例如应用要跟外部的服务交互如果外部服务有问题可以在测试环境中模拟一个。 以某大数据产品为例大数据产品大家可能会觉得环境要求太高了没有办法做测试环境很多的技术服务如Hive、Kafka、MySQL对机器的要求会很高Hive、Kafka需要有很多的机器。另外还需要Redis做缓存、Zookeeper做服务发现。最早的时候就一套测试环境这个显然是很低效的。如果有50个开发共享一套测试环境频繁冲突的情况下几乎没有办法做测试。
为了解决这个问题服务和应用可以做一些分层这里分成三层。首先是公共的基础服务比如Hive、Kafka然后是独立的小服务比如Redis、Zookeeper。在测试环境下Redis和Zookeeper全部用单点是没有问题的可以在一台虚拟机上跑起来最上层是应用只部署必须的应用以完成所要的测试工作。
因此测试环境将会这么管理首先所有的公共服务是共享的基础服务所有的测试环境都依赖这些基础服务各个环境的数据通过逻辑机制如命名空间进行隔离。在每一个测试环境会部署一套独立服务的Redis、Zookeeper。
应用层只部署所需要的应用这样基本可以做到只消耗很小的资源就可以部署一套测试环境。很多的测试资源利用率很低如果完整的搭一套环境的话你会发现99.99%的情况下资源利用率都很低。
另外测试环境都应当是临时环境这一点很重要。如果把测试环境用作长期环境使用者会习惯某个环境就是他的例如给环境起名字这个环境其他人不能用而这样会造成很大的浪费毕竟每天使用的时间都是有限的。我们希望测试环境的资源是一个池子可以被复用用完即销毁。这也同时要求提高测试效率在最短的时间内做更多的测试。
开发环境 开发环境是除了上文我们说到的生产环境和测试环境之外涉及最多的环境比如开发、构建要用到的一些工具链都属于开发环境的范畴。在开发环境下我们的关注点是在本地上怎么把服务顺畅跑起来。
理想的开发环境可以跟其他的服务打通且双向连通因此有3个需要解决的问题首先这个开发环境怎么访问基础环境中的服务比如另外一个Service。第二个是怎么让其他服务访问到我们开发中的服务。第三个是怎么与其他的开发环境的请求和数据隔离。这也是我们在前面测试环境遇到的类似的问题因此在开发环境之间也需要类似的手段云效团队开源的kt-connect就是为了解决这个问题而设计的一个工具。 在开发环境里也会有相应的一些工具如上图所示。大家也可以看一下你常用的有哪些。
测试环境之痛
很多公司、很多人一提到测试环境就会说测试环境不够用、测试环境不稳定。我们在测试环境中会面临哪些挑战尤其是分布式应用。在微服务化之后分布式所面对的挑战也越发明显这些挑战很多和环境有关。 例如某个应用变化没有做很好的验证无意间进入到集成环境。这样它进入集成环境的时候本身质量是无法保证的。而在集成测试阶段应用之间的关系非常复杂一个服务不稳定其他的链路都很有可能不稳定。
这也导致我们经常没有办法很好地进行日常集成测试。因为前面的过程没有办法保证这个时候变化的应用会占用预发环境而预发环境又是一个相对高成本的环境不可能经常被某个人占用。于是为了能让所有人都可以使用预发对预发的使用将会变成很多人批量进行这样预发变成长期环境带来的后果就是预发的时间增长整个开发周期和交付周期都会增长。在持续交付的流程当中我们在测试环境当中会面临非常多的挑战不稳定的问题、资源的问题、集成的问题等。
就目前来说大家会遇到的比较多的测试环境的问题大都源自服务没有进行有效的治理。服务方法多耦合高一旦某个服务出现问题其他的都会受到影响。当一个环境的服务都是处在变化中时由于随时都有不稳定的服务在部署整个环境也将是不稳定的。
集成环境无法稳定的后果是大量的测试迁往预发预发成为瓶颈之后又往线上迁移。任何应用最终都会用线上环境来兜底。
总结来看测试环境主要面临如下2个挑战
第一个是如何解决服务之间的依赖。比如A对C的强依赖A的功能成功与否取决于C而且C变化之后也要在A上面做相应的验证保证C的变化是对的。 另外一个是环境本身的主要有2点一个是机器的稳定性另一个是服务本身的稳定性。 机器的稳定主要是有效应对硬盘故障网络故障等情况做好系统的备份和容灾。
服务本身的稳定主要是有效确保每个服务自身的可用性因为假如一个应用的可用性是90%的话那10个应用就是90%的10次方导致整个的系统都会很低。
如何保证测试环境的稳定性 上文我们说到了测试环境存在的两种挑战。任何测试环境都需要保证其稳定性降低使用线上环境的风险。那么如何保证测试环境的稳定性呢
在测试环境中常用的实践主要有双机部署、N1部署、隔离环境等。 例如我们一个应用至少部署两个Pod保证至少一个在提供服务不能让两个同时重启。确实会发生这样的情况在某个测试环境如果某个服务只有一个副本该服务发生部署导致重启会导致整个测试的不可用。在这种情况下双机部署是很好的快速解决手段但也占用了较多的资源。 为了解决双机部署资源占用高的缺点N1的部署方式应运而生。采用滚动的方式逐个替换服务应用。这样你的机器就只有一个是处于变化当中其他都是work的。这也是K8S默认的方式一般会生成新的实例然后再把旧的实例下掉。 为了保证测试系统的稳定性我们需要做隔离尽量做到除自己修改的应用其它应用都是稳定的。
在阿里团队引入了项目预集成环境在阿里内部叫项目环境这是一个隔离出来的环境针对某一个特性在开发的阶段单独的拉取一个环境出来。
综上所述预集成环境是隔离的跟谁都没有关系所依赖的其它服务都来源于稳定的环境以保证依赖的服务都是稳定的以便进行独立的开发和测试。
在项目早期的时候项目预集成环境里依赖的环境还是日常集成环境无论如何肯定比什么都不做直接放入日常集成环境里面好很多。这个时候我们发现日常集成环境还是有问题因为在项目初期并不能保证所有的提交都会在项目预集成环境去做验证因此会导致日常集成环境里面的依赖也可能存在很大的问题其实本质上又回到了我们要治理日常的集成环境的事情怎么样维持相对稳定。 针对上述问题我们引入稳定环境的概念。既然我们将环境隔离出来了但隔离依赖的基础环境不稳定这个时候假如我们有一个稳定的环境是否就能解决问题了呢
什么样的环境是稳定环境呢就是能够发布到线上版本的环境线上环境肯定是稳定环境所以我们的稳定环境其实是由与线上版本一致的应用服务组成的跟线上的服务是一致的。线上稳定这个环境就是稳定的所以我们就可以在这种稳定环境下再去创造隔离环境从而保证整体稳定性。
当有了稳定的基础环境在应用部署到生产环境之后也同样要把它部署到基础环境中去提供一个给测试环境作为依赖的基础环境。有了这样一个基础环境依赖在我们应用开发时拉出来的环境就是完全隔离的只包含和我紧密相关的几个变化当中的应用其余所有的依赖的服务都是从基础环境里面来的。
这里提到了基础环境的概念那么什么是基础环境呢基础环境是一个稳定的环境当有了一个稳定的集成环境就可以做隔离的环境特性测试将可以基于该隔离环境依赖的流量也可以在隔离环境里面找。但基础环境有一定的维护成本虽然部署成本相对来说很低其占用的机器资源相对于一般大公司来说不是太大的问题但对小公司可能是一个问题。但主要的成本是基础环境的维护对基础环境进行监控并修复出现的问题这在人力上需要一定的投入。
基础环境的维护者一般不是这个环境的使用者所以这个时候需要有一个比较成熟的机制保证基础环境长期稳定的运行。我们开一下脑洞如果说没有新的基础环境哪一个环境是最稳定的呢我们在前面把线上线下用防火墙隔开了为什么隔开大家都知道我们是怕安全风险怕数据污染但是如果我们的隔离能力做的足够好服务路由做的足够好监控做的足够好安全保护做的足够好我们是可以用生产环境来做基础环境的。
生产环境做基础环境要解决两个重要的问题第一个是流量隔离流量隔离相对来说问题不太大从以前面向资源到现在面向流量的隔离有很多现成的手段可以做。第二个是数据隔离。这个是挺大的挑战数据形式有很多种比如说消息队列和普通的数据库不一样数仓又不一样很多麻烦的问题在这里但是具体到某一个点上都有办法解决。
小结
总结一下对于生产环境准确、稳定最重要我们推荐以应用为中心的基于OAM和IaC的实践方式对于测试环境隔离、低成本和稳定的依赖是最重要的我们推荐基于稳定环境的隔离测试环境的实践复用稳定环境通过流量隔离和数据隔离来生成测试环境。通过环境建设我们解决了研发过程中的资源冲突下一章我们将关注研发过程中的协作问题。
原文链接
本文为阿里云原创内容未经允许不得转载。