效能平台研发篇(一)——开发环境管理之困

前言

面对高频迭代开发模式,开发者需要面对大量需求,传统开发模式会常备多套环境,但如果开发者想独立拉起一套专用环境,不仅费时费力,而且资源成本也是难以招架的,无人使用时产生数倍资源浪费,根据需求动态创建开发环境的场景应运而生,本文将带你了解动态环境隔离带来的绝佳开发体验。

理想的动态环境隔离

理想的测试环境是怎样的?我们认为理想的测试环境需要做到以下几点:

一、可根据开发需求创建部分应用组成新的环境,其余应用则使用基础环境,而不必为了调试一个应用而启动所有服务,节省环境资源。

二、独占式随意使用,可重启,可调试,可断点。当团队有多名开发者进行多人并行开发的时候,如果共用一套测试环境就会出现相互干扰的情况。比如当我正在重启测试环境的时候,就可能影响到其它开发者的测试工作。因而理想的测试环境应该是“独占式”的,彼此不干扰。

三、多个依赖服务版本同时在线,想测哪个随时切换。当进行大版本更新的时候,我们可能既要测试新版本的兼容性,又要测试老版本的兼容性, 这就要求多个依赖服务版本同时在线,并且可以随时切换。

简单总结一下,理想的测试环境应该是:自由连接、随时可用、互访可控。

开环境问题现状

那么现实中的环境并非这么理想。

一、通常本地的开发机往往是不具有公网IP的机器,大多会使用内网IP地址,这样测试环境要回到本地环境时候是不通的。特别是在 在Kubernetes集群中,每个Pod都会被赋予一个Cluster IP,Cluster IP是一个在Kubernetes集群中特有的内网IP,我们在本地访问Cluster IP也是调不通的。这就造成了本地/集群双向均不通。

二、通常环境通常是共用的,多个需求在同一套环境上开发,这就会造成前文提到的相互干扰、调用和消息互串等问题。

三、如果开发者想独立拉起一套专用测试环境,不仅费时费力,而且资源成本也是难以招架的。

总之,现实中的测试环境:无法直连、稳定性差、流量混杂。

动态环境隔离实践

以上提到的测试环境管理之困,总结一下主要有两点:一是本地和集群之间网络互通的问题;一个是多环境时,路由的流量染色,怎样做到不同环境相互间不干扰这些问题。

下面我们重点讲解“项目环境隔离”。项目环境隔离是基于 Istio 路由流量染色、中间件消息染色的虚拟环境,从表面上看,每个项目环境都是一套独立完整的测试环境,由一系列服务组成集群,而实际上,除了个别当前使用者想要测试的服务,其余服务都是通过路由系统和消息中间件虚拟出来的,指向公共基础环境的相应服务。

如上图所示,在某个开发项目中,我们有公共基础环境和三个独立的项目环境(项目环境)。服务A、服务B、服务C、服务D共同组成了完整的公共基础环境,在项目环境-2中只部署了“服务C”,但对于项目环境-2的使用者而言,他可以通过路由调用公共基础环境中的其它服务,因此他会认为项目环境-2就是一个完整的独立的测试环境。同样的道理,对于开发者而言,他们认为项目环境-1和项目环境-3也同样是完整的独立的测试环境。

我们创建一套“项目环境”肯定是比创建一套包含所有服务的测试环境的成本要低。本质上是基于消息路由的控制,实现集群中部分服务的复用。在这种机制下,许多外表庞大的独立测试环境实际只需要消耗极小的额外基础设施资源,即使给每个开发者配备一套专用的测试环境都是可行的。

  • 开发者会觉得自己坐拥整个服务集群,所有测试服务IP地址都可以由本地直接访问,随时进行断点、单步调试、重新部署服务等操作,而丝毫不会影响到其他人;
  • 当多人协作研发软件时,每位开发者同一时刻只能属于同一个隔离域,同一个隔离域里面的服务相互可见,并且当出现服务调用的时候,会优先调用隔离域里面的服务。不同隔离域里面的服务相互之间不可见,是互不影响的;
  • 由于我们是通过“染色”(打标签)的方式实现的隔离,这种隔离方式非常的灵活,假如某位开发者前面在跟第一个项目进行联调,调试结束后,他想把该服务放入第二个项目中进行调试,他只需要把自己的服务从一个项目环境退出,进入另一个项目环境即可,实现灵活组队协作。

总结

关于“项目环境隔离”主要通过 kt-virtual-environment 这个开源工具来实现,有效避免了传统开发模式会常备多套测试环境,节约了开发环境资源成本。具体方案会在本系列分享的第二章内容中讲述。

猜你喜欢

转载自juejin.im/post/7107553756593520677