【软件架构模式】—微内核架构

欢迎回到软件架构模式博客系列。这是本系列的第 4 章,我们将讨论微内核架构模式

概述:

  • 内核模式也被称为插件架构模式。
  • 将附加应用程序功能作为插件添加到核心应用程序,以提供可扩展性以及功能分离和隔离。
    这种模式由两种类型的架构组件组成:一个核心系统和插件模块。
  • 应用程序逻辑分布在独立的插件模块和基础核心系统之间,提供应用程序特性和定制处理逻辑的可扩展性、灵活性和隔离性。
  • 从业务应用的角度看,核心系统通常被定义为没有特殊情况、特殊规则或复杂条件处理的定制代码的通用业务逻辑。
  • 插件模块是独立的、独立的组件,包含专门的处理、额外的特性和定制代码,这些代码旨在增强或扩展核心系统以产生额外的业务能力。保持插件之间的通信最少是非常重要的,以避免依赖性问题。
  • 注册表包含每个插件模块的信息,包括其名称、数据协议和远程访问协议详情(取决于插件如何连接到核心系统)。
  • 插件模块可以通过多种方式连接到核心系统,包括OSGi(开放服务网关倡议)、消息传递、网络服务,甚至直接的点对点绑定(即,对象实例化)。
  • 当插件组件由第三方开发,而你无法控制插件使用的合约时。在这种情况下,通常会创建一个适配器,将插件合约与你的标准合约进行对接,这样核心系统就不需要为每个插件编写专门的代码。

微内核架构

微内核架构模式(有时被称为插件架构模式)是实现基于产品的应用程序的自然模式。基于产品的应用程序是那种打包并以版本形式供下载的典型的第三方产品。然而,许多公司也像软件产品一样开发和发布他们的内部业务应用程序,配有版本、发布说明和可插拔特性。这些也是这种模式的自然适合。微内核架构模式允许你将额外的应用程序特性作为插件添加到核心应用程序,提供可扩展性以及特性的分离和隔离。

模式描述

微内核架构模式由两种类型的架构组件组成:一个核心系统和插件模块。应用程序逻辑分布在独立的插件模块和基础核心系统之间,提供应用程序特性和定制处理逻辑的可扩展性、灵活性和隔离性。图3-1展示了基本的微内核架构模式。

微内核架构模式的核心系统传统上只包含使系统运行所需的最小功能。许多操作系统实现了微内核架构模式,这也是这个模式名字的由来。从业务应用的角度来看,核心系统通常被定义为没有特殊情况、特殊规则或复杂条件处理的定制代码的通用业务逻辑。

插件模块是独立的、独立的组件,包含专门的处理、额外的特性和定制代码,这些代码旨在增强或扩展核心系统以产生额外的业务能力。通常来说,插件模块应该独立于其他插件模块,但你当然可以设计需要其他插件存在的插件。无论如何,保持插件之间的通信最少是非常重要的,以避免依赖性问题。

核心系统需要知道哪些插件模块是可用的,以及如何访问它们。实现这一点的一种常见方法是通过某种插件注册表。这个注册表包含每个插件模块的信息,包括其名称、数据协议和远程访问协议详情(取决于插件如何连接到核心系统)。例如,一个用于标记高风险税务审计项目的税务软件插件可能有一个注册表条目,包含服务的名称(AuditChecker)、数据协议(输入数据和输出数据)和协议格式(XML)。如果通过SOAP访问插件,它也可能包含一个WSDL(Web服务定义语言)。

插件模块可以通过多种方式连接到核心系统,包括OSGi(开放服务网关倡议)、消息传递、网络服务,甚至直接的点对点绑定(即,对象实例化)。你使用的连接类型取决于你正在构建的应用程序类型(小型产品或大型业务应用程序)和你的特定需求(例如,单一部署或分布式部署)。这种架构模式本身并没有指定任何这些实现细节,只要求插件模块必须彼此独立。

插件模块与核心系统之间的合约可以从标准合约到定制合约。定制合约通常出现在插件组件由第三方开发,而你无法控制插件使用的合约的情况中。在这种情况下,通常会创建一个适配器,将插件合约与你的标准合约进行对接,这样核心系统就不需要为每个插件编写专门的代码。在创建标准合约(通常通过XML或Java Map实现)时,重要的是要记住从一开始就创建一个版本策略。

模式示例

或许微内核架构最好的例子是Eclipse IDE。下载基本的Eclipse产品只能为你提供一个花哨的编辑器。然而,一旦你开始添加插件,它就会变成一个高度可定制和有用的产品。互联网浏览器是使用微内核架构的另一个常见产品示例:浏览器和其他插件添加了基本浏览器(即,核心系统)中找不到的额外功能。

对于基于产品的软件,例子数不胜数,但大型业务应用程序呢?微内核架构也适用于这些情况。为了说明这一点,让我们使用另一个保险公司的例子,但这次涉及的是保险索赔处理。

索赔处理是一个非常复杂的过程。每个州对保险索赔的允许和不允许都有不同的规则和规定。例如,一些州允许如果你的挡风玻璃被石头破坏,免费更换挡风玻璃,而其他州则不允许。这为标准索赔流程创建了近乎无限的条件集。

不出所料,大多数保险索赔应用程序利用大型和复杂的规则引擎来处理这种复杂性。然而,这些规则引擎可以演变成一个复杂的大泥球,改变一个规则会影响其他规则,或者进行简单的规则更改需要大量的分析师、开发人员和测试人员。使用微内核架构模式可以解决这些问题。

你在下图看到的文件夹堆表示的是索赔处理的核心系统。它包含保险公司处理索赔所需的基本业务逻辑,只是没有任何定制处理。每个插件模块包含该州的特定规则。在这个例子中,插件模块可以使用定制的源代码或单独的规则引擎实例来实现。无论实现方式如何,关键点是,特定州的规则和处理与核心索赔系统是分开的,可以被添加、移除和更改,对核心系统或其他插件模块的其余部分影响微乎其微。

结论

以下是微内核架构模式的优点和缺点。

优点:

  1. 它可以在最小化改变核心系统的同时,对插件模块的改变做出反应。
  2. 不像分层架构,有插件模块意味着部署更容易,从而最小化停机时间。
  3. 测试也更容易,因为可以单独测试每个模块。
  4. 尽管一般来说并不是用于高性能应用的理想模式,但是由于只包含所需的功能来定制应用,它可以表现得很好。

缺点:

  1. 应用程序倾向于较小的规模,因此并不具有很高的可扩展性。
  2. 需要在实现之前进行彻底的设计分析。需要分析的项目包括合约版本控制、内部插件注册表、插件粒度,以及插件连接的多样选择。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/2049.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringSecurity实现前后端分离登录授权详解

在介绍完SpringSecurity实现前后端分离认证之后,然后就是SpringSecurity授权,在阅读本文章之前可以先了解一下作者的上一篇文章SpringSecurity认证SpringSecurity实现前后端分离登录token认证详解_山河亦问安的博客-CSDN博客。 目录 1. 授权 1.1 权限系…

ERR! code ERR_SOCKET_TIMEOUT

问题 安装npm包,终端报错ERR! code ERR_SOCKET_TIMEOUT ERR! code ERR_SOCKET_TIMEOUT详细问题 笔者运行以下命令重新安装依赖项: npm install控制台报错,具体报错信息如下 npm ERR! code ERR_SOCKET_TIMEOUT npm ERR! network Socket t…

360手机刷机 360手机Xposed框架安装 360手机EdXposed、LSP 360手机xposed模块

360手机刷机 360手机Xposed框架安装 360手机EdXposed、LSP 360手机xposed模块 参考:360手机-360刷机360刷机包twrp、root 360刷机包360手机刷机:360rom.github.io 【前言】 手机须Twrp或root后,才可使用与操作Xposed安装后,重启…

Spring Boot 中的 @Transactional 注解是什么,原理,如何使用

Spring Boot 中的 Transactional 注解是什么,原理,如何使用 简介 在 Spring Boot 中,Transactional 注解是非常重要的一个注解,用于实现数据库事务的管理。通过使用 Transactional 注解,我们可以很方便地对事务进行控…

java + opencv对比图片不同

1,去官网下载opencv,下载的时候需要注册一个 Oracle 账户,分分钟就能注册。然后安装。我下的是4.7的。 2,找到jar包放进项目里 3,项目结构,比较简单 4,把下载的文件放进C盘 5,主类代…

GitLab无法提交大文件的问题

GitLab无法提交大文件的问题 问题描述 GitLab 当提交大文件时遇到如下报错 MYOPS001MYOPS001 MINGW64 /e/work/GitLab/system-deploy (main) $ git push Enumerating objects: 91, done. Counting objects: 100% (91/91), done. Delta compression using up to 16 threads C…

西安石油大学期末考试C++真题解析

1、一、类型、返回值类型 二、参数表、函数重载 2、一、实例化 二、实例化的类型或类类是对象的蓝图,对象是类的实例化 3、const 4、一个 两个 5、一、公有继承 二、私有继承、保护继承 6、抽象类、实例化对象 7、函数模板、类模板 8、try、catch、throw 9、…

selenium之鼠标操作

首先导入ActionChains类,该类可以完成鼠标移动,鼠标点击事件,键盘输入、内容菜单交互等交互行为。 from selenium.webdriver.common.action_chains import ActionChains 操作语法: 第一步:初始化ActionChains类&…

python【爬虫】【批量下载】年报抓取

python年报爬取更新 本人测试发现,ju chao网的年报爬取距离我上一篇博客并没有啥变化,逻辑没变,应好多朋友的需要,这里补充代码 import json import osimport requestsweb_url 改成网站的域名,因为csdn屏蔽 def load…

HOT20-旋转图像

leetcode原题链接:旋转图像 题目描述 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 1: 输入&am…

Android JetPack 深入分析ViewModel源码

文章目录 前言源码分析ViewModel是如何创建的?ViewModelProvider(this)做了什么?小结 get(MyViewModel::class.java)做了什么?小结 ViewModel是如何实现配置更改后数据恢复的?整体时序图 结语 前言 本文主要分析ViewModel相关源码…