在本文中,我将讨论什么是微服务,它们为何如此重要。我们将从微服务历史以及它们与单体架构的比较开始。然后,我们将讨论微服务架构的一些原理,其潜在的缺点,以及如何与容器和Kubernetes等现代工具结合使用。
前言
当组织开始构建更复杂的应用程序时,编写单体应用程序的做法变得越来越成问题,微服务就应运而生。
传统上,应用程序是作为单体构建的,所有代码都集中在一个大的代码库中。由于没有明确区分不同功能,因此更新应用程序的一部分时,可能会无意中影响到完全不相关的功能。即使进行简单的更改,你也必须重新部署整个应用程序,如果出现问题,则所有内容都会受到影响,而不仅仅是要被更新或扩展的组件。
针对这个问题,我们可以通过将单体架构拆分成模块(半独立组件)来解决,尽管它可能比实现微服务简单得多,但它从未真正流行起来。
面向服务的体系结构(SOA)吸引了很多人,但很大程度上失败了,主要是因为它留下了许多未解决的问题,例如如何正确拆分服务。基于微服务的体系结构是一种更具说明性的SOA类型,它源于现实世界的用例,并已被众多组织成功采用。
微服务只不过是一种模块化架构,不同模块间通过网络进行通信。
什么是微服务?
微服务是小型的自治应用程序组件,它们一起构成一个应用程序。他们从SOA继承了基本的操作模型,但是以一种更具说明性的方式对其进行了扩展。微服务通常被认为是一个独立部分,由一个团队维护。
微服务为什么重要?由上文可知,要更新应用程序,我们可以独立更新和部署微服务,而不必重新部署整个应用程序。它们还允许单个微服务团队完全专注于单个业务流程,而无需了解整个应用程序。
为此,微服务具有以下属性:
- 松耦合:每个服务都是自治的,只能松散地连接到系统的其余部分。这意味着它具有自己的生命周期,并且可以独立部署,更新,扩展和删除。
- 高内聚性:具有相关行为的代码组合在一起。通过将所有相关行为分组在一起,工程师仅在需要更改特定行为时才在一个地方更新代码。
- 信息隐藏:每个微服务仅共享其他服务所需的数据,并仅隐藏与其自己的流程相关的数据。数据共享可能会无意间导致耦合,因此应始终谨慎。
为了充当一个有凝聚力的应用程序,所有这些不同的自治服务都通过网络接口进行通信。这为大量通信带来了新的挑战。顺便说一下,这就是服务网格发挥作用的地方。
现在我们知道什么是微服务,让我们探究组织为什么采用微服务。
微服务的好处
无论是通过使服务与团队保持一致来解决“开发人员问题”,还是降低采用新技术的风险,或是减轻部署的复杂度和提高可伸缩性,采用微服务都会带来很多好处。让我们仔细看看:
- 自治团队:微服务允许小型团队完全拥有服务的整个生命周期。这样可以提高责任心,代码质量和工作满意度。对于大多数大型组织而言,这种“人员分配”是采用微服务方法的主要原因之一。
- 技术的异构性:开发人员理论上可以使用不同的语言和不同的技术来构建每个服务。这使开发人员能够为该特定服务选择最佳技术,而不是采用更为传统的标准化,一刀切的方法。
- 降低采用新技术的风险:开发人员还可以在低风险服务中试验新技术,因为知道出了点问题,不会影响系统的其余部分。由于风险是采用新技术的最大障碍,因此这是一个巨大的优势。
- 弹性:当组件发生故障时,它不一定会影响到系统的其他部分。但请注意,应用程序仅在其体系结构允许的范围内具有弹性。如果没有良好的代码惯例(例如跟踪,可观察性和熔断机智),那么小故障仍然可以在复杂的系统中级联。
- 可扩展性:要扩展任何一项功能,你只需扩展该微服务,而不是扩展整个单体应用程序即可。
- 易于部署:如果更新一行代码,只需更新和重新部署该特定的微服务,而不是重新部署整个单体应用程序。相反,回滚服务比回滚整个应用程序容易得多。Docker和Kubernetes之类的工具已大大降低了部署和回滚的成本。
- 可替换性:替换应用程序中的微服务比替换单体应用中的组件要容易得多。
微服务的最佳实践
如上所述,SOA实现之所以困难,原因之一是它们缺乏定义服务边界的指导。让我们看看微服务如何解决这个问题。
定义服务边界
每个微服务都具有围绕业务域建模的特定功能,业务域解决了特定的业务问题。例如,使用Gmail,其业务领域包括使世界各地的人们能够通过电子邮件进行通信的所有功能。
业务域由多个有限上下文组成:与同一应用行为相关的代码。Gmail具有多种功能,包括文本编辑,发送和接收,存档,搜索等,所有这些功能都可能形成这样的上下文。
但请注意,相关行为不一定与功能一一对应。
高度自治
解耦系统就是要能够独立更改系统的各个部分而不会影响系统的其他部分。
服务间彼此了解越少,它们就越自治。更大的自主权带来更大的弹性。理想情况下,如果一项服务崩溃,则其他服务仍将能够提供该应用程序的降级版本。
虽然解耦系统是最终目标,但并非总是能够实现100%解耦。
网络通讯
微服务通过其应用程序编程接口(API)在网络上进行通信。要发送和接收消息,他们必须就网络通信规则达成一致。你可能熟悉HTTP,还有更多这样的协议。
根据网络通讯的方式,可以将它们大致分为同步或异步通信。
• 同步模式:客户端请求需要服务端即时响应,甚至可能由于等待而阻塞。
• 异步模式:客户端请求不会阻塞进程,服务端的响应可以是非即时的
同步有点像座机。建立连接并交换信息,并且在连接时无法接听其他电话。此类通信通常与请求/响应消息一起使用,其中一个服务发送请求并等待另一服务响应。等待时,两个服务都被阻止。可以想象,这仅在连接速度很快的情况下才可行。
异步通信更像电子邮件。你向某人发送电子邮件,通常可以继续其他工作。收到回复后,你将再次参与。这就是异步通信的本质:服务发送一条消息,并继续执行它的所有操作,直到收到响应为止。当网络不可靠或物理距离较远时,通常使用这种通信方式。它通常与发布-订阅(或pub-sub)模式一起使用,在该模式中,一项服务将发布事件,而订阅该事件的人将得到通知。
采用那种网络通讯方式,要根据实际的业务场景而定。
什么时候应该使用微服务?
开发和维护微服务比处理单体应用要耗费大量精力。我们已经看到微服务具有许多强大的优势,但这是否总是最好的方法?不,开发者应该首选单体,除非他们有令人信服的理由不得不这样做。
根据经验,小型团队的小型应用程序最好采用单体架构,而由多个团队同时开发维护的大型应用程序最好采用微服务方法。组织应该从单体应用程序开始,当在需要伸缩性,性能或弹性优势时,可以将其细分为微服务。何时需要拆分,将在很大程度上取决于你的用例。没有灵丹妙药,你必须在仔细考虑后做出决定。
你可以尽早做的是保持一个干净且模块化良好的代码库。当你开始运行和扩展应用程序时,这将使构建和扩展变得更容易,并且当你将单体应用细分为微服务时,它将减少你的成本和工作量。
结合容器和Kubernetes
如上图所述,每个微服务都放置在一个容器中,这是一种新颖的包装机制,其概念类似于超轻量级虚拟机(VM),有助于将微服务分隔开(请注意,尽管容器在概念上类似于VM,但它们并未提供相同的隔离性或安全性保证)。尽管微服务早于容器,但容器使微服务更加简单和更具成本效益。
Kubernetes管理你的容器化服务,以确保它们具有足够的资源并且可以正常运行。它充当容器的某种数据中心操作系统。
简而言之,微服务包含业务逻辑,该代码提供业务价值。容器帮助打包微服务,以便它们与系统的其余部分分离。容器和Kubernetes简化了微服务的打包和管理,并且是微服务如此流行的原因之一。
结论
尽管微服务提供了比单体架构更大的灵活性并提供了令人难以置信的强大功能,但这些好处是以牺牲复杂性为代价的。组织必须仔细考虑采用微服务方法是否适合他们。
在微服务中,你越来越会听到很多有关容器和Kubernetes的信息。这是因为它们是重要的技术创新,可为微服务提供巨大价值。如今,大多数使用微服务的组织都会采用容器和Kubernetes来管理它。