整体框架

整体说明

客户端

包含webrtc的公开接口和 部分api接口.

服务器

消息队列(RabbitMQ) 作为消息中间件, 因为使用了数据中间件, 数据基本都在 DB 或缓存.

模块说明

1. nuveAPI


提供http API,如创建、分配房间、拉取房间列表以及分配 token 等。同时它会检测并更新 erizoController 运行状态,以便分配到可用的服务。

代码业务逻辑
nuve.js:通过调用resource系列类来完成CRUD操作,在进行CRUD操作之前,通过调用auth/nuveAuthenticator.js来完成权限验证,接口层
servicesResource.js/serviceResource.js:
roomsResource.js/roomResource.js:会议房间资源,业务逻辑层
usersResource.js/userResource.js:参与用户资源,业务逻辑层
tokenResource.js:加入凭证资源,业务逻辑层
serviceRegistry.js、roomRegistry.js、tokenRegistry.js: 通过调用dataBase.js完成各种资源的CRUL操作,数据逻辑层
dataBase.js:mongodb部署配置相关,负责维护和mongodb服务的连接,和具体业务逻辑无关

测试所有http接口的地址

和ErizoController接口 cloudHandle.js

cloudHandle通过RabbitMQ来实现的RPC(Remote Procedure Call),rpc.js实现RPC的方式和amqper.js一样,可以认为amqper.js为rpc.js的升级版本
EC服务的启动并不归Nuve管理,EC创建成功后在Nuve中入库,Nuve仅仅维护列表以及保活,负责EC的分配。

2. erizoController(EC)

维护一个房间集合Rooms,创建成功后会在Nuve中进行注册,并且连接amqper  =>
连接amqper即RPCMQ,此时会将Nuve对EC方法的调用绑定 =>
在Nuve注册成功后回调会新建一个RPCMQ消息消费队列,同时会对EC服务端口监听“connection”消息,此时会新建房间(若房间已经存在即加入反那个房间),并新建socket连接和client =>
client相当于客户端中的用户,它会根据EC新建的channel监听来自客户端的socket消息,客户端的信令消息就是在这里进行处理的。=>
client监听到事件后会通过room.controller(即roomController)中的方法进行具体实现。 =>

主要实现ICE信令交换, 房间维护

3. ErizoAgent

负责管理 erizoJS, 创建、删除、分配。

4. erizoJS (SFU)

licode 的 SFU 实现, js 层维护一些基本的流信息以及提供一些接口与房间交互。核心逻辑在 erizo 下,使用 c++ 实现,通过集成 libnice 完成 ICE 功能, 再实现了媒体流管理以及 rtc 流中转部分的功能。 每一个 publisher 独享一个 erizoJS。erizoJS 维护了一个 publisher,publisher 维护了多个 subscriber, publuser 流数据会转发给所有的 subscriber。所以 licode 实现 SFU (多人聊天) 的方法应该是这样的。一个用户进入房间,创建一个 publisher,它自己则先订阅这个房间里的其他的 publisher,其他的 publisher 在知晓这个新用户进入时,则开始订阅这个新的发布者。
客户端与erizoJS交互的过程仍然按照ICE规范,只不过 SFU 一般都在公网上,所以他的候选地址肯定是可以通的。

Nuve源码分析

原文地址:https://www.cnblogs.com/WillingCPP/p/13614712.html