微内核(插件式)架构在JAVA业务开辟中的应用

打印 上一主题 下一主题

主题 551|帖子 551|积分 1653

前言

    微内核这个词一听就好像是操纵体系层面的东西,不过我个人觉得这种架构思想也可以应用在java的一样平常业务开辟中,本文就以我对微内核架构的理解,讨论一下微内核架构在java业务开辟中怎样应用,也当作是自己的一个学习过程,说的不对的,希望各位大佬指正。
什么是微内核

    微内核(Micro kernel)是提供操纵体系焦点功能的内核的精简版本,它设计成在很小的内存空间内增加移植性,提供模块化设计,以利用户安装不同的接口,如DOS、Workplace OS、Workplace UNIX等。IBM、Microsoft、开放软件基金会(OSF)和UNIX体系实验室(USL)、鸿蒙OS等新操纵体系都采用了这一研究成果的优点。
    以上是来自百度百科的解释。我说一下我的理解,微内核架构,还有另外一个叫法:插件式架构。与微内核架构相反的,是宏内核架构,按我的理解,宏内核结构就是把所有业务都放到一个地方执行,而微内核架构是将不同的业务交给不同的插件去做,内核负责管理插件、调度插件和消息传递。两者各有什么优缺点呢?
    宏内核:业务间相互影响,一个业务出问题,可能影响整个内核,面临个性化需求,会有代码堆叠和难维护的问题。正常来说,它的性能会比微内核要快。
    微内核:高度灵活,业务由插件去处理,可以根据必要加载不同插件以适应不同的需求,乃至可以对插件次序灵活调整。但是性能会比宏内核要差,内存开销也会比宏内核高。
微内核的角色:

   一、 内核:根本不包含业务代码,只有少量和内核有关的代码,一旦完成,几乎不会再有变更。
    内核的职责

  • 插件管理:负责管理插件的生命周期,好比插件的注册、加载、卸载等。
  • 插件链接:我的理解,其实就是调用插件提供的服务。
  • 插件通信:负责在插件间传递信息。
    二、插件:真正负责处理业务的模块,有高度内聚的特点,每个插件尽量独立,不依赖其他模块、插件等。

Java代码模拟微内核架构:

定内核规范:

  1. package com.example.demo.core;
  2. import com.alibaba.fastjson.JSONObject;
  3. import java.util.*;
  4. /**
  5. * 类描述:
  6. * 核心服务类
  7. *  微内核架构(插件式架构)
  8. *  本类为内核,职责是:
  9. *  1、插件管理:插件的注册、加载、卸载等。
  10. *  2、插件连接:指插件链接到核心,按照插件接口规范,由核心调用插件接口进行使用
  11. *  3、插件通信:由核心作为通信中介,在插件之间传递信息
  12. * @Author: dyc
  13. * @Date:2024/5/6 15:58
  14. */
  15. public abstract class CoreService {
  16.     //注册表
  17.     LinkedHashSet<String> registerTable;
  18.     // 插件池
  19.     Map<String,Plugin> pluginPool;
  20.     /**
  21.      * 插件注册
  22.      * @param pluginKey 插件的完整类名
  23.      */
  24.     public void registerPlugin(String pluginKey) {
  25.         if (registerTable==null) {
  26.             registerTable = new LinkedHashSet<>();
  27.         }
  28.         if (registerTable.contains(pluginKey)) {
  29.             //已经注册过,不再重复注册,如果允许重复注册的话,此处不需要
  30.             return;
  31.         }
  32.         registerTable.add(pluginKey);
  33.     }
  34.     /**
  35.      * 加载插件
  36.      * @throws Exception
  37.      */
  38.     public void loadPlugins() throws Exception {
  39.         for (String key:registerTable) {
  40.             try {
  41.                 //获取类信息
  42.                 Class cla = Class.forName(key);
  43.                 //获取实例对象
  44.                 Plugin plugin = (Plugin)cla.newInstance();
  45.                 if (pluginPool==null) {
  46.                     pluginPool = new HashMap<>();
  47.                 }
  48.                 //加载
  49.                 pluginPool.put(key,plugin);
  50.             } catch (Exception e) {
  51.                 e.printStackTrace();
  52.                 throw new Exception("加载插件【"+key+"】失败");
  53.             }
  54.         }
  55.     }
  56.     /**
  57.      * 卸载插件
  58.      * @param key 插件名称,插件的完整类名
  59.      */
  60.     public void unloadPlugin(String key) {
  61.         registerTable.remove(key);
  62.         pluginPool.remove(key);
  63.     }
  64.     /**
  65.      * 卸载全部插件
  66.      */
  67.     public void unloadPlugins() {
  68.         registerTable.clear();
  69.         pluginPool.clear();
  70.     }
  71.     /**
  72.      * 执行
  73.      * 抽象此方法,是为了让子类能更加灵活
  74.      * @param param
  75.      * @return
  76.      */
  77.     public abstract JSONObject execute(JSONObject param);
  78. }
复制代码
定插件规范:

  1. package com.example.demo.core;
  2. import com.alibaba.fastjson.JSONObject;
  3. /**
  4. * 接口描述:
  5. * 插件接口,可以理解为为所有插件制定了一套统一的规范
  6. * 职责:真正负责具体业务的地方
  7. * 建议实现此接口的类要高度内聚,尽量减少对其他类的依赖
  8. *
  9. * @Author: dyc
  10. * @Date:2024/5/6 16:00
  11. */
  12. public interface Plugin {
  13.     /**
  14.      * 执行方法(干活的地方)
  15.      * @param param 方法需要用到的参数
  16.      * @param info 需要在插件之间传递的信息
  17.      * @return 返回值
  18.      */
  19.     public JSONObject execute(JSONObject param,JSONObject info);
  20. }
复制代码
随便写两个插件实现:

  1. package com.example.demo.core;
  2. import com.alibaba.fastjson.JSONObject;
  3. /**
  4. * 类描述:
  5. * 检查插件
  6. * @Author: dyc
  7. * @Date:2024/5/6 16:37
  8. */
  9. public class CheckPlugin implements Plugin{
  10.     @Override
  11.     public JSONObject execute(JSONObject param, JSONObject info) {
  12.         //取用参数
  13.         System.out.println("参数:"+param);
  14.         //取用通信信息
  15.         System.out.println("上一个插件要传递的信息:"+info);
  16.         //执行具体逻辑
  17.         System.out.println("我是CheckPlugin");
  18.         //给下一个插件传递信息
  19.         info.put("msg","我是checkPlugin要传递的信息");
  20.         JSONObject res = new JSONObject();
  21.         res.put("code",1);//1表示成功
  22.         res.put("msg","成功");
  23.         return res;
  24.     }
  25. }
复制代码
  1. package com.example.demo.core;
  2. import com.alibaba.fastjson.JSONObject;
  3. /**
  4. * 类描述:
  5. * 执行插件
  6. * @Author: dyc
  7. * @Date:2024/5/6 16:37
  8. */
  9. public class ExecutePlugin implements Plugin{
  10.     @Override
  11.     public JSONObject execute(JSONObject param, JSONObject info) {
  12.         //取用参数
  13.         System.out.println("参数:"+param);
  14.         //取用通信信息
  15.         System.out.println("上一个插件要传递的信息:"+info);
  16.         //执行具体逻辑
  17.         System.out.println("我是 ExecutePlugin");
  18.         //给下一个插件传递信息
  19.         info.put("msg","我是 ExecutePlugin 要传递的信息");
  20.         JSONObject res = new JSONObject();
  21.         res.put("code",1);//1表示成功
  22.         res.put("msg","成功");
  23.         return res;
  24.     }
  25. }
复制代码
写一个内核继续类:

  1. package com.example.demo.core;
  2. import com.alibaba.fastjson.JSONObject;
  3. /**
  4. * 类描述:
  5. * 继承内核服务,真正使用内核服务的地方
  6. * @Author: dyc
  7. * @Date:2024/5/6 16:44
  8. */
  9. public class DemoCoreService extends CoreService {
  10.     @Override
  11.     public JSONObject execute(JSONObject param) {
  12.         //返回值
  13.         JSONObject res = null;
  14.         //按照一般的业务接口,流程一般是这样的:检查->执行
  15.         //按顺序注册
  16.         this.registerPlugin("com.example.demo.core.CheckPlugin");
  17.         this.registerPlugin("com.example.demo.core.ExecutePlugin");
  18.         //加载
  19.         try {
  20.             this.loadPlugins();
  21.         } catch (Exception e) {
  22.             res = new JSONObject();
  23.             res.put("code",-1);//-1失败
  24.             res.put("msg",e.getMessage());
  25.             return res;
  26.         }
  27.         //执行
  28.         JSONObject pluginInfo = new JSONObject();//插件通信信息
  29.         for (String key:registerTable) {
  30.             Plugin plugin = pluginPool.get(key);
  31.             res = plugin.execute(param,pluginInfo);
  32.             if (1!=res.getIntValue("code")) {
  33.                 return res;
  34.             }
  35.         }
  36.         return res;
  37.     }
  38. }
复制代码
调用测试:

  1. package com.example.demo.core;
  2. import com.alibaba.fastjson.JSONObject;
  3. /**
  4. * 类描述:
  5. * 调用测试
  6. * @Author: dyc
  7. * @Date:2024/5/6 16:57
  8. */
  9. public class Test {
  10.     public static void main(String[] args) {
  11.         //调用测试
  12.         DemoCoreService demo = new DemoCoreService();
  13.         demo.execute(new JSONObject());
  14.     }
  15. }
复制代码
 收尾

        以上只是我按照自己的理解写的一种最简单的实现,其实还可以优化,好比注册插件可以采用数据库设置等方式增加灵活性,还可以在execute增加事务控制,增加插件革新接口等,能优化的地方还许多,我这里只是展示一下“微内核”架构的一种思想。真正业务用到的时候再去丰富它们。如果有什么不对的,欢迎指正,谢谢。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

用多少眼泪才能让你相信

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表