至于核心层的设计Q我惛_鉴 一下微内核的思想。核心层只负责实C面几个功能:
1?插g的加载,,初始化?
2?服务的注册?
3?服务的调用?
4?服务的管理?
插g的加载,,初始?
插g的加载利用linux׃n库的动态加载技术。具体的Ҏ可以看一下IBM|站的一资?a >《Linux 动态库剖析?/a> ?
服务的注?/strong> 服务的注册与调用采用表驱动的Ҏ。核心层中维护一个服务注册表? //插g间交互消息类?br>typedef enum __Service_Type 驱动表是一个数l,下标为插仉交互消息cdQ成员ؓ插g提供的接收的消息处理函数Q由插g初始化的时候,调用插g框架的的注册函数注册到驱动表? 插g的初始化实现为: 插g在函数PF_Init_Plugin中调用函数register_func来注册插件要处理的消息类型? 服务的调?/strong> 插g间的依赖关系是通过信元来实现的。至于信元流的用在我的另一博?a >《用信元流QTLVStreamQ规范、简化模块(C/C++Q间交互 ?/a> 中有描述。插件对外的接口都是l一的? 如果插g要和其他的插仉信Q则调用PF_Init_Plugin函数的传递的服务调用接口Q?invoke_serv_func。插件框架根据信元流的类型,查找驱动表,扑ֈ对应的服务接收函数。插件用函数 PF_Receive_Invoke_Proc接受其他插g的请求,此函数是插gx件框架主动注册到驱动表的? 如果服务时同步的Q这直接通过此函数返回,q回的信息在响应信元中。如果是异步的请求,q插件在处理完成后,通过 send_rsp_func函数来发送响应? 插g的卸?/strong>
{
Service_Max,
}Service_Type;
//插g用于和其他插仉信接口函数Q由插g提供?br>typedef PRsp_Ele_Stream (*PF_Invoke_Service_Func)(PReq_Ele_Stream pele_str);
//驱动?br>typedef PF_Invoke_Service_Func Service_Drive_Table[Service_Max];
//插g用于注册处理的消息类型的函数Q由插g框架提供?br>typedef RET_RESULT (*PF_Service_Register_Func)(Service_Type service_type);
//插g用于和其他插仉信接口函数Q由插g框架提供?br>typedef PRsp_Ele_Stream (*PF_Invoke_Service_Func)(PReq_Ele_Stream pele_str);
//插g回复响应函数。插件收到异步请求后Q处理完成后Q发送响应消息给h的插件。由插g框架提供
typedef void (*PF_Send_Response_Func)(PRsp_Ele_Stream pele_str);
//初始化插件信?br>typedef struct Plugin_Init_St
{
PF_Service_Register_Func register_func;//服务注册函数Q要注册一pd的枚丑ր{插件可以处理的服务枚D?br> PF_Invoke_Service_Func invoke_serv_func;//和其他组件交互时Q调用的用于和其他组件交互的函数。发送请求消息?br> PF_Send_Response_Func send_rsp_func;//再设计一个回复响应消息的接口。收到异步请求后Q处理完毕后通知h模块处理l果?br>} Plugin_Init_St, *PPlugin_Init_St;
//初始化插件函敎ͼcM于构造函数。由插g提供Q供插g框架加蝲插g时初始化插g使用?br>void PF_Init_Plugin(PPlugin_Init_St pinit_info);
//信元l构?br>typedef struct Ele_St
{
Ele_Tag tag;
Ele_Length len;
Ele_Value value;
PEle_St next;
}Ele_St, *PEle_St;
//h消息Q信元流格式?br>typedef struct Req_Ele_Stream
{
Plugin_ID src_id;//源插件id
Service_Type req_type;//hcd
PEle_St ele;
} Req_Ele_Stream, *PReq_Ele_Stream;
//响应消息Q信元流格式?br>typedef struct Rsp_Ele_Stream
{
Plugin_ID dest_id;//目的插gid
Service_Type req_type;//响应对应的请求的cd?br> Execute_Result result;//记录执行l果
Execute_Reason reason;//记录执行l果的原?br> PEle_St ele;
} Rsp_Ele_Stream, *PRsp_Ele_Stream;
//接收插g调用服务h函数Q由插g提供Q入参ؓh信元。返回gؓ响应信元,用于同步h处理?br>PRsp_Ele_Stream PF_Receive_Invoke_Proc(PReq_Ele_Stream pele_str);
//插g收到响应消息的处理入口函敎ͼ由插件提供。如此ؓ响应信元?br>void PF_Receive_Rsponse_Porc(PRsp_Ele_Stream pele_str);
//卸蝲插g时调用的函数Q类g析构函数。由插g提供Q供插g框架卸蝲插g时调用?br>void PF_Destroy_Func();
]]>
今天主要谈一下我对这个框架的功能认识Q或是期望。昨天看了一关?a >持箋集成能力成熟度模?/a> 的一文章,受此启发Q我Ҏ框架的认识渐渐清晰?
q个框架可以当做我们公司底层产品Q交换机Q资源服务器{)的基设施。上层基于java开发的产品可以直接在OSGI上开发?
核心功能Q?/strong> 1、最重要的一个功能是Q提供一个模块化的编E模型,促进模块化Y件开发,真正的实现针Ҏ口编E? 2、提供一个有助于提高模块可重用性的基础设施? 3、提供一个C/C++插g的运行环境? 4、提供一个动态插件框Ӟ插g可以动态更改,而无需重启pȝ。这个功能虽然不隑֮玎ͼ但是用处好像不是很大? 扩展部分功能Q?/strong> 1、支持分布式pȝl构Q多个运行框架组合v来Ş成一个系l,Ҏ块内部隐藏远E通讯l节? 2、支持系l的分层架构? 3、能够和其他的开发框架进行集成,比如OSGIQSCA{? 4、多个运行框架中Q能够实现对q行框架的有效管理? 5、概念上要实现类gSCA中componentQ构ӞQcompositeQ组合构ӞQDomainQ域Q的概念? 开发部分功能: 1、ؓ了简化开发,开发一个Eclipse插gQ用于开发框架中的C/C++插g。能够根据插件开发向|最l生成符合插件规范的公共代码Q配|文ӞMakefile文g{? 调试部分功能Q?/strong> 1、提供一个统一的日志处理函敎ͼ可以集成Log4cpp? 2、提供模块间的消息日志,以及框架对外的接口日志? 3、提供消息和日志的追t功能,能将和某事g相关的消息和日志单独提取出来? 4、提供资源监功能,监测对资源(内存Q套接字Q文件句柄等Q的使用情况? 试部分功能Q?/strong> 1、集成一些单元测试框Ӟ比如unitcppQ达到自动化单元试的目标? 2、自己实现自动化集成试框架Qƈ且开发相应的Eclipse插gQ简化集成测试(利用脚本和信元流Q? 3、集成原有的自动化功能测试框架flowtestQƈ且开发相应的Eclipse插gQ简化功能测试? 4、实现性能试Q监框架? 部v部分功能Q?/strong> 1、实现自动化部v。特别是在分布式应用的情况下? 2、提供一个命令行E序Q通过命o更改pȝ配置Q管理插件?/p>
昨天看了丁亮的{载的一博客?strong>C/C++Q构Z自己的插件框?》,原文的链接:http://blog.chinaunix.net/u/12783/showart_662937.html 。看了一下里面讲的方法,自己倒是可以实现。所以有了构qc/c++插g开发框架的x。今天先写一下初步的设想?
C/C++插g开发框架的要素
BlueDavy有一介l服务框架要素的文章Q链接:http://www.aygfsteel.com/BlueDavy/archive/2009/08/28/172259.html Q。我的插件框架也要考虑、解决以下的几个问题Q?
1、如何注册插Ӟ
2、如何调用插Ӟ
3、如何测试插Ӟ
4、插件的生命周期理Q?
5、插件的理和维护;
6、插件的l装Q?
7、插件的出错处理Q?
8、服务事件的q播和订阅(q个目前q没有考虑要支持)Q?
其中有几个点很重要:1Q插件框架要能够使模块松散耦合Q做到真正的面向接口~程Q?Q框架要支持自动化测试:包括单元试Q集成测试;3Q简化部|Ԍ4Q支持分布式Q模块可以调用框架外的插件?
采用的技?/strong> Ml构 框架的Ml构上,参考OSGI的“微内核+pȝ插g+应用插g”结构。这里要好好考虑一下把什么做在内怸。关于微内核l构Q以前我做个一个微内核程引擎Q会在后面有旉和大家分享? 框架中模块间的数据传送,有两U解x法:一是普元采用的XML数据ȝ的做法。优Ҏ扩展性好Q可L好。但是速度有些慢。二是采用我熟悉的信元流。优点的效率高,讉K方便Q但是可L差一点,另外跨框架的数据传送,需要考虑|络字节序的问题? 对于框架间的通信Q通过pȝ插g装Q对应用插g隐藏通信l节? 部v 努力做到一键式部v?/p>
插g框架要解决的一个问题就是插件的动态加载能力。这里可以用共享库的动态加载技术。当ӞZ单,W一步只考虑做一个linux下的插g框架?