最近在学习DDS与VSOMEIP源码的时候,发现SOA的概念好像很少有人进行细致的讲解,为了自己以及读者以后更好的学习中间件相关知识,在这里进行一点浅显的学习分享。(本文章仅用于自用,若有错误,敬请见谅)
什么是SOA?
SOA是一种设计架构与思想,在传统的程序中,程序员将功能封装进函数,所有功能模块集成在一个程序之中。不同的模块之间通过函数调用进行通信。这也就是单体式应用程序。单体式应用程序在开发初期可能比较简单,但随着应用的增长和需求的变化,维护和扩展的难度会显著增加。
SOA则与之相反,是将单体式程序的一个程序以服务为标准,拆分成多个进程。进程之间可以存在于不同的设备内部,每个进程之间互不影响,有几个服务模块就可以有几个进程。但是为了高内聚,进程的数量也可以少于模块的数量。
举个例子,我有两个函数可以区分狗和猫,我可以把他拆成两个进程,每个进程提供一个识别猫/狗的服务,这个两个进程中每个进程拥有一个服务功能模块。那么我们也可以以识别猫和狗为标准拆成一个进程,这个进程同时提供识别猫和狗的服务,该进程拥有两个服务功能模块。拆分与否没有硬性规定,看业务需求。
那么,还有一个问题,如果不调用函数,模块与模块之间的信息要怎么传递呢?这里SOA给出了答案,不同模块通过服务接口通信,那么这个服务接口是什么,我们等会说。我们先说通信方式,不同模块之间如果是相同设备内部通过服务接口可以是IPC或者网络进行通信,这是因为这些模块是根据服务接口提供功能,根本就没提供接口。如果是不同设备则需要借助网络进行传输,例如AP AUTOSAR就是典型的SOA架构,而ROS以及ROS2也采用了SOA的部分思想。发布订阅者模型不就是通过网络通信吗,在ROS中,master节点就担任了服务中心,而ROS2中则利用了Fastdds的DCPS接口实现了rmw层,从而使用DDS中RTPS层中的发现模块,是服务中心聚合到了模块内,从而干掉了Master节点。此外还需要注意的是,部分中间件比如AP AUTOSAR相同设备内部进程与进程之间通信是不能依靠IPC的,只能使用自身的通信模块。
什么是服务接口?
与函数调用类似,你想使用函数是不是要函数的接口去调用函数?那使用服务自然要用服务接口,他有点类似于一个中转站,一边接受请求,然后发送给服务提供者,再将服务提供者提供的服务给请求方。但是服务接口这个东西他比较抽象,他并不像函数接口一样定死了。有函数接口不一定有实体,比如我进程A和进程B通信,那我可以用进程C作为中转站,那我也可以A和B内部就有功能模块可以专门解析数据和专门封装数据,从而A和B直接通信。但是服务接口还有一些问题,下次再讲。