实践分享 | 云原生技术在离线交付场景中的实践
软件产品只有交付到用户手中才有价值,本人在面向政府等 ToG 场景的软件交付领域具有数年的工作经验,深知其中痛点。今天借助这篇文章,分享这些痛点以及我的解决之道。
提出问题
本人供职的公司,其主要客户群体是省内的政府部门,所开发的业务系统是服务于政府内网之中的移 动APP。作为交付负责人,我一直苦恼于如何将一套基于 Spring Cloud 框架开发而来的服务端业务系统交付给我的客户。完成软件系统的交付只是万里长征第一步,如何处理后期的运维工作也是必须面对的问题。政府场景的特殊性,为我的工作平添了许多不利因素,这些 ToG 场景交付的痛点,且听我娓娓道来。
离线环境交付
与公网环境隔离,与公司网络隔离,完全的离线场景是政府交付工作中的标配特征,也是 ToG 交付最大的痛点。相信离线环境交付是所有的交付工程师都不想面对的场景,这意味着所有的交付物必须在事先准备好,交付过程中一旦出现任何遗漏和错误,都意味着明天必须再来现场一次。
交付环境不统一
如果你从事过面向政府的交付工作,那多半会遭遇过交付环境不统一的情况。由于各级政府部门的 IT 建设脚步不一样,同样一套业务系统,在交付到市级部门时,得到的硬件设施可能是一台物理服务器,而到了省级部门时,则可能得到了私有云提供的数台虚拟机。值得庆幸,物理机与虚拟机的差异并不大。然而近年来政府的 IT 建设一直在向国产自主可控的方向前进,当省级部门要求使用鲲鹏Arm架构CPU,亦或是使用国产麒麟操作系统进行交付时,和市级部门交付环境的差异就已经非常大了。我甚至不得不将同一套业务系统在两级部门的交付当作完全不同的两个项目来对待。这体现出不同交付环境之间的差异,而当我转身看向公司开发环境时,开发环境与交付环境的差异,已经开始让我听到自己头发落到地面的声音了。我很难确定事先准备好的交付资源,在甲方环境部署时会否遭遇操作系统以及硬件设施差异所导致的依赖性冲突问题。这种问题在离线环境下又被放大,我甚至不具备连接公网安装软件包来调试解决依赖性冲突问题的能力。
缺乏自动化运维能力
将软件交付到客户环境中,只是最初级的目标,在合同期内维护软件系统稳定运行是对交付质量更高层次的考验。依照个人经验,在一个软件交付项目中,交付部署的工作量,不及后期运维工作量的一半。我们是不希望所有的软件问题都需要工程师亲自抵达现场解决的,一来无法保障 SLA 服务协议中的时间承诺,其次也会消磨工程师的工作热情。在离线环境下如何构建起一套具备自动化运维能力的软件运行环境,变得尤为重要。依靠自动化运维能力,让一些软件故障得以自愈,在一定程度上降低了政府交付场景中的运维难度。但选择任何一种技术实现自动化运维的目标都是需要付出代价的,这意味着我需要在软件系统交付之前,先行在交付环境中组装一套稳定可靠的自动化运维平台。
过度依赖核心人员
在离线化的政府交付场景中,常常面临如下问题:一是交付环境难以统一时,其中特殊之处只被少数全程参与项目交付的工程师所了解,而实际经验告诉我们,这些特殊之处往往是一些异常情况的根源;二是离线的工作环境使得工程师通过查询资料来解决问题变成一种奢望,反向提高了对于工程师的经验和技能的技术要求,因此,“合格”的驻场运维工程师很难招到。以上问题造成了一些运维工作过分地依赖某些核心技术人员的局面,一旦核心技术人员离职或者调岗,对当前的业务连续性将会造成较大影响。所有的这些对人的依赖,都在某个靠谱的驻场工程师希望另谋高就,向我提出辞职申请时痛击我的脑神经。
持续交付困难
软件交付并非一次性工作。从项目管理的角度来说,用户很难在一开始就提出具体且可落实的需求,具体的项目范围会随着项目的推进逐渐确定,这是一个渐进明细的过程。而在软件产品交付的过程中,这种渐进明细体现在交付的产品会经过多次迭代,每次升级后的产品,都距离用户的最终需求更近一步。而这个持续交付的过程,在离线环境中,所遭遇的难处并不亚于首次交付,甚至会在某些需要回滚的场景中更加复杂。在微服务时代,一套完整的业务系统往往包含了几十个独立的组件,组件数量也为持续交付添加了复杂性。
驻场开发难
驻场开发是一种在政府交付场景中常见的需求。标准的软件产品往往是不能直接满足甲方需求的,这就需要我们的开发人员可以在甲方办公室直接定制开发指定的几个组件,并快速更新到线上环境中去,供甲方验证。在实际场景中,多数微服务功能是固定的,只有一两个 jar 包需要频繁更替。
以往的经历
我经历了公司软件产品交付的完整变革流程。从最开始的 jar 包交付,继而引入容器化技术交付镜像,到后来采用 Kubernetes 容器编排技术,我们始终围绕着复杂的离线环境进行软件产品的交付工作。每个阶段或多或少的解决了上述各种痛点,所付出的代价也不尽相同。最终我们拥抱了云原生技术,将业务系统整体作为新的对象实践了较为简单可靠的离线环境交付,同时兼顾了以往各种痛点。