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命令中有几个参数如下


srs代码学习(5)--一些与运营相关的技术点_第1张图片

抓个包看看具体都代表什么


srs代码学习(5)--一些与运营相关的技术点_第2张图片


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)