分层、SOA、微服务、微内核架构的核心区别,万字长文给你说清!

2024年03月14日
技术动态

可扩展性指系统为了应对将来需求变化而提供的一种扩展能力,当有新的需求出现时,系统不需要或仅需要少量修改就可以支持,无须整个系统重构或重建。

可扩展性架构的设计方法很多,但万变不离其宗,所有的可扩展性架构设计,背后的基本思想都可以总结为一个字:拆!

拆,就是将原本大一统的系统拆分成多个规模小的部分,扩展时只修改其中一部分即可,无须整个系统到处都改,通过这种方式来减少改动范围,降低改动风险。

按照不同的思路来拆分软件系统,就会得到不同的架构 。常见的拆分思路如下:

(1)面向流程拆分:将整个业务流程拆分为几个阶段,每个阶段作为一部分。典型的就是分层架构

(2)面向服务拆分:将系统提供的服务拆分,每个服务作为一部分。典型的就是SOA、微服务架构

(3)面向功能拆分:将系统提供的功能拆分,每个功能作为一部分。典型的就是微内核架构,包括规则引擎

分层架构、SOA、微服务架构微内核架构是实现系统可扩展性的四种典型架构,那么这四种架构的联系和区别到底是什么呢?

这里首先通过一个“餐厅”的类比来解释四种架构的本质原理,相信你会有个感性认识:

1、分层架构

想象一家的传统餐厅,它有前台,做菜,上菜和清理四层次的工作,每层完成特定的功能,只与相邻的层交互,如做菜只与上菜通话,跟清理不直接沟通。假如清理的人员出现问题,不会直接影响前台收款。

2、SOA架构

想象一家提供高端套餐服务的食品店,每类套餐都是由优质的供应商提供的,由于这些供应商的套餐品质较好,因此溢价能力很强,食品店需要跟这些供应商分别进行个性化的谈判,签订协议的周期很长(新接入一家供应商大概耗时1个月),同时这些供应商还有自己独立的老旧的销售系统,食品店的销售系统需要分别去进行对接,这带来了性能、体验等一系列问题。但由于套餐品质很好,经营效益仍然不错。

3、微服务架构

想象一个食品广场,有很多独立的小摊位,专门制作一种食物,每个摊位按照食品广场的标准协议入驻(新接入一个摊位耗时2天),非常方便。客户则可以自助选择各种食物组合来满足个性化的要求。当然随着摊位越来越多,客户越来越多,食品广场除了要做好摊位的管理,也要进行人流的控制,管理自动化的要求越来越高。

4、微内核架构

想象一家拉面店,大师傅负责制作基础食材(如面团、酱汁等),而各种汤面、菜品由特定的厨师完成,拉面店增减菜品还是比较容易的,但也带来了脆弱性,有一天大师傅生病了,整个拉面店不得不关店几天。

如果你要进一步理解,可以继续往下看。针对每种架构,我通过定义举例优缺点应用四个方面来进行诠释。

一、分层架构

1、定义

分层架构(Layered Architecture)是软件设计中一种常用的架构模式,它将系统分为若干个功能层来组织代码和功能模块。每个层次都有其特定的任务和责任。使用分层架构的目的是为了实现关注点分离、复用、降低耦合度,提高系统的可维护性和扩展性。分层架构一般有三个原则:每一层只与其上下相邻的层进行交互;每一层都有特定的功能和责任;层与层之间的耦合应保持最小化。

想象一下,一幢楼房由地下室、一楼、二楼和楼顶等多个楼层组成。每个楼层都有特定的功能,比如地下室存放杂物,一楼是商店,二楼是住宅,楼顶是花园。不同的楼层之间通过楼梯或电梯连接,你可以自由穿梭。

2、举例

以下是基于DDD驱动设计的四层划分:

(1)界面层 (UI Layer 或 Presentation Layer)

  • 职责: 这一层处理与用户的交互,展示信息给用户并解释用户命令。
  • 组件: 控制器、视图模型、用户界面组件等。

(2)应用层 (Application Layer)

  • 职责: 这层定义了软件要完成的工作,但不包括具体的业务规则。它不处理状态,只是任务的协调或委托给领域层。
  • 组件: 应用服务、DTOs(数据传输对象)、命令、事件、事件处理程序等。

(3)领域层 (Domain Layer)

  • 职责: 包含所有的业务逻辑和业务规则。这是DDD的核心所在。
  • 核心组件: 实体(Entities),值对象(Value Objects),领域事件(Domain Events),聚合(Aggregates),领域服务(Domain Services),仓库接口(Repository Interfaces)等。

(4)基础设施层 (Infrastructure Layer)

  • 职责: 为上面的三个层提供通用的技术能力,如持久化机制、消息传递、日志记录、电子邮件服务等。
  • 组件: 数据访问实现(如ORM映射),仓库的实现,消息传递的实现,工具类等。

以下是MVC的三层划分:

(1)模型(Model)

  • 描述:模型代表应用的数据和业务逻辑。
  • 职责:存储数据;实现业务逻辑和数据操作;通知视图有关数据更改的信息,从而触发界面更新。
  • 交互:模型不直接与控制器或用户交互,但可以通过观察者模式来通知视图变更。

(2)视图(View)

  • 描述:视图是应用的用户界面。
  • 职责:展示数据给用户;接收用户输入但不处理(处理交给控制器)。
  • 交互:视图从模型获取数据进行展示,并在用户交互时通知控制器。

(3)控制器(Controller)

  • 描述:控制器是模型和视图之间的中介。
  • 职责:处理用户输入;请求模型执行相关的业务逻辑;更新视图以反映模型的变化。
  • 交互:控制器接收视图的用户输入,并更新模型和/或视图。

3、优缺点

优点:

(1)模块化:每个层只处理本层的逻辑,使得开发、测试和维护变得更容易。

(2)可复用性:数据访问层可以被多个应用层服务所共用。

(3)灵活性:可以独立替换或修改某一层,而不影响其他层。

(4)可维护性:由于关注点的分离,定位和修复问题变得更加直观。

(5)扩展性:随着业务的增长,可以更容易地添加新的层或服务,但要保证层与层之间之间依赖的稳定性。

缺点:

(1)性能开销:每一层的调用可能会引入额外的延迟。

(2)复杂性:对于简单的应用,分层架构可能会引入不必要的复杂性。

(3)过度工程化:如果没有正确地理解和应用分层架构,可能会导致不必要的代码和设计冗余。

4、应用

下面是针对“图书销售系统”的DDD分层架构案例:

(1)界面层

  • 用户控制器(UserController):处理用户注册、登陆、注销等操作的Web请求。
  • 图书控制器(BookController):展示图书列表,图书详情。
  • 购物车控制器(CartController):展示购物车内容,允许用户增删改购物车内容。
  • 订单控制器(OrderController):允许用户查看和管理自己的订单。

(2)应用层

  • 用户服务(UserService):注册、登陆、修改密码。
  • 购物车服务(CartService):添加图书到购物车、从购物车中移除图书、修改购物车内图书数量。
  • 订单服务(OrderService):创建订单、查看订单状态、取消订单。

(3)领域层

实体

  • 图书(Book):具有ISBN、书名、作者、价格等属性。
  • 用户(User):具有用户名、密码、邮箱、购物车、订单历史等属性。
  • 购物车(Cart):维护用户想购买的图书项和数量,具有多个购物车项、总价等属性。
  • 订单(Order):记录图书、数量、总价、订单状态、配送地址等。

值对象

  • 地址(Address):用户的邮寄地址,包括街道、城市、邮编、国家等。
  • 货币(Money):代表金额的值对象,有数额和货币单位。
  • 购物车项(CartItem):代表购物车中的一项图书及其数量。

聚合

  • 购物车聚合:以购物车为聚合根,包含多个购物车项。
  • 订单聚合:以订单为聚合根,记录用户购买的图书、数量、支付状态等。

领域事件

  • 订单已生成(OrderCreated):当用户成功下单后触发的事件。

领域服务

  • 折扣计算服务(DiscountCalculationService):为符合条件的用户或图书计算折扣。

(4)基础设施层

数据访问对象(DAO)

  • 用户DAO(UserDAO):与数据库交互,处理用户数据的存储和检索。
  • 图书DAO(BookDAO):与数据库交互,处理图书数据的存储和检索。
  • 购物车DAO(CartDAO):处理购物车数据的存储和检索。
  • 订单DAO(OrderDAO):处理订单数据的存储和检索。

事件处理器(Event Handlers)

  • 处理和监听领域事件,如“订单已生成”事件。

外部服务接口

  • 支付接口(PaymentGateway):与外部支付系统(如支付宝、微信支付)交互,处理支付操作。

二、SOA架构

1、定义

SOA(Service-Oriented Architecture,面向服务的架构)是一种设计模式,其中软件应用的功能模块以独立、分布式和互操作的服务形式组织和提供。这些服务与网络标准和协议保持一致,从而使各种应用程序能够无缝地交互和集成。

SOA 提出的背景是企业内部的 IT 系统重复建设且效率低下, 主要体现在:

(1)企业各部门有独立的 IT 系统,比如人力资源系统、财务系统、销售系统,这些系统可能都涉及人员管理,各 IT 系统都需要重复开发人员管理的功能。例如,某个员工离职后,需要分别到上述三个系统中删除员工的权限。

(2)随着业务的发展,复杂度越来越高,更多的流程和业务需要多个 IT系统合作完成。由于各个独立的 IT系统没有标准的实现方式(例如,人力资源系统用 Java 开发,对外提供 RPC;而财务系统用C#开发,对外提供 SOAP 协议),每次开发新的流程和业务,都需要协调大IT系统,同时定制开发,效率很低。

(3)各个独立的 IT 系统可能采购于不同的供应商,实现技术不同,企业自己也不太可能基于这些系统进行重构。

为了应对传统 IT 系统存在的问题, SOA 提出了三个关键概念。

(1)服务:所有业务功能都是一项服务,服务就意味着要对外提供开放的能力,当其他系统需要使用这项功能时,无须定制化开发。

(2)ESB:ESB 的全称是 Enterprise Service Bus ,其将企业中各个不同的服务连接在一起。因为各个独立的服务是异构的,如果没有统一标准,则各个异构系统对外提供的接口是各式各样的。SOA 使用 ESB 来屏蔽异构系统对外提供各种不同的接口方式,以此来达到服务间高效的互联互通。

(3)松糯合:松辑合的目的是减少各个服务间的依赖和互相影响。因为采用 SOA 架构后,各个服务是相互独立运行的,甚至都不清楚某个服务到底有多少对其他服务的依赖。如果做不到松祸合,某个服务一升级,依赖它的其他服务全部故障,这样肯定是无法满足业务需求的。

2、举例

Oracle SOA Suite 是Oracle公司为企业提供的一套完整的SOA解决方案,包括服务开发、连接、安全性、和管理。以下是其主要组件和功能:

(1)Oracle Service Bus (OSB)

  • 主要用于服务的虚拟化和集成,允许你创建、部署和管理服务。
  • 提供了路由、转换、和验证功能。
  • 提供服务代理功能,为不同的服务消费者提供不同的接口和安全策略。

(2)Oracle BPEL Process Manager

  • 用于服务编排和复杂的业务流程管理。
  • 使用BPEL(Business Process Execution Language)为业务流程建模。

(3)Oracle Business Activity Monitoring (BAM)

  • 提供了对服务和流程的实时监视。
  • 有助于识别和解决性能问题。

(4)Oracle Business Rules

  • 允许业务分析师定义、修改和管理业务规则,而无需更改服务的代码。

(5)Oracle Adapters

  • 提供与多种企业应用(如SAP、Salesforce、数据库等)的连接。
  • 简化了不同系统之间的数据和操作的集成。

(6)Oracle Web Services Manager (OWSM)

  • 提供服务的安全性,包括身份验证、授权、消息加密和签名。

(7)Oracle SOA Management Pack

  • 用于监控和管理SOA Suite的组件。
  • 提供了警报、性能分析和服务级别协议(SLA)管理。

使用Oracle SOA Suite,组织可以快速构建、部署和管理复杂的服务集成项目。它为企业提供了一个强大、灵活和可扩展的平台,以支持其SOA战略。

3、优缺点

优点:

(1)松耦合。服务之间的依赖关系较弱,服务之间只需遵循统一的接口契约,不需要了解其他服务的实现细节,使服务之间的耦合关系松散。

(2)高内聚。每个服务都专注于完成一组相关的功能,具有高内聚性。

(3)可重用性。服务可被不同的应用系统重复调用和利用。

(4)可扩展性。可以通过调用多个服务实例来实现对系统的水平扩展。

(5)可维护性。服务边界清晰,使每个服务都可以独立地进行开发、测试、部署和维护。

(6)跨平台。服务使用标准化接口与语言描述,可以跨平台实现。

缺点:

(1)系统复杂性增加。SOA架构实施过程中需要处理大量的服务、管理问题等,系统整体会变得非常复杂。

(2)性能开销。服务调用需要通过网络进行远程调用,带来额外的性能开销,服务调用都需要通过ESB总线进行,异构协议和数据格式需要通过ESB转换,ESB很容易成为瓶颈。

(3)错误处理困难。服务调用链过长时,一次业务操作可能需要调用多个服务,系统内的错误难以追踪。

(4)版本管理复杂。系统升级时需要考虑服务接口的兼容性问题。

(5)安全管理复杂。由于服务暴露给多个消费者,可能需要引入额外的安全机制来确保数据的安全性和完整性。

4、应用

XYZ 制造公司是一个全球性的制造业巨头,拥有多个部门如销售、财务、人力资源和供应链。每个部门都有自己的 IT 系统,并且由于历史原因,这些系统都是由不同的供应商提供,使用不同的技术栈和协议。

面临的问题:

(1)重复功能:当一个新员工被录用时,他们需要在人力资源、销售和财务部门的系统中都被添加。如果该员工离职,这个过程还需要反向进行。

(2)协作问题:销售部门可能需要财务部门的数据来计算提成,但由于两个系统的技术差异,这个过程经常是手工进行的,非常低效。

(3)系统间通讯困难:由于没有统一的通讯标准,系统间的数据交换经常需要定制开发,这既费时又费钱。

SOA 解决方案:

(1)统一的员工管理服务:创建一个服务,负责所有员工的入职、更新和离职过程。这个服务可以通过 RESTful API 或 SOAP 提供,使得所有部门的系统都可以调用。

(2)统一的数据交换标准:采用一种通用的数据交换格式,如 XML 或 JSON。这样,不同的系统可以轻松地交换数据,而无需为每次通讯都进行定制开发。

(3)适配器模式:对于那些不能直接支持新的通讯标准的旧系统,开发适配器来转换数据格式和协议。

(4)业务流程服务:例如,当销售部门完成一个交易时,该交易的数据可以自动发送到财务系统进行处理。通过 SOA,这样的自动化流程可以轻松实现。

最后的结果:

XYZ 制造公司成功地实施了 SOA,现在他们可以快速地开发新的业务流程,而不需要协调多个部门的 IT 团队。员工的入职和离职过程也已经自动化,极大地提高了效率。最重要的是,公司现在可以更快地响应市场变化,因为他们有了一个灵活和可扩展的 IT 架构。

三、微服务架构

1、定义

微服务架构(Microservices Architecture)是一种架构模式,它提倡将单一应用程序划分成一组小的服务,每个服务运行在其独立的进程中,服务之间采用轻量级的通信机制(通常是HTTP API)互相协作。

微服务架构具有以下主要特征

(1)微服务架构将大型单体式应用拆分成多个松耦合的小型服务。每个微服务负责实现一个独立的业务功能。

(2)每个微服务都是一个独立的进程,可以使用不同的编程语言及框架实现。服务之间通过简单RESTful API进行交互。

(3)每个微服务都围绕业务能力进行构建,并能独立部署到生产环境、独立扩展。

(4)每个服务都有自己的业务目标并围绕这些业务目标设计。

(5)服务间通过消息总线进行通信,采用轻量级通信和松耦合来实现服务交互。

(6)微服务架构通过业务边界和自动部署机制来实现敏捷开发和可扩展性。

(7)微服务架构支持采用最简单符合业务需求的技术来开发服务。

总体来说,微服务架构是一种以业务能力为中心来构建应用的架构模式。它通过细粒度、松散耦合的服务来提高应用的灵活性和可扩展性。这种架构很适合互联网公司快速交付大型复杂应用的需求。

2、举例

Spring Cloud 提供了一系列工具来帮助开发、部署和管理微服务应用。以下是 Spring Cloud 为实现微服务所提供的主要功能:

(1)服务发现与注册 (Service Discovery and Registration)

微服务种类和数量很多,如果这些信息全部通过手工配置的方式写入各个微服务节点,人工维护这么大数量的配置项是一项灾难。其次是微服务节点经常变化,可能是由于扩容导致节点增加,也可能是故障处理时隔离掉一部分节点,不管哪种情况,我们都希望节点的变化能够及时同步到所有其他依赖的微服务 。如果采用手工配置,是不可能做到实时更改生效的 。因此,需要一套服务发现的系统来支撑微服务的自动注册和发现。例如使用Spring Cloud Eureka、Spring Cloud Consul或Spring Cloud Zookeeper。

(2)配置管理 (Centralized Configuration Management)

微服务的节点数量非常多,通过人工登录每台机器手工修改,效率低,容易出错。特别是在部署或排障时,需要快速增删改查配置 ,人工操作的方式显然是不行的。除此以外, 有的运行期配置需要动态修改并且所有节点即时生效,人工操作是无法做到的。综合上述的分析,微服务需要一个统一的配置中心来管理所有微服务节点的配置。例如使用Spring Cloud Config。

(3)智能路由 (Intelligent Routing)

有了服务发现后,微服务之间能够方便地获取相关配置信息,但具体进行某次调用请求时,我们还需要从所有符合条件的可用微服务节点中挑选出一个具体的节点发起请求,这就是服务路由需要完成的功能。智能路由提供动态路由、监控、弹性、安全等能力,常见的路由算法有 : 随机路由、轮询路由、最小压力路由、最小连接数路由等算法。例如Spring Cloud Zuul。

(4)客户端负载均衡 (Client-Side Load Balancing)

提供了一系列客户端侧的负载均衡工具。例如使用Spring Cloud Netflix Ribbon。

(5)断路器 (Circuit Breaker)

系统拆分为微服务后,单个微服务故障的概率变小,故障影响范围也减少,但是微服务的节点数量大大增加。从整体上来看,系统中某个微服务出故障的概率会大大增加。因此需要微服务能够自动应对这种出错场景,及时进行处理。断路器会确保不会对整个系统造成延迟,同时提供失败的快速响应。例如使用Spring Cloud Hystrix或Spring Cloud Resilience4j。

(6)API 网关 (API Gateway)

系统拆分为微服务后,内部的微服务之间是互联互通的,相互之间的访问都是点对点的 。如果外部系统想调用系统的某个功能,也采取点对点的方式,则外部系统会非常“头大“。因为在外部系统看来 ,它不需要也没办法理解这么多微服务的职责分工和边界 ,它只会关注它需要的能力,而不会关注这个能力应该由哪个微服务提供 。除此之外,外部系统访问系统还涉及安全和权限相关的限制,如果外部系统直接访问某个微服务, 则意味着每个微服务都要自己实现安全和权限的功能 , 这样做不但工作量大,而且都是重复工作。综合上述分析,微服务需要一个统一的 API 网关,负责外部系统的访问操作,主要提供路由、认证、监控、限流等功能。例如Spring Cloud Gateway。

(7)服务链路追踪 (Distributed Tracing)

提供微服务之间的链路追踪功能,例如使用Spring Cloud Sleuth配合Spring Cloud Zipkin。

(8)消息驱动的微服务 (Message-Driven Microservices)

提供与消息系统的集成,以实现消息驱动的微服务,常用的有Spring Cloud Stream。

(9)安全 (Security)

提供微服务的安全功能,如OAuth2等,常用的有Spring Cloud Security。

这些功能为微服务架构中的常见问题和模式提供了解决方案,从而使得开发者可以更为轻松地开发和管理微服务应用。

3、优缺点

优点:

(1)更轻量级 - 微服务架构强调将应用拆分成更细粒度的服务,每个服务更轻量、独立和易于理解。SOA服务较为复杂。

(2)更面向业务 - 微服务围绕业务功能进行拆分,容易映射业务需求。SOA服务边界不一定与业务边界对应。

(3)更容易开发 - 每个微服务可由小型开发团队独立开发,更容易维护。

(4)更技术多样性 - 微服务可使用不同语言及技术实现,这为团队提供了更大的灵活性。

(5)更容易扩展 - 可以通过实例扩展单个微服务来实现扩展。SOA较难灵活扩展。

缺点:

(1)分布式复杂性 - 构建分布式系统使得服务管理困难,涉及服务路由、故障隔离、服务发现、负载均衡等。

(2)部署成本高-微服务规模大,交付难度提升,对自动化测试、持续集成 、自动化部署要求很高。

(3)网络通信开销大-微服务复杂的调用链增加通信了延迟和系统的复杂度。

(4)运维复杂-微服务间关系错综复杂,问题监控定位难。

(5)一致性问题 - 每个服务通常有自己的数据库,这可能导致数据的一致性和完整性问题。

4、微服务与SOA架构的异同点

微服务是一种和 SOA相似但本质上不同的架构理念,如下图所示:

 

相似点在于图中交叉的地方,就是两者都关注“服务”,都是通过服务的拆分来解决可扩展性问题。本质上不同的地方在于几个核心理念的差异:是否有 ESB、服务的粒度、架构设计的目标等。

(1)服务粒度

整体上来说, SOA 的服务粒度要粗一些,而微服务的服务粒度要细一些。例如,对一个大型企业来说,“员工管理系统”就是一个 SOA架构中的服务;而如果采用微服务架构,则“员工管理系统”会被拆分为更多的服务,比如“员工信息管理”“员工考勤管理”“员工假期管理”“员工福利管理”等更多服务。

(2)服务通信

SOA采用了ESB作为服务间通信的关键组件,负责服务定义、服务路由 、消息转换、消息传递,总体上是重量级的实现。微服务推荐使用统一的协议和格式,例如,RESTful协议、RPC协议,无须ESB这样的重量级实现。MartinFlower将微服务架构的服务通信理念称为“聪明的终端,愚蠢的管道”。之所以用“愚蠢”二字,其实就是与 ESB 对比的,因为 ESB 太强大了,既知道每个服务的协议类型(例如,是 RMI 还是 HTTP ),又知道每个服务的数据类型(例如,是XML 还是 JSON),还知道每个数据的格式(例如,是 2017-01-01 还是 01/01/2017),而微服务的仅仅做消息传递,对消息格式和内容一无所知。

(3)服务交付

SOA对服务的交付并没有特殊要求,因为 SOA更多考虑的是兼容己有的系统。微服务的架构理要求“快速交付”。相应地要求采取自动化测试、持续集成 、自动化部署等敏捷开发相关的最佳实践 。如果没有这些基础能力支撑,微服务规模一旦变大(例如,超过 20 个微服务),整体就难以达到快速交付的要求,这也是很多企业在实行微服务时踩过的 一个明显的坑,就是系统拆分为微服务后 ,部署的成本呈指数上升。

(4)应用场景

SOA 更加适合于庞大、 复杂、异构的企业级系统,这也是 SOA 诞生的背景。这类系统的典型特征就是很多系统已经发展多年 ,采用不同的企业级技术,有的是内部开发的,有的是外部购买的无法完全推倒重来或进行大规模的优化和重构。因为成本和影响太大,只能采用兼容的方式进行处理,而承担兼容任务的就是ESB。微服务更加适合于快速、轻量级、基于 Web 的互联网系统,这类系统业务变化快,需要快速尝试、快速交付;同时基本都是基于 Web,虽然开发技术可能差异很大(例如Java、C++、 .NET 等〉,但对外接口基本都是提供 HTTP Restful风格的接口,无须考虑在接口层进行类似 SOA 的ESB 那样的处理。

将 SOA 和微服务对比如下表所示。

 

5、应用

一个电子商务平台希望提供用户购物、支付、评价、查询商品、查看订单历史和用户管理等功能。

微服务拆分:

(1)用户服务

  • 负责用户注册、登录、注销、信息修改等。
  • 数据库存储用户的详细信息、密码(经过哈希处理)等。

(2)商品服务

  • 管理商品的添加、修改、删除、查询等。
  • 数据库存储商品信息,如名字、价格、描述、库存量等。

(3)订单服务

  • 用户创建订单、修改订单状态(如发货、完成)等。
  • 数据库存储订单信息,如购买的商品、数量、总金额等。

(4)支付服务

  • 负责订单的支付,如信用卡支付、电子钱包支付等。
  • 与外部支付提供商(如PayPal, Stripe等)集成。

(5)评价服务

  • 用户可以为购买的商品留下评价。
  • 数据库存储评价内容、评价星级等。

(6)推荐服务

  • 根据用户的购物历史和行为,推荐他们可能感兴趣的商品。

(7)API网关

  • 所有外部请求首先通过API网关。
  • 负责请求的路由、认证、负载均衡、请求限制等。

交互:

  • 当用户想购买商品时,他们首先通过用户服务登录。
  • 用户浏览商品,这些数据由商品服务提供。
  • 用户选择购买商品,订单服务创建一个新的订单。
  • 用户进行支付,支付服务处理支付并返回结果。
  • 订单成功支付后,订单服务更新订单状态。
  • 用户收到商品后,可以通过评价服务为商品留下评价。
  • 当用户下次登录并浏览商品时,推荐服务根据其历史记录提供商品推荐。

技术细节:

  • 每个微服务都有其自己的数据库,以保持数据的独立性和一致性。
  • 服务之间通过RESTful API、gRPC或其他轻量级协议进行通信。
  • 所有服务都部署在容器中,例如Docker,便于快速部署、扩展和恢复。
  • 使用Kubernetes或其他容器编排工具来管理和自动化服务的部署。
  • 使用像Prometheus和Grafana这样的工具来监控服务的健康状况和性能。

这只是一个简化的案例,实际的电子商务平台会有更多的功能和更复杂的交互。但这提供了一个微服务如何工作和如何组合在一起以提供全面功能的基本概念。

四、微内核架构

1、定义

微内核架构(Microkernel Architecture)是一种设计模式,将系统的核心功能与可插拔的组件模块分开。这种架构的主要目的是使系统更加灵活、可扩展和易于维护。

以下是微内核架构的关键特点和详细描述:

(1)核心系统(微内核):微内核是系统的核心,包含最基本的功能,这些功能是必要的、不变的,对于系统的正常运行至关重要。这些功能通常包括基础的系统管理、通信和安全性等。

(2)外部组件:外围的组件或插件包含那些可以独立于核心系统进行变化或扩展的功能。这些组件与微内核通信,并依赖于其提供的核心服务。

(3)插件化与可扩展性:外部组件设计为插件形式,可以轻松地添加、移除或更新,而不需要修改微内核。这允许系统可以容易地适应新需求或技术。

(4)隔离性:微内核与外部组件之间的交互通过明确定义的接口进行,确保了良好的隔离性。这意味着一个组件的失败不会导致整个系统崩溃。

(5)通信机制:微内核与其外部组件之间的交互通常通过某种形式的消息传递或事件机制来完成。

(6)灵活性:由于系统的核心功能与可变的功能分离,所以可以根据需求轻松地替换、升级或添加新的外部组件。

微内核架构在操作系统设计中有着悠久的历史。传统的“巨型”操作系统将大部分功能(如设备驱动、文件系统等)集成到内核中,而微内核操作系统则将这些功能移到内核之外,使内核尽可能地小和简单。

2、举例

一个广为人知的微内核框架的例子是Eclipse,它是一个开源的集成开发环境(IDE)。虽然Eclipse最初是为Java开发设计的,但由于其微内核架构,它现在支持多种语言和开发任务。

以下是Eclipse微内核框架的描述:

(1)核心系统(微内核)

  • Eclipse的核心是其插件系统。这个核心系统提供了插件之间的依赖管理、生命周期管理和通信机制。
  • 该核心不包括任何特定于语言或任务的功能。这意味着不包括Java、C++或任何其他语言的开发工具。核心只是为这些功能提供一个框架。

(2)外部组件

  • 在Eclipse中,几乎所有的功能都作为插件提供。这包括用于Java、Python、C++和其他语言的开发工具;版本控制工具,如Git和SVN;以及其他各种工具和功能。
  • 由于Eclipse的插件体系,第三方开发者可以为其创建自己的插件,进一步扩展Eclipse的功能。

(3)插件化与可扩展性

  • 用户可以根据需要安装或卸载插件,以定制其Eclipse实例。这为开发者提供了巨大的灵活性,允许他们选择自己需要的工具,而忽略其他工具。

(4)通信机制

  • 插件可以通过Eclipse提供的扩展点和扩展机制与其他插件通信。这允许插件为其他插件添加功能或与其他插件共享数据。

(5)灵活性

  • Eclipse的微内核架构使其成为一个非常灵活的开发环境。这意味着可以轻松地为Eclipse添加新的功能或工具,或将其适应新的开发任务。

规则引擎可以被看作是微内核架构的一个实例,因为它将基础的规则处理逻辑(微内核)与具体的业务规则和其他功能(外部组件)分离开来。一个典型的、采用微内核架构的规则引擎是 "Drools"。

Drools 是一个开源的业务规则管理系统(BRMS)以及业务规则引擎项目,使用 Java 语言编写。以下是如何看待 Drools 作为一个微内核架构的例子:

(1)核心引擎:Drools 有一个核心的规则匹配引擎,称为 ReteOO 引擎。这是其微内核的部分,负责基础的规则评估和执行功能。它本身并不知道具体的业务规则;它只知道如何处理和评估规则。

(2)规则定义:在 Drools 中,业务规则可以使用其特定的语言(Drools Rule Language,简称 DRL)编写。这些规则定义可以看作是“插件”或“模块”,因为它们可以独立于核心引擎进行更改、更新或替换。

(3)工具和扩展:除了核心引擎和规则定义,Drools 还提供了其他一些工具和扩展,如决策表、DSLs、工作流引擎等。这些工具和扩展可以被看作是微内核架构中的其他外部组件,它们与核心引擎紧密集成,但可以独立进行更改和扩展。

(4)灵活性:由于 Drools 的这种架构,开发人员可以非常容易地添加、修改或删除规则,而不需要触及核心引擎的代码。这大大提高了系统的灵活性和可维护性。

总的来说,Drools 是微内核架构的一个很好的例子,因为它将基础的规则处理逻辑(微内核)与具体的业务规则和其他功能(外部组件)分离开来。

3、优缺点

优点:

(1)松耦合:模块之间依赖关系弱,通过预定义接口进行通信。

(2)可扩展性好:可以方便地通过增加模块的实例来扩展系统功能。

(3)稳定性好:核心系统相对较小并且不容易更改,因此单个系统的稳定性得到了增强。

(4)性能高:模块间通信在同一进程内,避免网络通信开销。

缺点:

(1)性能开销大:由于外部模块需要通过内核进行通信,可能引入额外的性能开销。

(2)单点风险:所有模块在同一进程,一旦进程崩溃会导致全系统崩溃。

(3)设计挑战:正确地分离核心功能和辅助功能需要深入的设计考虑,否则容易导致不符合业务边界的划分或者内聚性变差。

(4)调试困难。模块边界多,跨模块调试不易。

4、微内核与微服务、SOA架构的异同点

(1)抽象级别: 微内核通常是在单一应用程序内部的设计,而微服务和SOA主要关注的是如何在多个独立运行的服务之间进行交互。

(2)通信方式: 微内核的组件间通信可能是进程内的,而微服务和SOA的服务间通信是进程间的,涉及网络通信。

(3)部署: 微内核应用可能作为一个整体部署,而微服务和SOA服务可以独立部署。

(4)灵活性: 微内核的灵活性主要体现在应用程序内部,而微服务和SOA的灵活性体现在系统的整体架构上。

(5)业务边界:微服务和SOA模块更符合业务边界,微内核不太符合业务边界。

5、应用

Minix 是由 Andrew S. Tanenbaum 为教育目的创建的操作系统。它使用微内核架构,此案例展示了微内核架构如何在操作系统设计中得到应用,提供了健壮性和模块化的优势,但也带来了一些性能挑战。

微内核设计:

在 Minix 中,核心系统只提供了最基础和必要的功能,如:进程调度、进程间通信、低级内存管理等。这些功能是运行在微内核中的。

外部模块/组件:

(1)文件系统:这不是内核的一部分,而是作为一个用户级进程运行的。因此,文件系统崩溃不会导致整个操作系统崩溃。

(2)设备驱动:在 Minix 中,设备驱动同样是作为用户级进程运行的。这意味着驱动程序可以独立于内核进行更新或替换,而且驱动程序之间出现的问题不会导致系统级故障。

(3)网络堆栈:网络相关的功能也是在用户空间中作为进程运行的。

(4)通信:各组件与微内核之间主要依赖进程间通信(IPC)来进行互动。

优势:

(1)健壮性:一个组件的失败(如文件系统或某个设备驱动)不会导致整个系统崩溃。

(2)灵活性:可以很容易地替换或更新系统的某一部分,而不需要修改微内核。

(3)简明性:由于微内核只包含最基本的功能,所以其代码较为简洁,便于学习和理解。

希望对你有所启示。


免责声明
本文内容(图片、文章)翻译/转载自国内外资讯/自媒体平台。如有侵权或其它,请联系 admin@chvmgo.com,我们会第一时间配合删除。

相关内容