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

nuve-api-architecture.png
- 接口層
接口層的nuve.js負責定義路由,調用響應的業(yè)務邏輯層的resource類來完成CRUD操作,并且通過auth/nuveAuthenticator.js中間件進行權限驗證 - 業(yè)務邏輯層
主要負責管理會議房間,用戶資源,憑證資源 - 數據邏輯層
通過調用dataBase.js對實際的數據庫進行相應操作 - 數據庫mongodb
存儲各種資源數據
2.3 接口層
2.3.1 nuve.js配置路由
在nuve.js中首先通過中間件驗證發(fā)送請求用戶是否有相應權限
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可以調用Erizo服務中的方法,具體通過消息隊列來實現RPC(遠程過程調用)。
整個RPC的原理是,Nuve服務和Erizo服務維護了兩個消息隊列,Nuve服務通過隊列一來發(fā)布任務,然后將回調函數保存在本地,Erizo服務從隊列一中取任務執(zhí)行后,將執(zhí)行的結果放入隊列二,Nuve服務從隊列二獲取執(zhí)行結果,并從本地找到對應的回調函數,傳入結果參數,就能完成一次RPC。