微内核(插件式)架构在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]