在目前快节奏的移动互联网时代,快速把握瞬息万变的市场需求,以最短时间上线自己的应用以抢占市场,成为众多企业在竞争白热化的市场洪流中占有一席之地的制胜利器。天下武功唯快不破,显然传统的开发模式已经无法适应这种快节奏的市场需求,在此背景下催生出敏捷、精益、DevOps等新概念的诞生,尤其以云原生为代表的下一代架构更是进入火箭式发展阶段,以容器、Kubernetes、Serverless等为代表的新技术引领移动互联网进入急速赛道。
云原生不是某个单独的技术,而是技术与管理方法的合集。为便于读者在了解实践云原生架构的方法之前能有一个系统性的思维,在此详解云原生基础架构的代表技术,及利用云原生构建出来的云原生应用的特征。
容器
正如我们现实世界中的集装箱技术加速了贸易全球化的进程,容器技术的出现也解决了微服务架构下大量应用部署的问题,容器的环境自包含特性,可以让我们一次构建,到处运行,其不仅解决了虚拟机所能够解决的问题,同时也能够解决由于资源要求过高虚拟机无法解决的问题。容器的特点主要包括:隔离应用依赖、创建应用镜像并进行复制、创建容易分发的即启即用的应用、支持实例简单、快速地扩展等。
Docker 是当前流行的开源应用容器引擎,基于 Docker 容器化技术,用户可以将微服务及其所需的所有配置、依赖关系和环境变量打包成容器镜像,并轻松移植到全新的安装了 Docker 的服务器节点上,运维人员无须关心底层操作系统,且无须重新配置环境,这使得容器成为部署单个微服务的最理想工具。
不可变的基础设施
在传统的物理服务器或虚拟机部署方式,因其每个都有自己的特征,我们称之为宠物,当部署在宿主机上的应用出现故障,我们需要对症下药,排除问题恢复业务,但是在云原生架构下,我们称部署方式为牲畜,一旦应用部署完成之后,那么这套应用基础设施就不会再修改了。如果需要更新,那么需要现更改公共镜像来构建新服务直接替换旧服务。而我们之所以能够实现直接替换,就是因为容器提供了自包含的环境(包含应用运行所需的所有依赖),所以对于应用而言,完全不需要关心容器发生了什么变化,只需要把容器镜像本身修改即可。因此,对于云友好的基础设施是随时可以替换和更换的,这就是因为容器具有敏捷和一致性的能力,也就是云时代的应用基础设施。
容器编排引擎相关工具有 Kubernetes 、Swarm 等,用以解决容器的管理和调度问题。目前,由 Google 开源的 Kubernetes基本算是统一了容器编排的市场,实现了容器集群的自动化部署、扩缩容和维护等功能。
Kubernetes 与 Docker 相互配合、相辅相成,其中 Docker 是作为 Kubernetes 内部使用的低级别组件,而 Kubernetes 又可以高效管理调度 Docker 集群。
声明式的API
声明式不同于命令式,通过向工具描述自己想要让事物达到的目标终态,然后由这个工具自己内部去计算和实现如何令这个事物达到目标状态。简言之,声明式设计中,描述的是目标状态,其中就为我们极大的简化了实现过程中的异常情况及调度过程,我们只需要关注结果,无论使用什么方式,结果总是朝着我们定义的方向逼近,声明式设计也是一种设计理念,同时也是一种工作模式,它使得系统更加健壮。
微服务
微服务相较于单体应用,将架构进行拆解,解决了单体应用后期难以扩展和低效的开发效率等问题。根据领域模型将巨大的单体分成界限清晰的微服务,并保持每个服务独立可以迭代,具有服务高度自治、高效迭代、易于扩展和支持多语言编程等优点。
在我们享受微服务的灵活、开发的敏捷带来的利好时,对于众多的微服务,在运维、监控、部署、及分布式事务,服务之间的调用也提出了新的挑战。
服务网格
微服务之间该如何实现调用,以及中间的调用策略该如何执行,此刻就需要用到服务网格。目前服务网格架构有侵入式和非侵入式两种架构,区别在侵入式需要在开发框架中进行集成,需要使用SDK来实现一部分功能;非侵入式架构在部署阶段以sidecar模式与业务运行结合,通过接管网络流量实现透明代理,从而实现一系列网络策略及监控,开发者仅需专注业务即可,无需对代码进行修改,这种方式以服务网格(Service Mesh)为代表,让应用更加轻量,目前最火的服务网格技术有Istio、Linkerd、Dubbo Mesh等,将其下沉到基础设施层,用户可以快速编排出复杂环境、复杂依赖关系的应用程序,同时开发者又无须过分关心应用程序的监控、扩展性、服务发现和分布式追踪这些烦琐的事情,从而更专注于自身业务程序开发。