一、方案介绍
EasyRTCGo 为EasyRTC的一个模块,为应用接口管理模块,是一个使用 Go 语言开发的独立软件。该软件主要为网页端、APP端和小程序端提供RESTful接口,并同EasyRTC的视频直播转发模块和视频会议模块进行通信。该软件在整个系统中起到承上启下的作用,同多端进行交互,因此需要进行一个比较适合的架构设计。该软件的架构设计图如下所示:
EasyRTCGo从上到下分为四层:API层、Service层、Manager层和Dao层。
- API层
为前端提供RESTful接口。收到前端信息后,调用下层处理后,将结果返回给前端。
- Service层
业务逻辑服务层,针对业务逻辑进行处理。如获取视频会议信息,一部分信息时存储在底层数据库中,一部分实时信息是在视频会议模块中。因此Service层会调用Dao层和Manager层获取对应的信息,综合处理后返回给API层。
- Manager层
管理层,主要同第三方接口进行通信。如从视频直播转发模块获取对应的直播信息,从视频会议模块获取会议在线状态及会议成员信息。
- Dao层
数据访问层,同底层数据库进行交互。如用户信息均存储在数据库中,因此主要通道Dao层进行用户的增删改查操作。
二、层与层之间设计方案
EasyRTCGo中分为四层,一般上层不需要关心底层的实现方式,因此采用接口隔离的方式对层与层进行设计。
Dao层为对于数据库的增删改查接口,设计如下:
// 对于视频会议表的操作
type VMeetDao interface {
Add(vc *do.TVideoMeet) (*do.TVideoMeet, error)
Delete(id uint) (bool, error)
Update(vc *do.TVideoMeet) (*do.TVideoMeet, error)
Get(id uint) (*do.TVideoMeet, error)
GetByTaskID(taskID string) (*do.TVideoMeet, error)
// 获取部分,从 offset 条开始,读取 limit 数量的数据
GetParts(groupID, like, sort, order string, offset, limit uint) (*[]*do.TVideoMeet, uint, error)
// 获取所有
GetAll(order string) (*[]*do.TVideoMeet, error)
// 获取所有数量
Count() (uint, error)
// 获取所有数量
CountGroupIdDatas(groupID string) (uint, error)
}
接口的实现方式如下:
扫描二维码关注公众号,回复:
11434787 查看本文章
// 视频会议表的实现
type VMeetDaoImpl struct {
}
func (impl *VMeetDaoImpl) Add(vc *do.TVideoMeet) (*do.TVideoMeet, error) {
vc.UpdateAt = etime.Now()
err := impl.fromTable().Create(vc).Error
return vc, err
}
Service层不关心Dao层的实现,直接引用接口,使用方式如下:
var meetDao dao.VMeetDao = dao.GetMeetDao()
videoMeetDO, err := meetDao.Add(videoMeet)
此种设计方式符合接口隔离原则,在接口不变的情况下,Dao层的实现可以任意修改,Dao层与Service层无更多的耦合,代码更健壮更易维护。其余接口均参考此种设计。