用多少眼泪才能让你相信 发表于 2024-8-2 06:33:57

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

前言

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

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

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

[*]插件管理:负责管理插件的生命周期,好比插件的注册、加载、卸载等。
[*]插件链接:我的理解,其实就是调用插件提供的服务。
[*]插件通信:负责在插件间传递信息。
    二、插件:真正负责处理业务的模块,有高度内聚的特点,每个插件尽量独立,不依赖其他模块、插件等。
https://img-blog.csdnimg.cn/direct/3728dbb2e4674a0a884288dde486c170.png
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企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 微内核(插件式)架构在JAVA业务开辟中的应用