本文是翻译 https://martinfowler.com/articles/microservices.html 的内容,旨在介绍一下微服务这种设计架构,希望大家尽量阅读原文。文中翻译难免有疏漏,希望大家不吝指正,共同学习。
————————————————————————————————————
微服务架构的定义
“微服务架构”(Microservice Architecture)一词在过去的几年间涌现出来,作为一套可以独立部署的服务,用来描述一种特殊的设计软件应用的方式。虽然没有这个架构风格没有明确的定义,但围绕业务功能的组织,自动部署(automated deployment),端智能(intelligence in the endpoints,)以及对语言和数据的分散控制存在某些共同的特征。
“微服务”,又一个出现在众多软件架构术语中的新词。虽然我们主观倾向于对这样的概念不屑一顾, 但这个词描述了一种让我们觉得越来越有吸引力的软件系统风格。我们已经看到在过去的几年间有多个项目使用这种风格,到目前为止,结果都是乐观的。以至于这已经逐渐成为了我们很多同事在构建企业级应用的默认方式。然而,遗憾的是,并没有太多的信息去概述什么是微服务以及如何去做。
简而言之,微服务架构风格就是将单一应用的开发分为多个小的服务,每个小的服务在自己的进程中运行并使用轻量级机制进行通信(通常是一个HTTP API源),这些服务围绕业务性能进行构建,并且通过完全自动化的部署机制独立的部署。这些只需要最低限度的集中管理的服务,可以使用不同的编程语言编写,以及使用不同的数据存储技术。
为了阐述微服务架构,有必要让其与Monolithic架构进行比较:一个Monolithic应用由一个单元构建。企业级应用通常由三部分构建:客户端界面(包括HTML页面和运行在客户机器上浏览器里的javascript脚本),数据库(许多表构成的、相互关联的关系型数据库管理系统)以及一个服务器端应用。服务器端应用处理HTTP请求,执行域逻辑(domian logic),从数据库中查询和更新数据,选择并填充将要发送到浏览器的视图。这个服务器端程度就是一个Monolithic - 单一的逻辑上可执行的应用。对这个系统的任何更改都会构建和部署一个服务器端应用的新版本。
Monolithic架构是构建这样一种系统很自然的方式。处理请求的逻辑都在一个单一的进程中,允许你使用编程语言的基本特性将应用分割为类,函数以及命名空间。在某些场景中,你可以在开发人员的计算机运行和测试应用,并使用部署管道来确保对更改进行正确的测试以及部署到生产环境中。你也可以横向扩展Monolithic应用,通过负载均衡将多个应用部署到多个服务器上。
Monolithic架构能够成功 , 但是越来越多的对其感到失望, 特别是越来越多的应用被部署到cloud中。变更周期被绑定了,对应用一个小的更改,将会重新构建者部署整个项目。随着时间的推移,通常很难保持一个良好的模块化结构,这使得更改时只影响应用的一个小模块变得更加困难,扩展时需要扩展整个应用,而不只是进行部分部署。
Monolithic架构的这些缺陷导致了Microservices架构的出现:通过一系列的服务去构建应用。服务除了可以独立部署和可扩展之外,每个服务还有固定的模块边界,甚至允许使用不同的语言去编写不同的服务。它们也能被不同的团队进行管理。
我们并不主张说Microservices架构是多么新的东西,它至少可以追溯到Unix设计规范之前。但是我们确实认为没有足够的人去考虑Microservices架构,如果他们使用Microservices架构,很多软件系统将会变得更好。
微服务架构的特征
我们不能说微服务架构有一个正式的定义,但我们可以去尝试描述与“微服务”这个标签相匹配的体系架构的共同特征。正如用一个定义概括任何其他具有共同特征的事物一样,并非所有的微服务架构具有这些所有的特征,但我们确实希望所有的微服务架构具有大多数的这些特征。
尽管笔者们已经是这个相当松散的社区的积极成员,我们的意图是尝试去描述在我们自己的工作中所发现的,以及我们所知道的其他团队类似的努力。特别是我们没有下明确的定义遵守这个架构的时候。
——————————————————————————————————————
组件化(Componentization) 与服务 (Service)
自从我们开创软件行业以来,就会一直希望将组件连接在一起的方式去构建系统,就像我们在物理世界中所看见的一样。在过去的几十年中,我们看见了大量简编的公共库取得的巨大进步,它们是大多数语言平台的一部分。
在谈论组件时,我们遇到了定义上的难题即什么构成了组件。我们的定义是,组件是一个独立的,可替换的和可升级的软件单元 。
微服务架构会使用库,但是其组件化自身软件的主要方式是将其拆分为服务。我们将库定义为连接到程序中的组件,并使用内存中的函数进行调用,而服务则是进程外的组件,这些组件通过webservice请求或者远程过程调用(RPC)等机制进行通信。&