构建自己的C/C 插件开发框架(一)——初步设想

2019-10-11 05:42 来源:未知

微内核架构通常用于实现基于产品的应用。

3、如何测试插件;

抽象

要想实现扩展抽象是必不可少的,以dubbo的传输协议包dubbo-remoting看看其抽象的层级。第一层、接口层 抽象出了服务端server、客户端client、链接Channel、消息处理器ChannelHandler等。第二层、传输层 抽象出了AbstractServer、AbstractClient、CodecAdapter等,包含了对线程池的处理实现,链接的处理实现、编码器的适配等。第三层、交换层 抽象出了Response、Request 这一层开始涉及到一些传输的细节,同时实现了心跳机制。netty、mina只需要实现第二层就行了,因为在netty、mina的世界里只有链接和编码。上游的消费者RCP层只要关注第三层交换层就行了,因为在RPC的世界里只有Response、Request 。在dubbo里对应传输协议、RPC协议、注册协议等问题域的抽象是很值得学习的。因此你会发现如果要扩展一个传输工具或者一个RPC协议,只要按照dubbo抽象出来的接口实现就行了。

微内核的核心系统设计的关键技术有几部分:插件管理、插件连接、插件通信。

框架的总体结构上,参考OSGI的“微内核 系统插件 应用插件”结构。这里要好好考虑一下把什么做在内核中。关于微内核结构,以前我做个一个微内核流程引擎,会在后面有时间和大家分享。

Post-Processor扩展机制

在spring中这类接口叫做"后置处理器",BeanFactoryPostProcessor是容器的后置处理器,BeanPostProcessor是Bean的后置处理器。比如AOP的实现,容器会在实例化Bean的时候给BeanPostProcessor多次机会来修改Bean的属性或者返回Bean代理,在实例化前,实例化后,Bean属性填充后多个切入点调用BeanPostProcessor。最终在Bean属性填充后AnnotationAwareAspectJAutoProxyCreator返回了Bean的代理。这种扩展机制其实就是一种回调机制,在适当的时机通过回调来改变自身的状态、属性、和行为,甚至可以把自己干掉,重新替换一个。

微内核架构包含两类组件:核心系统和插件模块。

6、插件的组装;

Spring扩展体系

彩民之家论坛9066777 1spring 扩展体系

eclipse采用OSGI标准后,OSGI更是成为首选的插件化标准。

1、如何注册插件;

SPI扩展机制

Service Provider Interface 简称SPI ,是JDK内置的一种服务提供发现机制。 它就是一种动态发现并替换服务实现的机制。服务描述的方式是,在JAR包的"src/META-INF/services/"目录下建立一个文件,文件名是接口的全限定名,文件的内容可以有多行,每行都是该接口对应的具体实现类的全限定名。一个简单的例子:

接口package org.jsets.test;public interface IService { void doSomething();}实现一:package org.jsets.test;public class DogService implements IService{ public void doSomething() { System.out.println("汪汪 ... "); }}实现二:public class CatService implements IService{ public void doSomething() { System.out.println("喵喵 ... "); }}服务配置:在resources目录下建立META-INF/services目录,在里面建立org.jsets.test.IService文件文件里面的内容是:org.jsets.test.CatService测试:package org.jsets.test;import java.util.ServiceLoader;public class IServiceTest { public static void main(String[] args) { ServiceLoader<IService> loaders = ServiceLoader.load(IService.class); for (IService d : loaders) { d.doSomething(); } }}您会看到输出的是:喵喵 ...修改org.jsets.test.IService文件里面的内容为:org.jsets.test.DogService再次运行测试代码,您会看到输出的是:汪汪 ...

dubbo中对SPI机制进行了封装,支持注解的方式实现,但是原理是一样的。

看了上面的Spring和dubbo的扩展机制,您对微内核架构应该有了一个大概的认识了。

微内核架构,先实现系统的最小可用版本,提供特定的扩展机制,使用扩展机制可以向内核添加不同的扩展服务,并且可以替换和卸载这些扩展。

最小化核心的微内核架构,内核不做任何业务逻辑,只负责扩展服务的组装。所有的功能均有插件实现,比如“Maven”。

彩民之家论坛9066777 2即最小化核心的微内核

带有内核的微内核架构,内核包含了最基本服务,微内核加载内核里的基本服务。即使没有插件也能提供基本功能,如“Eclipse”。

彩民之家论坛9066777 3微内核架构

您可能会发现好多系统是采用这样的设计思想,没错,可能您从来没注意过它们,下一个系统或许可以多思考下如何来设计您的微内核和插件体系。设计一个高扩展性的系统并非那么遥不可及。

码字不易,转载请保留原文连接[)

微内核架构也被称为插件化架构(plugin-in architecture),是一种面向功能进行拆分的可扩展性架构。

      努力做到一键式部署。

BeanFactoryPostProcessor 接口

这个接口作用在容器实例化bean之前,可以读取bean的定义,并可以修改它、可以添加bean的定义,是之作用与容器。spring最早的推荐使用的配置方式是XML,后来对javaconfig配置方式的支持,就是通过ConfigurationClassPostProcessor实现的。对ImportSelector和ImportBeanDefinitionRegistrar这两个接口的支持,就是spring boot自动配置的基础。如果spring要支持其他的配置方式只要添加另外的ConfigurationXXXPostProcessor即可。

昨天看了丁亮的转载的一篇博客《C/C :构建你自己的插件框架 》,原文的链接: 。看了一下里面讲的方法,自己倒是可以实现。所以有了构建自己的c/c 插件开发框架的想法。今天先写一下初步的设想。

dubbo扩展体系

彩民之家论坛9066777 4dubbo扩展体系

2、如何调用插件;

BeanPostProcessor 接口

BeanPostProcessor会在Bean实例化完毕后执行,所以任何BeanPostProcessor都是在BeanFactoryPostProcessor之后执行的。通过这个接口可以修改bean实例的属性,甚至可以替换bean的实例。对AOP动态代理的支持是通过AnnotationAwareAspectJAutoProxyCreator实现的。对Autowired依赖注入是通过RequiredAnnotationBeanPostProcessor实现的。对JSR-255注入的支持是通过CommonAnnotationBeanPostProcessor实现的。等等很多个BeanPostProcessor造就了spring强大的功能,如果spring 支持其他的注入方式也只需要添加一个XXXAnnotationBeanPostProcessor即可。

8、服务事件的广播和订阅(这个目前还没有考虑要支持);

采用的技术
插件框架要解决的一个问题就是插件的动态加载能力。这里可以使用共享库的动态加载技术。当然,为了简单,第一步只考虑做一个linux下的插件框架。

C/C 插件开发框架的要素

最近一直在学习OSGI方面的知识。买了一本《OSGI原理和最佳实践》,可是还没有到。遗憾的是,OSGI目前的几个开源框架只支持Java,对C和C 都不支持的。可惜我们公司目前主要的开发语言还是c和c ,即便是引进OSGI,所得的好处范围有限。而我对松散耦合的模块化开发向往已久。查了一下OSGI对C 支持的好像是有一个开源项目,不过好像应用范围很小。而SCA标准中是有对C 实现模型的支持的,但是几个开源的框架目前还只支持JAVA。

框架中模块间的数据传送,有两种解决方法:一是普元采用的XML数据总线的做法。优点是扩展性好,可读性好。但是速度有些慢。二是采用我熟悉的信元流。优点的效率高,访问方便,但是可读性差一点,另外跨框架的数据传送,需要考虑网络字节序的问题。

对于框架间的通信,通过系统插件封装,对应用插件隐藏通信细节。

      部署

7、插件的出错处理;

BlueDavy有一篇介绍服务框架要素的文章(链接: )。我的插件框架也要考虑、解决以下的几个问题:

5、插件的管理和维护;

其中有几个点很重要:1)插件框架要能够使模块松散耦合,做到真正的面向接口编程;2)框架要支持自动化测试:包括单元测试,集成测试;3)简化部署;4)支持分布式,模块可以调用框架外的插件。

总体结构

4、插件的生命周期管理;

版权声明:本文由彩民之家高手论坛发布于编程技术,转载请注明出处:构建自己的C/C 插件开发框架(一)——初步设想