1.Licode模塊
- Erizo 基于webRTC針對視屏會議場景的一對多組件
- Erizo API Erizo的Nodejs版本
- Erizo Controller 負責管理視頻會議sessions
- Nuve 負責管理服務器資源(會議房間,與會用戶,加入憑證)
2.Nuve源碼分析
2.1目錄結(jié)構(gòu)
- nuveAPI Nuve服務端API
- nuveClient Nuve客戶端API
2.2 nuveAPI整體架構(gòu)

nuve-api-architecture.png
- 接口層
接口層的nuve.js負責定義路由,調(diào)用響應的業(yè)務邏輯層的resource類來完成CRUD操作,并且通過auth/nuveAuthenticator.js中間件進行權(quán)限驗證 - 業(yè)務邏輯層
主要負責管理會議房間,用戶資源,憑證資源 - 數(shù)據(jù)邏輯層
通過調(diào)用dataBase.js對實際的數(shù)據(jù)庫進行相應操作 - 數(shù)據(jù)庫mongodb
存儲各種資源數(shù)據(jù)
2.3 接口層
2.3.1 nuve.js配置路由
在nuve.js中首先通過中間件驗證發(fā)送請求用戶是否有相應權(quán)限
app.get('*', nuveAuthenticator.authenticate);
app.post('*', nuveAuthenticator.authenticate);
app.put('*', nuveAuthenticator.authenticate);
app.patch('*', nuveAuthenticator.authenticate);
app.delete('*', nuveAuthenticator.authenticate);
接著,創(chuàng)建Restful API可以對相應的資源進行操作
app.post('/rooms', roomsResource.createRoom);
app.get('/rooms', roomsResource.represent);
app.get('/rooms/:room', roomResource.represent);
app.put('/rooms/:room', roomResource.updateRoom);
app.patch('/rooms/:room', roomResource.patchRoom);
app.delete('/rooms/:room', roomResource.deleteRoom);
app.post('/rooms/:room/tokens', tokensResource.create);
app.post('/services', servicesResource.create);
app.get('/services', servicesResource.represent);
app.get('/services/:service', serviceResource.represent);
app.delete('/services/:service', serviceResource.deleteService);
app.get('/rooms/:room/users', usersResource.getList);
app.get('/rooms/:room/users/:user', userResource.getUser);
app.delete('/rooms/:room/users/:user', userResource.deleteUser);
2.3.2 cloudHandler.js連接Erizo服務
cloudHandler可以調(diào)用Erizo服務中的方法,具體通過消息隊列來實現(xiàn)RPC(遠程過程調(diào)用)。
整個RPC的原理是,Nuve服務和Erizo服務維護了兩個消息隊列,Nuve服務通過隊列一來發(fā)布任務,然后將回調(diào)函數(shù)保存在本地,Erizo服務從隊列一中取任務執(zhí)行后,將執(zhí)行的結(jié)果放入隊列二,Nuve服務從隊列二獲取執(zhí)行結(jié)果,并從本地找到對應的回調(diào)函數(shù),傳入結(jié)果參數(shù),就能完成一次RPC。