0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

从分层架构到微服务架构介绍(四)

jf_78858299 来源:元闰子的邀请 作者:元闰子 2023-05-10 17:00 次阅读

前言

微内核架构 (Microkernel Architecture),也被称为 插件式架构 (plug-in architecture),作为一个在几十年前就被创建出来的架构模式,它如今仍然被广泛应用在各个领域中。比如在Web浏览器领域,谷歌的Chrome浏览器之所以被认为功能强大,一个很重要的原因是它有着丰富的插件类型;在开发工具领域,微软的VS Code初始安装后还只是个简单的文本编辑器,但用户可以安装各种插件,从而让它摇身一变成为功能强大的IDE。

Chrome和VS Code都是微内核架构的典型应用例子,它们提供一个具备最基础能力的核心系统,并定义好插件的开发接口。至于需要开发或安装哪种类型的插件,则完全由普通开发者和用户决定,这样的设计让系统 具备了极强的可定制化和可扩展能力

架构视图

微内核架构由以下两部分组成: 核心系统 (core system)和 插件 (plug-in component), 将应用系统的业务逻辑拆分成核心系统和插件,能够提供很好的可扩展性和灵活性,极大地方便了后续需求的新增和修改

图片

微内核架构架构视图

核心系统

核心系统通常只需提供能够支撑整个系统正常运行的基本功能 ,比如前文所举的VS Code例子,用户初始安装的是VS Code的核心系统,它只是一个提供了打开文件、编辑文件内容和保存文件等基本功能的文本编辑器,其他的扩展功能(如语法检查)都是通过安装插件集成的。 将复杂的业务逻辑从核心系统中剥离出来,并通过插件实现,能够提升系统的可扩展性和可维护性 。同时,因为复杂的功能都成了互不干扰的插件,系统的可测性也得到了提高。

考虑现在需要实现一个电子设备回收系统,在回收之前,每种型号的手机设备的回收流程都不一样,那么我们可以这样去实现:

public void assessDevice(String deviceID) {
   if (deviceID.equals("iPhone6s")) {
      assessiPhone6s();
   } else if (deviceID.equals("iPad1"))
      assessiPad1();
   } else if (deviceID.equals("Galaxy5"))
      assessGalaxy5();
   } else ...
      ...
   }
}

如果我们把assessDevice看成是核心系统,那么后面每次新增一个型号的手机,都需要新增一个if分支,也即对核心系统进行了改动。这样的设计会导致核心系统非常地脆弱,正所谓 改的越多,出问题的概率也越大

比起这种将所有的可定制业务逻辑放在核心系统上的设计,更好的应该是将它们实现为插件的形式,这样不仅每个设备回收逻辑都解耦了,还提供了强大的可扩展性:添加一个新的回收设备类型,只需新增一种插件即可,核心系统无需变动。

public void assessDevice(String deviceID) {
  String plugin = pluginRegistry.get(deviceID);
 DevicePlugin devicePlugin =
  (DevicePlugin)constructor.newInstance();
 DevicePlugin.assess();
}

微内核架构在实现时通常都结合了其他架构模式 ,这主要体现在核心系统的设计上,比如根据具体的业务特点,我们可以将核心系统设计成technically partitioned的分层架构,或者是domain partitioned的模块化架构。

图片

核心系统的架构设计

插件

插件就是一些包含了定制化业务逻辑、扩展功能、附加功能的独立组件,用于扩充核心系统的功能 。插件之间是独立的,插件与核心系统之间则一般是“点对点”通信:核心系统通过调用插件提供的接口(比如插件类的方法)使用扩展功能。

插件可以划分为编译时插件和运行时插件两种类型,前者每次变更都需要重新构建和部署整个系统,但实现较为简单;后者则可以在系统运行时进行插件的新增和删除操作,相对地,实现也较为复杂。

编译时插件

在编译时插件中,插件通常以package或namespace实现,比如在package中可以以这样的命名规则来区分插件:app.plug-in..

图片

编译时插件实现

运行时插件

运行时插件中插件的实现通常是动态库的形式,比如.jar.so.dll文件。在上述的设备回收系统的例子中,每种型号的手机设备回收逻辑包含在一个独立的.jar文件中:

图片

运行时插件实现

远端插件

当然,插件和核心系统并非只能通过本地接口调用进行通信,还可以采用REST/消息队列/RPC等方式,这种场景下,插件就变成了一个独立部署的服务。远程插件具备运行时插件的特点,而且能够提供更好的scalability: 插件和核心系统甚至都不必使用相同的技术栈实现,只需遵守既定的REST接口即可

图片

远端插件

为了提升系统处理请求的responsiveness,我们还可以将核心系统调用插件的过程实现为异步通信 。以前文的电子设备回收系统为例,在异步通信的架构下,系统通过一个线程触发插件启动对某个设备的回收流程。之后,该线程无需一直等待回收结束,它可以去继续回收别的设备。当设备回收结束后,插件会通过异步队列告知核心系统。这样的异步设计可以减少无谓的等待流程,明显改善系统的responsiveness。

如果涉及到读写数据库,为了能够维持插件的独立性,每个插件最好能够拥有独立的数据库 。如果插件间有着无可避免的数据交互,则可以为核心系统配置一个中心数据库,并通过它来进行数据中转。

图片

插件的的独立数据库

插件中心

核心系统在加载插件前,必须得知道 当前有哪些可用的插件 ,以及 这些插件在哪里可以获取 。这要求系统有一个地方去管理插件,这就是 插件中心 (plug-in registry)的功能。插件中心类似于服务化架构中服务注册中心的作用,它保存了所有插件的基本信息,包括名称、数据契约、通信协议、加载地址等。

我们可以简单地将插件中心实现为一个本地的map表,其中key可以是插件名称,value为获取插件的地址:

Map<String, String> registry = new HashMap<String, String>();
static {
  //point-to-point access example
  registry.put("iPhone6s", "Iphone6sPlugin");

  //messaging example
  registry.put("iPhone6s", "iphone6s.queue");

  //restful example
  registry.put("iPhone6s", "https://atlas:443/assess/iphone6s");
}

为了实现一些较为复杂的功能,如插件上下线通知等,我们还可以借助Apache ZooKeeper、ETCD这类的分布式协同系统实现 远程插件中心

通信契约

通信契约定义了插件与核心系统之间的通信方式、交互行为和数据格式。通信方式可以是本地接口调用、REST、RPC、消息队列等;交互行为则可以理解为插件对核心系统提供的接口,比如本地的函数/方法、REST的URI等;对本地插件而言,数据格式通常是一个类/结构体,对远程插件而言,常用的数据格式有JSON、XML、ProtoBuf等。

考虑电子设备回收系统的例子,系统有着如下定义的通信契约:

public interface AssessmentPlugin {
  // 回收设备流程
 public AssessmentOutput assess();
  // 将该插件注册到插件中心
 public String register();
  // 从插件中心去注册
 public String deregister();
}

public class AssessmentOutput {
  // 回收报告,仅仅用于展示结构给用户看,核心系统无需了解该格式
 public String assessmentReport;
  // 用于标识该设备是否可以在二手市场上重新售卖
 public Boolean resell;
  // 表示该设备的价值
 public Double value;
  // 表示推荐的售卖价格
 public Double resellPrice;
}

从该契约定义中可以看出,通信方式为本地接口调用(AssessmentPlugin接口);它有着3个交互行为,assess()为回收设备流程、register()表示将该插件注册到插件中心、deregister表示去注册;数据格式则是AssessmentOutput类,它定义了回收流程的结果。

架构评分

图片

微内核架构的架构评分

和之前介绍的分层架构、管道架构一样,微内核架构同样属于单体架构,因此Simplicity和Overall cost是该架构模式主要优势;而Elasticity、Fault tolerance和Scalability是主要劣势。

另外,微内核架构的Testability、Deployability、Reliability、Modularity之所以能够取得3颗星,得益于不同的功能能够被拆分至独立的插件上,特别地,运行时插件的增删无需重新部署系统。 这使得系统能够快速响应需求变更,具备很高的扩展性 。比如对于前面的电子设备回收系统,如果需要新增一种新的电子设备回收流程,只需新增一个插件即可;如果某种设备不再需要回收,则去除对应插件即可。

微内核架构比较特别的一点是,它既可以是technically partitioned,也可以是domain partitioned,这取决于核心系统的实现方式,前文也有介绍。

总结

Robert C.Martin曾经说过, 软件开发技术发展的历史就是一个如何想方设法方便地增加插件,从而构建一个可扩展、可维护的系统架构的故事 。在敏捷开发的潮流之下,需求的变更如同家常便饭,系统不应该因为某一部分发生变更从而导致其他不相关的部分出现问题。将系统设计为微内核架构,就等于构建起了一面变更无法逾越的防火墙,插件发生的变更就不会影响系统的核心业务逻辑。

微内核架构的设计思想,能够极大提升系统的可扩展性和健壮性 ,在其他的一些软件方法论里,我们也隐约能看到它的影子。比如在领域驱动设计中,领域层就相当于核心系统,它定义了系统的核心业务逻辑;基础设施层则相当于插件,切换不同的基础设施并不会影响系统的业务逻辑,这得益于基础设施层依赖倒置的设计原则。

当然,作为微内核架构也有着一些缺点,它天然具备了单体架构的一些劣势,比如核心系统作为架构的中心节点并不具备Fault tolerance能力。因此,该架构模式往往被广泛应用于一些着重提供很强的用户定制化功能的小型产品,如VS Code等,它们对系统的Elasticity、Fault tolerance和Scalability并没有很高的要求。

每种架构模式都有其合适的应用场景,只有熟悉常用的几种架构模式,才能设计出更好的软件系统。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Web
    Web
    +关注

    关注

    2

    文章

    1238

    浏览量

    68463
  • IDE
    IDE
    +关注

    关注

    0

    文章

    326

    浏览量

    46338
  • 微内核架构
    +关注

    关注

    0

    文章

    5

    浏览量

    6522
  • 浏览器
    +关注

    关注

    1

    文章

    974

    浏览量

    34420
收藏 人收藏

    评论

    相关推荐

    游戏公司不使用微服务架构的原因

    微服务基本只有 request/response 的模式。做不了 streaming?微服务通常要求应用是无状态的才能做到水平扩展。streaming 本身就是加入了状态
    的头像 发表于 12-29 11:18 215次阅读

    如何搭建微服务架构的全局图景

    如果一直保持共用数据库的模式,则整个架构会越来越僵化,失去了微服务架构的意义。因此小明和小红一鼓作气,把数据库也拆分了。所有持久化层相互隔离,由各个服务自己负责。另外,为了提高系统的实
    的头像 发表于 12-27 15:16 248次阅读
    如何搭建<b class='flag-5'>微服务</b><b class='flag-5'>架构</b>的全局图景

    如何构建弹性、高可用的微服务

    基于微服务的应用程序可实现战略性数字转型和云迁移计划,对于开发团队来说,这种架构十分重要。那么,如何来构建弹性、高可用的微服务呢?RedisEnterprise给出了一个完美的方案
    的头像 发表于 11-26 08:06 237次阅读
    如何构建弹性、高可用的<b class='flag-5'>微服务</b>?

    设计微服务架构的原则

    微服务是一种软件架构策略,有利于改善整体性能和可扩展性。你可能会想,我的团队需不需要采用微服务,设计微服务架构有哪些原则?本文会给你一些灵感
    的头像 发表于 11-26 08:05 240次阅读
    设计<b class='flag-5'>微服务</b><b class='flag-5'>架构</b>的原则

    docker微服务架构实战

    的容器化技术,为微服务架构的实施提供了强大的支持。本文将介绍Docker微服务架构的实战经验,包括Docker的概述、
    的头像 发表于 11-23 09:26 314次阅读

    springcloud微服务架构

    Spring Cloud是一个开源的微服务架构框架,它提供了一系列工具和组件,用于构建和管理分布式系统中的微服务。它基于Spring框架,旨在通过简化开发过程和降低系统复杂性来帮助开发人员构建弹性
    的头像 发表于 11-23 09:24 389次阅读

    深入探讨微服务和事件驱动架构区别

    微服务不同,事件驱动架构不要求强制的粒度。事件处理器可以有不同的规模,可以是响应特定事件的小型功能,也可以是处理多个事件的大型子系统。在物流系统中,事件驱动架构可以包括用于包裹跟踪更新的小型事件处理器,也可以有更大的子系统用于
    的头像 发表于 10-30 15:06 262次阅读

    SpringCloud微服务架构:实现分布式系统的无缝协作

    在深入Spring Cloud之前,让我们首先了解一下什么是微服务架构微服务架构是一种软件架构模式,将一个应用程序拆分为一组小型、独立的
    的头像 发表于 10-12 16:21 265次阅读
    SpringCloud<b class='flag-5'>微服务</b><b class='flag-5'>架构</b>:实现分布式系统的无缝协作

    【Spring Cloud 】基于微服务架构的智慧工地监管平台源码带APP

    技术架构微服务 开发语言:Java 开发工具:Idea 前端框架:Vue 后端框架:Spring Cloud 数 据 库:MySql 移 动 端:UniApp
    的头像 发表于 08-28 11:10 375次阅读
    【Spring Cloud 】基于<b class='flag-5'>微服务</b><b class='flag-5'>架构</b>的智慧工地监管平台源码带APP

    释放微服务架构全部潜力的关键

      释放微服务的力量 您是否正在努力构建高效、可扩展且有弹性的软件系统?作为软件开发人员或高级开发人员,您一定遇到过“微服务架构”一词。这种革命性的软件开发方法已被许多成功的科技巨头采用,例如
    的头像 发表于 06-25 11:54 333次阅读
    释放<b class='flag-5'>微服务</b><b class='flag-5'>架构</b>全部潜力的关键

    嵌入式7种架构模式分析

    模式:     ①  分层架构     ② 多层架构     ③  管道 - 过滤器架构     ④ 客户端 - 服务
    的头像 发表于 06-13 15:31 3054次阅读
    嵌入式7种<b class='flag-5'>架构</b>模式分析

    分层架构微服务架构介绍(五)

    本文要介绍的是 服务架构 (Service-Based Architecture, SBA )。 SBA 可以看成是单体架构微服务
    的头像 发表于 05-10 17:02 594次阅读
    从<b class='flag-5'>分层</b><b class='flag-5'>架构</b>到<b class='flag-5'>微服务</b><b class='flag-5'>架构</b><b class='flag-5'>介绍</b>(五)

    分层架构微服务架构介绍(三)

    **管道架构** (Pipeline Architecture),通常也被称为 **管道-过滤器架构** (Pipes and Filter Architecture),是最常用的架构模式之一
    的头像 发表于 05-10 16:58 394次阅读
    从<b class='flag-5'>分层</b><b class='flag-5'>架构</b>到<b class='flag-5'>微服务</b><b class='flag-5'>架构</b><b class='flag-5'>介绍</b>(三)

    分层架构微服务架构介绍(二)

    将系统按照功能划分成前端和后端,分别部署在两台服务器上,问题得到了缓解,于是便有了**Client/Server架构**的出现。
    的头像 发表于 05-10 16:57 483次阅读
    从<b class='flag-5'>分层</b><b class='flag-5'>架构</b>到<b class='flag-5'>微服务</b><b class='flag-5'>架构</b><b class='flag-5'>介绍</b>(二)

    分层架构微服务架构介绍(一)

    们看到一个架构模式的名字时,也要马上想到对应的架构图及其基本特点。比如,当谈到**分层架构**时,我们就应该想起它的架构图是怎样的、有哪些出
    的头像 发表于 05-10 16:55 810次阅读
    从<b class='flag-5'>分层</b><b class='flag-5'>架构</b>到<b class='flag-5'>微服务</b><b class='flag-5'>架构</b><b class='flag-5'>介绍</b>(一)