1. 程式人生 > >srs程式碼學習(5)--一些與運營相關的技術點

srs程式碼學習(5)--一些與運營相關的技術點

和大規模運營相關的技術點。我想到的有下面四個

1)vhost

2) edge 

3) forword

4) log trace 

5)reload

6)http-api

7)  statis

下面來一個一個具體分析

vhost ,意思就是virtual host .虛擬主機的意思。可以在一臺機器上支援不同的域名,用來分割使用者或者是不同的功能。關於vhost的詳細作用。在作者的這篇文章中有詳細的說明

https://github.com/ossrs/srs/wiki/v1_CN_RtmpUrlVhost

下面我分析下程式碼中的實現。

vhost會隨著connect 的命令連線上來。connect命令中有幾個引數如下


抓個包看看具體都代表什麼


app --應用名稱

swfurl==tcurl,

那麼在伺服器上是怎麼處理的呢?

在處理連線的函式裡是這樣的

int SrsRtmpConn::do_cycle()
函式裡,首先通過connect,填充req裡的資料
if ((ret = rtmp->connect_app(req)) != ERROR_SUCCESS) {
        srs_error("rtmp connect vhost/app failed. ret=%d", ret);
        return ret;
    }
接著就是一大堆的驗證過程,首先從配置中解析host
 // discovery vhost, resolve the vhost from config
    SrsConfDirective* parsed_vhost = _srs_config->get_vhost(req->vhost);
    if (parsed_vhost) {
        req->vhost = parsed_vhost->arg0();
    }

然後列印並做判斷是否host相關引數為空
srs_info("discovery app success. schema=%s, vhost=%s, port=%s, app=%s",
        req->schema.c_str(), req->vhost.c_str(), req->port.c_str(), req->app.c_str());
    
    if (req->schema.empty() || req->vhost.empty() || req->port.empty() || req->app.empty()) {
        ret = ERROR_RTMP_REQ_TCURL;
        srs_error("discovery tcUrl failed. "
            "tcUrl=%s, schema=%s, vhost=%s, port=%s, app=%s, ret=%d",
            req->tcUrl.c_str(), req->schema.c_str(), req->vhost.c_str(), req->port.c_str(), req->app.c_str(), ret);
        return ret;
    }
再次做詳細的檢測
 // check vhost
    if ((ret = check_vhost()) != ERROR_SUCCESS) {
        srs_error("check vhost failed. ret=%d", ret);
        return ret;
    }

int SrsRtmpConn::check_vhost()
{
    int ret = ERROR_SUCCESS;
    
    srs_assert(req != NULL);
    
    SrsConfDirective* vhost = _srs_config->get_vhost(req->vhost);
    if (vhost == NULL) {
        ret = ERROR_RTMP_VHOST_NOT_FOUND;
        srs_error("vhost %s not found. ret=%d", req->vhost.c_str(), ret);
        return ret;
    }
    
    if (!_srs_config->get_vhost_enabled(req->vhost)) {
        ret = ERROR_RTMP_VHOST_NOT_FOUND;
        srs_error("vhost %s disabled. ret=%d", req->vhost.c_str(), ret);
        return ret;
    }
    
    if (req->vhost != vhost->arg0()) {
        srs_trace("vhost change from %s to %s", req->vhost.c_str(), vhost->arg0().c_str());
        req->vhost = vhost->arg0();
    }
    
    if ((ret = refer->check(req->pageUrl, _srs_config->get_refer(req->vhost))) != ERROR_SUCCESS) {
        srs_error("check refer failed. ret=%d", ret);
        return ret;
    }
    srs_verbose("check refer success.");
    
    if ((ret = http_hooks_on_connect()) != ERROR_SUCCESS) {
        return ret;
    }
    
    return ret;
}
這樣經過嚴格的檢測後,確認vhost是需要的host,就可以開始走下一步了。

3) edge 叢集。

單獨用一篇文章來分析。比較複雜


相關推薦

srs程式碼學習5--一些運營相關技術

和大規模運營相關的技術點。我想到的有下面四個 1)vhost 2) edge  3) forword 4) log trace  5)reload 6)http-api 7)  statis 下面來一個一個具體分析 vhost ,意思就是virtual host .虛擬主

srs程式碼學習6--如何實現edge

sre叢集的方式有兩種一種是forword型別的。一種是edge-origin型別的。後者比前者要複雜的多。就從比較難的開始分析。 有實現edge,首先得在配置檔案中做配置。配置方式如下 這個配置裡配置了實時模式,邊緣模式(remote) 那麼這個配置到了程式碼中是如何

srs程式碼學習1--listen建立過程

srs的服務偵聽的建立過程。 以rtmp服務為例 srs服務偵聽的建立依靠從上到下的三個類。分別是 SrsServer   SrsStreamListener   SrsTcpListener 埠偵聽過程為 1)main函式中呼叫全域性變數_srs_server的  li

srs程式碼學習9----http_api處理流程

srs提供http相關功能。包括http_server http_api查詢功能和http_heartbeat ,http_callback等。 首先分析http_api,這個提供一系列的http的介面,可以用來查詢伺服器的狀態,但它的重要性並不只限於http查詢,更重要的

以太坊學習5利用Web3.js節點互動【1】

利用Web3.js與節點互動  一、環境配置 【寫在最前:本文用到的主要工具:node.js+geth+ web3.js 1.0.0-beta.18】 1、確保已經安裝node.js 個人在debian9上安裝nodejs的經歷比較坎坷,但是據說ubuntu上安裝方便

Lucene深入學習5Lucene的DocumentField

Document與Field 在Lucene中,document是一種邏輯檔案。可以近似地認為它表示的是計算機中的一個檔案。這個document是一種抽象的表示,它從各種維度來描述一個數據源中的每一條資料。 將一個Document與檔案系統中的檔案對應起來時

webpack 學習5--- 使用uglify-js 壓縮打包JS程式碼

一、webpack 外掛機制介紹: 外掛可以完成更多loader不能完成的功能。外掛的使用一般是在webpack的配置資訊 plugins選定中指定。Webpack本身內建了一些常用的外掛,還可以通過npm安裝第三方外掛。 二、uglify-js介紹: ugligy-j

計算機視覺深度學習5

1. 引言 其實一開始要講這部分內容,我是拒絕的,原因是我覺得有一種寫高數課總結的感覺。而一般直觀上理解反向傳播演算法就是求導的一個鏈式法則而已。但是偏偏理解這部分和其中的細節對於神經網路的設計和調整優化又是有用的,所以硬著頭皮寫寫吧。 問題描述與

構建之法學習5

成員 nbsp 9.png 多少 影響 .cn ges png img 本周學習的是構建之法第五章 團隊和流程 團隊有共同的特點:1. 團隊有一致的集體目標,團隊要一起完成這目標。一個團隊的成員不一定要同時工作,例如接力賽跑。(王屋村搬磚的“非團隊”成員則不然,每個人想搬多

基於Qt的OpenGL可編程管線學習5- FBO的使用

qt opengl shader fbo FBO: Frame Buffer Object,默認繪制在1號FBO中,自定義的FBO是可以做讀寫操作的。繪制到自定義的FBO,然後顯示出來,如下圖所示:Qt中有關於FBO的類,QOpenGLFrameBufferObjectFBO的創建m_Fram

基於Qt的OpenGL可編程管線學習10- 膨脹腐蝕

qt opengl shader 腐蝕 膨脹 膨脹:取一個像素周圍的點,取最亮的點為當前的點顏色,為膨脹效果腐蝕:取一個像素周圍的點,取最暗的點為當前的點顏色,為腐蝕效果膨脹Fragment Shadervarying vec2 M_coord; varying vec3 M_normal

.NET中使用Redis之ServiceStack.Redis學習安裝簡單的運行

arraylist write client cli ring blog 控制臺 創建 spa 1.下載ServiceStack.Redis PM> Install-Package ServiceStack.Redis 2.vs中創建一個控制臺程序 class Pro

嵌入式開發學習5<S5PV210開發板刷系統那點破事兒之二>

串口驅動 超級 mage idt android4 securecrt linux命令 log 這一 刷系統:利用刷機工具,向開發板中燒錄預先編譯好的鏡像。使之在開發板上跑起來。   S5PV210廠家默認安裝的是android4.0.4。   1、安裝usb轉串口驅動(如

Vue深度學習4-方法事件處理器

() 一個 span 修飾 語句 特殊變量 方法 left stop 方法處理器 可以用 v-on 指令監聽 DOM 事件: <div id="app"> <button v-on:click = "greet">Greet<

Vue深度學習5-過渡效果

round handle urn ati 根據 enter index 好的 ecan 簡介 通過 Vue.js 的過渡系統,你可以輕松的為 DOM 節點被插入/移除的過程添加過渡動畫效果。Vue 將會在適當的時機添加/移除 CSS 類名來觸發 CSS3 過渡/動畫效果,

RabbitMQ學習5 (主題)

bytes 關於 字符 .exe war pytho 局限 一起 chan 我們改進了我們的日誌系統 我們沒有使用只有虛擬廣播的 fanout 交換機,而是使用 direct 交換機,並有選擇性地接收日誌的可能性。 盡管使用直接交換改進了我們的系統,但它仍然有局限性 -

python學習5寫一個二分算法的程序

AR 小結 == inpu env bre elif 進行 span 把之前學習的做一個小結。之前看二分查找法,只能是似而非地看懂大概。現在用這麽多天的知識積累已經可以自己寫了。 而且在算法書的基礎上,把需要找的數字做一個人機互動操作。 另外,初步接觸到了 __name__

ROSArduino學習訂閱發布

CP HA hat true subscribe href 串口 chat ria ROS與Arduino學習(二)訂閱與發布 Tutorial Level:HelloWorld Next Tutorial: 本節介紹如何在arduino中發布與訂閱消息。他和ROS通過串口

Redis學習5-Jedis(Java操作redis數據庫技術)

new 抽取 數量 pack cli int .get demo1 可選 Java連接redis 一,導入jar包 Redis有什麽命令,Jedis就有什麽方法 設置防火墻 在Linux上面運行如下代碼: 單實例:Jedis實例: package com.jedi

C++語言學習——類對象

clas 進行 自身 ngs 符號表 方法 index clu 每一個 C++語言學習(四)——類與對象 一、構造函數(constructor) 1、構造函數簡介 C++語言中,構造函數是與類名相同的特殊成員函數。在類對象創建時,自動調用構造函數,完成類對象的初始化。類對象