4.8.2 架构定义
从技术的角度,云原生架构是基于云原生技术的一组架构原则和设计模式的集合,旨在将云应用中的非业务代码部分进行最大化的剥离,从而让云设施接管应用中原有的大量非功能特性(如弹性、韧性、安全、可观测性、灰度等),使业务不再有非功能性业务中断困扰的同时,具备轻量、敏捷、高度自动化的特点。由于云原生是面向"云"而设计的应用,因此,技术部分依赖于传统云计算的3层概念,即基础设施即服务(IaaS)、平台即服务(PaaS)和软件即服务(SaaS)。 云原生的代码通常包括三部分:业务代码、三方软件、处理非功能特性的代码。其中"业务代码"指实现业务逻辑的代码;"三方软件"是业务代码中依赖的所有三方库,包括业务库和基础库;"处理非功能特性的代码"指实现高可用、安全、可观测性等非功能性能力的代码。三部分中只有业务代码是核心,是给业务真正带来价值的,另外两个部分都只算附属物。但是,随着软件规模的增大、业务模块规模变大、部署环境增多、分布式复杂性增强等,使得今天的软件构建变得越来越复杂,对开发人员的技能要求也越来越高。云原生架构相比传统架构进了一大步,从业务代码中剥离大量非功能性特性到IaaS和PaaS中,从而减少业务代码开发人员的技术关注范围,通过云服务商的专业性提升应用的非功能性能力。具备云原生架构的应用可以最大程度利用云服务和提升软件交付能力,进一步加快软件开发。
1.代码结构发生巨大变化
云原生架构产生的最大影响就是让开发人员的编程模型发生了巨大变化。今天大部分编程语言中,都有文件、网络、线程等元素,这些元素为充分利用单机资源带来好处的同时,也提升了分布式编程的复杂性。因此大量框架、产品涌现,来解决分布式环境中的网络调用问题、高可用问题、CPU争用问题、分布式存储问题等。 在云环境中,"如何获取存储"变成了若干服务,包括对象存储服务、块存储服务和文件存储服务。云不仅改变了开发人员获得这些存储能力的界面,还在于云服务解决了分布式场景中的各种挑战,包括高可用挑战、自动扩缩容挑战、安全挑战、运维升级挑战等,应用的开发人员不用在其代码中处理节点宕机前如何把本地保存的内容同步到远端的问题,也不用处理当业务峰值到来时如何对存储节点进行扩容的问题,而应用的运维人员不用在发现"零日漏洞(zero-day)"安全问题时紧急对三方存储软件进行升级。 云把三方软硬件的能力升级成了服务,开发人员的开发复杂度和运维人员的运维工作量都得到极大降低。显然,如果这样的云服务用得越多,那么开发和运维人员的负担就越少,组织在非核心业务实现上从必须的负担变成了可控支出。在一些开发能力强的组织中,对这些三方软硬件能力的处理往往是交给应用框架(或者说组织内自己的中间件)来做的。在新时代云服务商提供了更全面的服务,使得所有软件组织都可以由此获益。这些使得业务代码的开发人员技能栈中,不再需要掌握文件及其分布式处理技术,不再需要掌握各种复杂的网络技术,从而让业务开发变得更敏捷、更快速。
2.非功能性特性大量委托
任何应用都提供两类特性:功能性特性和非功能性特性。功能性特性是真正为业务带来价值的代码,比如建立客户资料、处理订单、支付等。即使是一些通用的业务功能特性,比如组织管理、业务字典管理、搜索等也是紧贴业务需求的。非功能性特性是没有给业务带来直接业务价值,但通常又是必不可少的特性,比如高可用能力、容灾能力、安全特性、可运维性、易用性、可测试性、灰度发布能力等。 云计算虽然没有解决所有非功能性问题,但确实有大量非功能性,特别是分布式环境下复杂非功能性问题,被云计算解决了。以大家最头疼的高可用为例,云计算在多个层面为应用提供了解决方案等,如虚拟机、容器和云服务等。
- (1)虚拟机。当虚拟机检测到底层硬件发生异常时,自动帮助应用做热迁移,迁移后的应用不需重新启动而仍然具备对外服务的能力,应用本身及其使用用户对整个迁移过程都不会有任何感知。
- (2)容器。有时应用所在的物理机是正常的,只是应用自身的问题(比如bug、资源耗尽等)而无法正常对外提供服务。容器通过监控检查探测到进程状态异常,从而实施异常节点的下线、新节点上线和生产流量的切换等操作,整个过程自动完成而无须运维人员干预。
- (3)云服务。如果应用把"有状态"部分都交给了云服务(如缓存、数据库、对象存储等),加上全局对象的持有小型化或具备从磁盘快速重建能力,由于云服务本身是具备极强的高可用能力,那么应用本身会变成更薄的"无状态"应用,高可用故障带来的业务中断会降至分钟级;如果应用是N:M(N台客户端中的每一台都可以访问到M台服务器)的对等架构模式,那么结合负载均衡产品可获得很强的高可用能力。
3.高度自动化的软件交付
软件一旦开发完成,需要在组织内外部各类环境中部署和交付,以将软件价值交给最终用户。软件交付的困难在于开发环境到生产环境的差异,以及软件交付和运维人员的技能差异,填补这些差异往往需要一大堆安装手册、运维手册和培训文档等。容器以一种标准的方式对软件打包,容器及相关技术则帮助屏蔽不同环境之间的差异,进而基于容器做标准化的软件交付。 对自动化交付而言,还需要一种能够描述不同环境的工具,让软件能够"理解"目标环境、交付内容、配置清单并通过代码去识别目标环境的差异,根据交付内容以"面向终态"的方式完成软件的安装、配置、运行和变更。 基于云原生的自动化软件交付相比较当前的人工软件交付是一个巨大的进步。以微服务为例,应用微服务化以后,往往被部署到成千上万个节点上,如果系统不具备高度的自动化能力,任何一次新业务的上线,都会带来极大的工作量挑战,严重时还会导致业务变更超过上线窗口而不可用。