1.1 微服务架构的发展与挑战
很长一段时间以来,传统的软件应用程序一般都是作为单个项目开发的,一个项目通常具有单个代码库和单个部署的二进制文件,这种情况适用于小型软件应用程序开发。然而不断扩展的功能要求以及对互联网规模使用模式的需求不可避免地导致了这些代码库日益庞大、复杂甚至不灵活。由于大部分的代码是紧密耦合的,因此这些单一应用程序变得越来越难以维护和操作,即使某一功能的细微变化也可能导致意想不到的整体应用的变化。尤其是在当下缩短软件发布周期的竞争浪潮中,现代应用程序需要进行快速的更新迭代、日常维护、功能升级,以及适应新的安全要求,这些需求都会因为架构设计而导致开发和架构团队手忙脚乱。
根据微服务大师Martin Fowler的定义,微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间相互协调、相互配合,为用户提供最终价值。每个服务运行在其独立的进程中,服务和服务之间采用轻量级的通信机制并且相互沟通(通常是基于HTTP的Restful API)。每个服务都围绕着具体的业务进行构建,并且能够被独立地部署到预发布环境或者生产环境等。另外,应尽量避免统一的、集中的服务管理机制,对具体的一个服务而言,应根据业务上下文,选择合适的语言、工具对其进行构建。
由此可见,微服务是一种小型、可独立部署的且可独立扩展的软件服务,目的是将特定语义功能封装在更大的应用程序中。现代应用程序可以完全由微服务组成,或者利用微服务作为单一应用程序进化的辅助支持。技术创新者已经将微服务架构作为解决单一应用架构的各种问题的优雅解决方案。通过将应用程序分解为轻量级且解耦的服务,每个服务都满足特定的业务需求,开发团队可以更频繁地部署应用,更有效地扩展应用,并避免软件单一架构带来的其他问题。
尽管许多企业仍然处于迁移到微服务架构的开始阶段,当前微服务的使用增长非常显著。根据《Global Microservices Trends》的调查报告,企业开发团队不希望微服务的势头放缓,几乎所有人(98%)都希望微服务成为默认架构,大多数人(86%)希望在未来五年内实现微服务架构,如图1-1所示。
图1-1 几乎所有人都希望微服务成为默认架构
软件是当今很多公司的生命线,随着我们向更加数字化的世界迈进,最终用户在与这些公司互动时会期望得到更好的便利性、更优的服务质量,而软件将为用户提供这些体验。与此同时,客户的需求是动态变化且不容易预测的,因此,我们的公司和软件系统需要具备这些相同的特性以满足客户需求。对于一些初创公司而言,构建敏捷且能够响应不可预测性的软件系统将是生存的关键因素之一。而对于其他公司来说,无法使用软件使自己具备差异化竞争力则意味着业务增长可能会放缓、衰退甚至可能导致最终折戟。
最近软件架构的趋势主要围绕如何扩展团队和技术来实现这种敏捷性。云改变了我们消费基础设施的方式,并改变了我们构建应用程序的条件。微服务、DevOps和云服务等技术能带来开发的灵活性,然而在任何新方法或技术转变带来巨大收益的同时,新的挑战也随之而来并不可避免。
当我们探索如何更快地利用云平台和容器等新技术时,会发现过去的一些问题被扩大化了,一些问题变得更难,甚至有些问题似乎无法解决。随着我们开始构建更大更分散的系统,网络必须成为应用程序中的核心设计因素。应用程序本身是否应该实现弹性问题,如重试、超时以及熔断?是否应该让每个应用程序自己实现这些关键功能,还是独立出来作为统一功能提供给每个程序?此外,度量和日志是我们必须收集并用于理解系统的重要手段。随着系统变得更加复杂并部署在弹性的云基础架构上,我们应如何对系统进行检测和监控,从而能够在运行时或者实时地对系统进行理解分析?同样,是否需要提供一个基本的遥测数据收集器可以使系统运维人员在应用程序之外完成收集分析?
开发人员作为大型IT系统中的关键资源,其核心价值是编写出更有差异化的软件来提供更好的业务价值。而这些弹性问题、度量指标收集问题并非特定于应用程序逻辑本身,我们想要的是一种以语言和框架无关的方式实现这些功能,并将它们作为应用程序的基础架构服务,可以不用考虑任何特殊应用程序下使用它们。任何开发人员都可以基于这个架构来构建出以云原生应用架构为基础的任何应用程序,而不必担心由于网络而可能引入的令人棘手的应用弹性、度量指标问题。
“服务网格”是一个相对较新的术语,用于描述分布式应用程序的网络基础架构,通过它使得应用程序更加安全、更加有弹性,并且可观测性以及灵活可控。服务网格描述了一种由控制平面和数据平面组成的体系架构,其中,数据平面使用应用程序级的代理来管理网络流量,而控制平面用于管理代理。这种架构允许我们在应用程序之外构建这些重要功能,几乎不需要应用程序的干预或太多修改。
Istio是服务网格的开源实现,也是目前社区中最为流行的服务网格实现,是基于Kubernetes平台的应用服务网格最佳搭档。Istio允许我们构建可靠安全的云原生系统,并解决一些难以解决的问题,如安全性、策略管理和可观测性,只需极少的(甚至在某些情况下几乎完全不需要)应用程序代码更改。Istio的数据平面由基于Envoy代理的服务代理组成,控制平面实现了API来管理和配置这些Envoy代理。服务代理与应用程序一起用于控制服务网络行为。
Istio适用于微服务或SOA风格的体系架构,但不仅限于新的应用程序。现实情况下,大多数组织在现有应用程序和平台上投入了大量资金。他们很可能围绕现有的应用程序构建服务架构,这就是Istio真正闪耀光芒的地方。使用Istio,我们可以解决这些应用程序网络问题,而无需强制更改现有系统。由于服务代理服务于应用程序之外,因此任何架构的任何应用程序都是服务网格中受欢迎的一等公民。
本书将介绍Istio,并展示所有这些特性是如何由可能变为现实的,并教你如何使用Istio构建更具弹性的应用程序,你可以在云环境中监视和操作这些应用程序。在此过程中,我们将探索Istio的设计原则,解释为什么它与过去解决这些问题的方式不同。当然,我们不希望开始使用新技术只是因为它是新的时髦技术而已,我们需要花点时间了解为什么要使用Istio,它到底解决了什么问题,要避免哪些问题,以及为什么这项技术会为业务带来价值。如果不充分了解这项技术,我们极有可能会得不到预期的效果。