1.2.3 云原生应用的特点

首先,我们给云原生应用下一个简单的定义:

一种基于容器构建的微服务应用,通过持续交付的方式部署在弹性的云基础设施上。

这样的描述可能比较片面,需要更详细的解释。所以和介绍云原生的定义一样,我们列举了一些核心的特性来帮助大家更好地理解什么是云原生应用。

1.容器化

云原生应用应该是容器化的。在现阶段,容器可能还是首选的打包和分发技术,与虚拟机相比,使用容器部署更简单,运行速度也更快,因此更适合云环境。将应用封装成容器,并使之成为独立自治的服务,可以实现独立部署,满足应用不断演进的需求,也能提高资源利用率。

2.服务化

云原生应用应该是以微服务,或者是无服务器架构风格存在的,即满足独立和松散耦合特性。应用根据业务或功能模块被拆分成服务,彼此独立部署,通过API进行交互。这种松散耦合的方式能极大增加应用在实现和部署时的灵活性,也与云平台的理念契合。我们可以简单地认为,云最主要的一种能力就是复制能力,服务化的应用更容易被复制。

3.独立于基础设施

云原生应用应该是独立于底层基础设施的,比如操作系统、服务器等。对系统资源的使用应该被抽象出来,比如通过定义CPU、内存的使用量来运行程序,而不需要限定操作系统。

4.基于弹性的云基础设施

云原生应用应该部署在弹性的云基础设施上,公有云、私有云,甚至混合云都可以。借助云的动态伸缩能力(复制能力),应用可以根据负载情况进行动态调整。这和基于物理机的传统IT应用有很大不同,因为物理机缺乏快速扩容的能力,因此在资源的使用上需要评估最坏情况并安排过量的机器资源。基于云基础设施的应用可以在部署时根据需要动态分配资源。

5.DevOps工作流程

云原生应用应该使用DevOps方式进行运转。通过人员、流程和工具,增强开发团队和运维团队之间的协作,从而快速且平稳地将代码发布到生产环境。这当然还需要使用持续集成和持续交付的实践方法。这些能使团队发布的软件迭代得更快,并能更有效地响应客户需求。

6.自动化能力

云原生应用需要具备自动伸缩的能力,可以基于工作负载的情况实时调整实例的容量。具体做法是,通过声明式方式来配置对每个实例资源的使用量,并根据设置的策略进行伸缩。比如设定一个CPU的阈值为70%,当工作负载的CPU超过这个值后,应用就自动扩容,复制一份新的实例,并自动加载到负载均衡器中。

另外,应用的集成过程也应该是自动化的,比如随着每一次代码的提交,持续集成管道被触发并开始工作,完成合并、集成测试等任务,并打包好一个新包供下一次发布使用。在部署层面也可以实现自动化。比如设置一个按比例切分流量的策略,在满足条件的情况下,每隔一段时间,将设定的请求切换到新部署的应用版本中,实现自动灰度发布。

7.快速恢复

基于容器编排能力和不可变基础设施,云原生应用应该具有快速恢复的能力。无差别的工作负载可以在出现故障时快速销毁并重建,应用也可以在部署失败时快速回滚到上一个版本,而不会对使用者产生影响。再基于编排的动态调度能力,应用可以随时从故障中恢复。

以上列举的方面不一定全面,但通过介绍这些重要的特性,相信可以让你对云原生应用有一个更加具象化的理解。