微服务架构

何为微服务架构

微服务架构是一种将软件应用程序设计为若干个可独立部署的服务套件的特定方法。

简而言之,微服务架构风格是一种将单个应用程序开发为一套小型服务的方法,每个小型服务都在自己的进程中运行,并以轻量级机制(通常是 HTTP 资源 API)进行通信。这些服务围绕业务功能构建,可通过全自动部署机制来独立部署。这些服务共用一个最小型的集中式管理,它们可以使用不同的编程语言编写,并使用不同的数据存储技术。

单体风格

在开始解释微服务风格之前,将它与单体(monolithic)风格进行比较是有用的:单体应用程序被构建为单一单元。企业应用程序通常由三个部分构成:客户端用户界面(由用户机器上的浏览器中运行的 HTML 页面和 Javascript 组成)、数据库(由许多表组成,通常是在关系型数据库中管理)系统、服务器端应用程序。服务器端应用程序处理 HTTP 请求,执行一些逻辑处理,从数据库检索和更新数据,选择数据并填充到要发送到浏览器的 HTML 视图中。这个服务器端应用程序是一个整体——一个逻辑可执行文件。对系统的任何更改都涉及构建和部署新版本的服务器端应用程序。

这种单体服务器是构建这种系统的自然方式。处理一个请求的所有逻辑都在一个进程中运行,允许你使用语言的基本功能将应用程序划分为类、函数和命名空间。需要注意的是,你可以在开发人员的笔记本电脑上运行和测试应用程序,并使用部署管道确保对程序做出的改动被适当测试并部署到生产环境中。你可以通过在负载均衡器后面运行许多实例来水平扩展整体块。

单体应用程序可以取得成功,但越来越多的人对它们感到不满——尤其是在将更多应用程序部署到云的时候。变更周期被捆绑在一起——即使只是对应用程序的一小部分进行了更改,也需要重建和部署整个单体应用。随着时间的推移,通常很难保持良好的模块化结构,也更难以保持应该只影响该模块中的一个模块的更改。对系统进行扩展时,不得不扩展整个应用系统,而不能仅扩展该系统中需要更多资源的那些部分。


单体风格和微服务风格的比较

微服务架构的特征

这些对单体风格的不满催生了微服务架构风格:将应用程序构建为服务套件。除了服务可独立部署、独立扩展的事实之外,每个服务还提供了一个牢固的模块边界,甚至允许以不同的编程语言编写不同的服务。他们也可以由不同的团队管理。

通过服务进行组件化

在谈论组件时,就会碰到一个有关定义的难题,即什么是组件?我们的定义是,组件是可独立更换和升级的软件单元。

微服务架构也会使用软件库,但组件化软件的主要方式是拆分为多个服务。我们把库定义为链接到程序并使用内存函数调用来调用的组件,而服务是一种进程外组件,通过 Web 服务请求或远程过程调用等机制进行通信。

将服务作为组件(而不是库)的一个主要原因是服务可以独立部署。如果你有一个应用程序是由单一进程里的多个库组成,任何一个组件的更改都会导致整个应用程序的重新部署。但如果应用程序可拆分为多个服务,那么单个服务的变更只需要重新部署该服务即可。

将服务用作组件的另一个结果是更明确的组件接口。大多数语言没有一个良好的机制来定义显式发布的接口。通常,它只是文档和规则来阻止客户端破坏组件的封装,这会导致组件之间过于紧耦合。通过使用显式远程调用机制,服务可以更轻松地避免这种情况。

围绕业务能力进行组织

微服务的设计模式能够使团队围绕业务能力而不是技术层面进行来进行组建。不是每个团队负责一块技术实现,而是一个跨职能团队去实现一个服务。

去中心化

把单体的组件分裂成服务,在构建这些服务时可以有自己的选择。

分散数据管理

微服务更倾向于让每个服务管理自己的数据库,或者同一数据库技术的不同实例,或完全不同的数据库系统 - 这就是所谓的混合持久化(Polyglot Persistence)。你可以在单体应用程序中使用混合持久化,但它更常出现在微服务里。

从单体式架构迁移到微服务架构

1. 停止挖掘

停止让单体式应用继续变大,也就是说当开发新功能时不应该为旧单体应用添加新代码,最佳方法应该是将新功能开发成独立微服务。

2.将前端和后端分离

将表现层和业务逻辑、数据访问层分开

3.抽出服务

从单体应用中抽取出某些模块成为独立微服务

微服务和分布式数据管理问题

由于不同的微服务经常使用不同的数据库。应用会产生各种不同数据,关系型数据库并不一定是最佳选择。因此,基于微服务的应用一般都使用 SQL 和 NoSQL 结合的数据库,也就是被称为 polyglot persistence 的方法。

但是这种方法会带来一些问题。首先就是如何完成一笔交易的同时保持多个服务之间数据一致性。以一个在线 B2B 商店为例,客户服务维护包括客户的各种信息,例如 credit lines 。订单服务管理订单,需要验证某个新订单与客户的信用限制没有冲突。在单一式应用中,订单服务只需要使用 ACID 交易就可以检查可用信用和创建订单。然而,在微服务架构下,订单和客户表分别是相对应服务的私有表。

事件驱动架构

当某件重要事情发生时,微服务会发布一个事件,例如更新一个业务实体。当订阅这些事件的微服务接收此事件时,就可以更新自己的业务实体,也可能会引发更多的时间发布。

微服务部署策略

单主机多服务实例模式

使用这种模式,需要提供若干台物理或者虚拟机,每台机器上运行多个服务实例。每个服务实例运行一个或者多个主机的 well-known 端口,主机可以看做宠物。

单主机单服务实例模式

另外一种部署微服务方式是单主机单实例模式。当使用这种模式,每个主机上服务实例都是各自独立的。有两种不同实现模式:单虚拟机单实例和单容器单实例。

单虚拟机单实例模式

将服务打包成虚拟机映像(image),例如一个 Amazon EC2 AMI。每个服务实例是一个使用此映像启动的 VM(例如,EC2 实例)。


图片.png
优势:
  • 每个服务实例都是完全独立运行的,都有各自独立的 CPU 和内存而不会被其它服务占用。
  • 用户可以使用成熟云架构,例如 AWS 提供的,云服务都提供如负载均衡和扩展性等有用功能。
  • 服务实施技术被自包含了。一旦服务被打包成 VM 就成为一个黑盒子。VM 的管理 API 成为部署服务的 API,部署成为一个非常简单和可靠的事情。
缺点:
  • 资源利用效率不高。每个服务实例占用整个虚机的资源,包括操作系统。
  • 部署服务新版本比较慢。虚机镜像因为大小原因创建起来比较慢,同样原因,虚机初始化也比较慢,操作系统启动也需要时间。
  • 会增加运维团队的压力

单容器单服务实例模式

当使用这种模式时,每个服务实例都运行在各自容器中。容器是运行在操作系统层面的虚拟化机制。一个容器包含若干运行在沙箱中的进程。从进程角度来看,他们有各自的命名空间和根文件系统;可以限制容器的内存和 CPU 资源。某些容器还具有 I/O 限制,这类容器技术包括 Docker 和 Solaris Zones。

图片.png
优点:
  • 服务实例之间完全独立,可以很容易监控每个容器消耗的资源。跟虚机相似,容器使用隔离技术部署服务。容器管理 API 也可以作为管理服务的 API。
  • 容器映像创建起来很快,因为不需要操作系统启动机制,容器启动也很快。当容器启动时,后台服务就启动了。
缺点:
  • 不如虚机架构成熟。而且由于容器之间共享 host OS 内核因此并不像虚机那么安全。
  • 容器技术将会对管理容器映像提出许多客制化需求
  • 容器经常被部署在按照虚机收费的架构上

参考博客:

互联网 Java 工程师进阶知识完全扫盲

你可能感兴趣的:(微服务架构)