马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
前言
微内核这个词一听就好像是操纵体系层面的东西,不过我个人觉得这种架构思想也可以应用在java的一样平常业务开辟中,本文就以我对微内核架构的理解,讨论一下微内核架构在java业务开辟中怎样应用,也当作是自己的一个学习过程,说的不对的,希望各位大佬指正。
什么是微内核
微内核(Micro kernel)是提供操纵体系焦点功能的内核的精简版本,它设计成在很小的内存空间内增加移植性,提供模块化设计,以利用户安装不同的接口,如DOS、Workplace OS、Workplace UNIX等。IBM、Microsoft、开放软件基金会(OSF)和UNIX体系实验室(USL)、鸿蒙OS等新操纵体系都采用了这一研究成果的优点。
以上是来自百度百科的解释。我说一下我的理解,微内核架构,还有另外一个叫法:插件式架构。与微内核架构相反的,是宏内核架构,按我的理解,宏内核结构就是把所有业务都放到一个地方执行,而微内核架构是将不同的业务交给不同的插件去做,内核负责管理插件、调度插件和消息传递。两者各有什么优缺点呢?
宏内核:业务间相互影响,一个业务出问题,可能影响整个内核,面临个性化需求,会有代码堆叠和难维护的问题。正常来说,它的性能会比微内核要快。
微内核:高度灵活,业务由插件去处理,可以根据必要加载不同插件以适应不同的需求,乃至可以对插件次序灵活调整。但是性能会比宏内核要差,内存开销也会比宏内核高。
微内核的角色:
一、 内核:根本不包含业务代码,只有少量和内核有关的代码,一旦完成,几乎不会再有变更。
内核的职责:
- 插件管理:负责管理插件的生命周期,好比插件的注册、加载、卸载等。
- 插件链接:我的理解,其实就是调用插件提供的服务。
- 插件通信:负责在插件间传递信息。
二、插件:真正负责处理业务的模块,有高度内聚的特点,每个插件尽量独立,不依赖其他模块、插件等。
Java代码模拟微内核架构:
定内核规范:
- package com.example.demo.core;
- import com.alibaba.fastjson.JSONObject;
- import java.util.*;
- /**
- * 类描述:
- * 核心服务类
- * 微内核架构(插件式架构)
- * 本类为内核,职责是:
- * 1、插件管理:插件的注册、加载、卸载等。
- * 2、插件连接:指插件链接到核心,按照插件接口规范,由核心调用插件接口进行使用
- * 3、插件通信:由核心作为通信中介,在插件之间传递信息
- * @Author: dyc
- * @Date:2024/5/6 15:58
- */
- public abstract class CoreService {
- //注册表
- LinkedHashSet<String> registerTable;
- // 插件池
- Map<String,Plugin> pluginPool;
- /**
- * 插件注册
- * @param pluginKey 插件的完整类名
- */
- public void registerPlugin(String pluginKey) {
- if (registerTable==null) {
- registerTable = new LinkedHashSet<>();
- }
- if (registerTable.contains(pluginKey)) {
- //已经注册过,不再重复注册,如果允许重复注册的话,此处不需要
- return;
- }
- registerTable.add(pluginKey);
- }
- /**
- * 加载插件
- * @throws Exception
- */
- public void loadPlugins() throws Exception {
- for (String key:registerTable) {
- try {
- //获取类信息
- Class cla = Class.forName(key);
- //获取实例对象
- Plugin plugin = (Plugin)cla.newInstance();
- if (pluginPool==null) {
- pluginPool = new HashMap<>();
- }
- //加载
- pluginPool.put(key,plugin);
- } catch (Exception e) {
- e.printStackTrace();
- throw new Exception("加载插件【"+key+"】失败");
- }
- }
- }
- /**
- * 卸载插件
- * @param key 插件名称,插件的完整类名
- */
- public void unloadPlugin(String key) {
- registerTable.remove(key);
- pluginPool.remove(key);
- }
- /**
- * 卸载全部插件
- */
- public void unloadPlugins() {
- registerTable.clear();
- pluginPool.clear();
- }
- /**
- * 执行
- * 抽象此方法,是为了让子类能更加灵活
- * @param param
- * @return
- */
- public abstract JSONObject execute(JSONObject param);
- }
复制代码 定插件规范:
- package com.example.demo.core;
- import com.alibaba.fastjson.JSONObject;
- /**
- * 接口描述:
- * 插件接口,可以理解为为所有插件制定了一套统一的规范
- * 职责:真正负责具体业务的地方
- * 建议实现此接口的类要高度内聚,尽量减少对其他类的依赖
- *
- * @Author: dyc
- * @Date:2024/5/6 16:00
- */
- public interface Plugin {
- /**
- * 执行方法(干活的地方)
- * @param param 方法需要用到的参数
- * @param info 需要在插件之间传递的信息
- * @return 返回值
- */
- public JSONObject execute(JSONObject param,JSONObject info);
- }
复制代码 随便写两个插件实现:
- package com.example.demo.core;
- import com.alibaba.fastjson.JSONObject;
- /**
- * 类描述:
- * 检查插件
- * @Author: dyc
- * @Date:2024/5/6 16:37
- */
- public class CheckPlugin implements Plugin{
- @Override
- public JSONObject execute(JSONObject param, JSONObject info) {
- //取用参数
- System.out.println("参数:"+param);
- //取用通信信息
- System.out.println("上一个插件要传递的信息:"+info);
- //执行具体逻辑
- System.out.println("我是CheckPlugin");
- //给下一个插件传递信息
- info.put("msg","我是checkPlugin要传递的信息");
- JSONObject res = new JSONObject();
- res.put("code",1);//1表示成功
- res.put("msg","成功");
- return res;
- }
- }
复制代码- package com.example.demo.core;
- import com.alibaba.fastjson.JSONObject;
- /**
- * 类描述:
- * 执行插件
- * @Author: dyc
- * @Date:2024/5/6 16:37
- */
- public class ExecutePlugin implements Plugin{
- @Override
- public JSONObject execute(JSONObject param, JSONObject info) {
- //取用参数
- System.out.println("参数:"+param);
- //取用通信信息
- System.out.println("上一个插件要传递的信息:"+info);
- //执行具体逻辑
- System.out.println("我是 ExecutePlugin");
- //给下一个插件传递信息
- info.put("msg","我是 ExecutePlugin 要传递的信息");
- JSONObject res = new JSONObject();
- res.put("code",1);//1表示成功
- res.put("msg","成功");
- return res;
- }
- }
复制代码 写一个内核继续类:
- package com.example.demo.core;
- import com.alibaba.fastjson.JSONObject;
- /**
- * 类描述:
- * 继承内核服务,真正使用内核服务的地方
- * @Author: dyc
- * @Date:2024/5/6 16:44
- */
- public class DemoCoreService extends CoreService {
- @Override
- public JSONObject execute(JSONObject param) {
- //返回值
- JSONObject res = null;
- //按照一般的业务接口,流程一般是这样的:检查->执行
- //按顺序注册
- this.registerPlugin("com.example.demo.core.CheckPlugin");
- this.registerPlugin("com.example.demo.core.ExecutePlugin");
- //加载
- try {
- this.loadPlugins();
- } catch (Exception e) {
- res = new JSONObject();
- res.put("code",-1);//-1失败
- res.put("msg",e.getMessage());
- return res;
- }
- //执行
- JSONObject pluginInfo = new JSONObject();//插件通信信息
- for (String key:registerTable) {
- Plugin plugin = pluginPool.get(key);
- res = plugin.execute(param,pluginInfo);
- if (1!=res.getIntValue("code")) {
- return res;
- }
- }
- return res;
- }
- }
复制代码 调用测试:
- package com.example.demo.core;
- import com.alibaba.fastjson.JSONObject;
- /**
- * 类描述:
- * 调用测试
- * @Author: dyc
- * @Date:2024/5/6 16:57
- */
- public class Test {
- public static void main(String[] args) {
- //调用测试
- DemoCoreService demo = new DemoCoreService();
- demo.execute(new JSONObject());
- }
- }
复制代码 收尾
以上只是我按照自己的理解写的一种最简单的实现,其实还可以优化,好比注册插件可以采用数据库设置等方式增加灵活性,还可以在execute增加事务控制,增加插件革新接口等,能优化的地方还许多,我这里只是展示一下“微内核”架构的一种思想。真正业务用到的时候再去丰富它们。如果有什么不对的,欢迎指正,谢谢。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |