当前位置: 首页 > 科技观察

Hi3861之SAMGR--系统服务框架子系统-4-面向服务架构的实现

时间:2023-03-15 14:21:37 科技观察

更多内容请访问:与华为官方共建的鸿蒙技术社区https://harmonyos.51cto.com5。面向服务架构SOA(service-orientedarchitectur,面向服务的架构是一种软件架构或软件模型,在这种架构下,系统提供的各种功能将以形式提供给系统内外的用户或其他人使用服务,服务之间的关系是松耦合的,使用中性的接口和标准的方法相互通信和交互,与硬件平台、操作系统、编程语言没有关联,这种架构特别适合对于在分布式环境下使用,鸿蒙系统是一个分布式操作系统,自然而然地采用了这种架构。【关于SOA的更多信息,请上网搜索学习。】面向服务的架构包括以下三个角色:Provider:服务的提供者,为系统提供能力(即对外接口)stem,它接受并执行来自消费者的请求。它将自己的服务和接口发布到服务管理中心,以便服务消费者发现和访问该Service。Consumer:服务的消费者调用服务提供的功能(即对外接口)来达到一定的结果。它可以是一个应用程序,一个软件模块或者另一个服务,它向服务管理中心发起服务查询,绑定服务,然后执行服务提供的能力。Samgr:服务管理中心是一个中介,管理Provider提供的能力,帮助Consumers发现Provider的能力。它们的关系如下图所示:上一节《系统服务框架子系统-2》4.6节中对PubSubFeature和PubSubImplement结构的分析中提到它们是SOA(ServiceOrientedArchitecture)的实现,所以本节我们将对其进行详细分析。代码结构为Hi3861/distributedschedule/samgr_lite/communication/。我们先把PubSubFeature和PubSubImplement的结构展开比较完整,如下图:g_pubSubImplement和g_broadcastFeature这两个全局变量也分别展开:g_pubSubImplement的展开如上《系统服务框架子系统-2》“4.7”IUnknown接口类及其相关definitions”,任何应用程序或其他模块都可以通过:IUnknown*iUnknown=SAMGR_GetInstance()->GetFeatureApi(BROADCAST_SERVICE,PUB_SUB_FEATURE);获取上述iUnknown指针,之后可以通过:PubSubInterface*fapi=NULL;iUnknown->QueryInterface(iUnknown,DEFAULT_VERSION,(void**)&fapi);恢复PubSubInterface对象的指针fapi,可以访问订阅者和提供者APIg_broadcastFeature的扩展这里重点是关系和挂载的东西的双向链表注意上图中头节点和尾节点的指针会相互指向形成一个闭环,这里没有画她e.g_pubSubImplement主要提供了一套统一标准的对外接口,外部程序可以使用这套接口来:订阅(Subscribe)Topic给Consumer发布(Publish)Topic给Provider当一个Consumer[i]想要订阅一个Topic[x],需要先通过AddTopic(Topic[x])将Topic[x]添加到关系列表中。添加时会检查判断,保证Topic[x]不会在关系列表中重复添加。然后通过Subscribe(Topic[x],Consumer[i])订阅Topic[x],其实就是将Consumer[i]添加到Topic[x]的双线链表中,获取Topic[x]的信息订阅权限。当一个Provider发布一个Topic[x]时,Broadcast的PubSubFeature会从关系列表中找到对应的Topic[x],并广播给它的所有订阅者(即遍历Topic[x]的ConsumerNode列表,对所有消费者链表上的节点发送消息并让它们处理消息)。简单来说,g_pubSubImplement和g_broadcastFeature是两个全局变量,g_broadcastFeatur提供feature的生命周期和数据结构,g_pubSubImplemen提供对外接口和数据结构的操作。具体如何协同工作,请自行阅读广播目录中的代码。附件中有两个测试程序broadcast_example和user_button_test,以及它们的运行日志。有兴趣的请自行编译验证。broadcast_example使用了官方的samgr例程作为示例,框架相同,修改了运行的内容,日志也按照我的习惯进行了整理,基本相当于重写了这个测试用例。以CASE_AddAndUnsubscribeTopic()为例,我添加了4个Topic,三个Consumers对Topic的订阅状态如下:当一个Topic[x]被发布时,只有订阅它的Consumers才会响应,而Consumers会调用回调函数对Topic[x]的请求进行针对性的处理。user_button_test是我自己写的Provider测试程序。Hi3861开发板响应用户按键消息,每个按键事件触发一次Publish一个随机主题,以此来测试上表中的Consumers对自己订阅的主题的处理。按钮线程UserButtonTask每1s循环一次,计数器++,当检测到按钮被按下时,当前计数器为%5,得到一个0~4的随机数,这个数就是topic,只有topic[0~3]在上表中添加,当UserButtonTask发布topic[4]时,会出现异常,请查看附件日志了解是什么情况。文章相关附件可点击下方链接下载原文链接:https://harmonyos.51cto.com/posts/4776更多内容请访问:与华为官方共建的鸿蒙技术社区https:///harmonyos.51cto.com