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

news2024/11/22 11:47:37

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

概述:

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

微内核架构

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

模式描述

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

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

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

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

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

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

模式示例

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

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

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

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

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

结论

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

优点:

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

缺点:

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何搭建LNMP架构

目录 一、什么是LNMP Linux系统 Apache服务 Nginx服务 MySQL数据库 PHP服务 二、搭建LNMP 安装Nginx服务 第一步 关闭防火墙和安全机制 第二步 安装依赖环境 第三步 创建运行用户 第四步 解压服务包 第五步 编译安装 第六步 编译 第八步 添加 Nginx 系统服务 …

leetcode63. 不同路径 II(动态规划-java)

不同路径 II leetcode63. 不同路径 II题目描述暴力递归代码演示动态规划代码演示 动态规划空间压缩 动态规划专题 leetcode63. 不同路径 II 来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/unique-paths-ii 题目描述 一个…

自然图像中的字符识别:Chars74K 数据集

字符识别是 研究人员从计算机早期开始工作 视觉。随着当今相机的无所不在,应用 的自动字符识别比以往任何时候都更广泛。为 拉丁字母,这在很大程度上被认为是一个已解决的问题 受限情况,例如扫描文档的图像 包含常用字符字体和统一 背景。但是…

7.4_3B+树

特点:块内无序,块间有序(类比于分块查找) 这个性质是为了追求平衡 3)结点的子树个数与关键字个数相等 4)所有叶节点包含全部关键字及指向相应记录的指针,叶节点中将关键字按照大小顺序排列, 并且相邻叶节点…

Camera之android8.0以上HIDL与C++数据类型转换(三十)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注:Android…

rust 集合、错误处理、泛型、Trait、生命周期、包

集合组织特性相同的数据;泛型可以定义任何抽象数据类型;生命周期限制所有权的作用域范围;错误处理使程序更健壮。 集合 一组特性相同的数据集合,除了基本数据类型的元组、数组。rust 标准库提供了一些非常有用的数据结构。 Vec…

Redis从入门到精通【进阶篇】之高可用主从详解

文章目录 0.前言1.详解1.1 主从复制概述1.2 主从复制原理1.2.1.全量复制1.2.2.增量复制1.2.3.详细描述1.3 更深入理解1.4 常见面试题 2. 总结3. Redis从入门到精通系列文章 0.前言 Redis是一个高性能的键值存储系统,广泛应用于Web应用、缓存、消息队列等领域。在实…

C++【STL】之priority_queue学习

优先级队列 优先级队列priority_queue也是STL库中容器适配器的一种,常用于进行数据优先级的处理,说到这儿是不是发现有些熟悉,没错它和我们之前讲解的堆本质上就是一个东西,底层都是数组存储的完全二叉树,它在STL库中…

零基础速成simulink代码生成——DBC文件CAN报文+stateflow 5

零基础速成simulink代码生成——DBC文件CAN报文+stateflow 5 上一篇文章中,已经实现将dbc文件进行代码生成,这边我们要实现一个功能,添加多几个can报文分时发送,结合statflow简单实现这个功能。 添加报文 我们还是选用相同的can报文添加 选中所有的模块,ctrl+c。 ctrl+…

InvPT++:用于视觉场景理解的倒金字塔多任务Transformer

文章目录 InvPT: Inverted Pyramid Multi-Task Transformer for Visual Scene Understanding摘要本文方法整体结构InvPT EncoderTask-Specific Preliminary DecodersStructure of InvPT DecodeUP-Transformer BlockCross-Scale Self-Attention: Fusion Attention and Selective…

团体程序设计天梯赛-练习集L1篇⑦

🚀欢迎来到本文🚀 🍉个人简介:Hello大家好呀,我是陈童学,一个与你一样正在慢慢前行的普通人。 🏀个人主页:陈童学哦CSDN 💡所属专栏:PTA 🎁希望各…

ChatGPT | LangChain的文本切割方法对比

本文来自http://blog.csdn.net/hellogv/ ,引用必须注明出处! ChatGPT面向对话格式的文本理解很好,但如果要把网络上的文章让ChatGPT直接分析则会有格式的问题。文本清洗是个大课题,讲起来需要很多篇幅,优化起来前路漫…

学习C++的意义

文章目录 前言意义软件方法论的发展面向对象的程序设计宽泛的意义 C到C的升级ubuntu安装g编译器总结 前言 C是一种强大而广泛应用的编程语言,具有广泛的用途和应用领域。无论你是计算机科学专业的学生、自学编程的爱好者,还是想要进一步提升编程技能的专…

在linux系统中如何设置定时任务

前言: 在linux日常运维过程中我们常常需要在指定时间段自动停止或启动某个服务我们不可能人为的手动去执行,这时候我们就可以给对应的任务设置一个定时。后面我就可以将周期性的、规则的工作交给定时任务去完成。 **一次性任务:**顾名思义就是…

SAP CAP篇七:为CAP添加Fiori Launchpad入口 (Sandbox环境)

本文目录 本系列之前的文章在现有代码基础上继续增强增强app文件夹文件 package.json文件夹appconfig文件fioriSandboxConfig.json文件 fiori.html更新Srv中的UiIndexContentProviderFactory 再次检查代码运行效果代码库 (Gitcode) 本系列之前的文章 本系列之前的文章&#xf…

javaWeb之cookiesession

1 回顾 1.1 response对象 一次响应封装对象,由服务器创建。使用response对象将服务器需要的数据发送给浏览器。 将数据存放response对象中,tomcat从response对象获得数据,根据数据组织http响应,最后将http响应内容发送给浏览器&…

CTF-Show密码学:ZIP文件密码破解【暴力破解】

萌新 隐写23 题目内容: 文件的主人喜欢用生日做密码,而且还是个90后。 一、已知条件 在这个题目中,我们有以下已知条件: 文件的主人喜欢用生日做密码 - 这个条件告诉我们,密码可能是一个八位的纯数字密码&#xff0c…

windows服务器——部署PKI与证书服务

作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​ 目录 前言 学习导图 一.PKI 概念 1.PKI体系能够实现的功能 二.公钥加密技术 1.公钥加…

股票量化系统QTYX选股框架实战案例集|大盘跳水,上涨趋势票抗跌-230621

前言 “实战案例个股画像”系列是和大家分享我基于QTYX的选股框架,在实战中选股的应用案例,和大家一起见证QTYX选股框架逐步完善的过程,帮助大家更好地理解QTYX选股框架精髓。 关于QTYX的使用攻略可以查看链接:QTYX使用攻略 首先要…

C++ 面向对象(2)——继承

C 继承 面向对象程序设计中最重要的一个概念是继承。继承允许我们依据另一个类来定义一个类,这使得创建和维护一个应用程序变得更容易。这样做,也达到了重用代码功能和提高执行效率的效果。 当创建一个类时,您不需要重新编写新的数据成员和…