zoukankan      html  css  js  c++  java
  • surging 基于流媒体服务如何集群分流

    前言

    最近几年微服务可谓是大火,大家忙着建设微服务,学习微服务如何搭建,微服务技术体系的演变也使得企业公司能支持起灵活,多样化的业务需求和越来越多的访问量,有很多企业用户正在朝着业务中台,SAAS云平台进行发展,并能与时俱进跟上技术时代的脚步。而这篇文章呢,主要是讲解一下流媒体服务如何集群分流,附带讲解一下surging 特有的一些功能。

    微服务特点

    6个典型特点

    1.高内聚,低耦合:程序模块的可重用性、移植性大大增强,针对于接口和业务模块的不同部署就能做到本地和远程调用;

    2.单一职责:只负责某一业务功能;

    3.独立:每个服务可以独立的开发、测试、构建、部署;

    4. 灵活性:小而灵活可以满足开发不同类型的业务模块。

    5.进程隔离:可以通过隔离,发生熔断,雪崩而不会影响其它服务调用和运行

    6.多样性: 针对于协议的扩展可以支持多样化业务场景的解决方案。

    部件和功能

    通过上图发现,surging 可以支持以下功能:

    1.可以支持web,移动端,物联网和流媒体等业务场景

    2.可以支持rtmp ,http-flv,thrift,mqtt,ws,http,grpc 多种协议以满足不同业务的场景的需要

    3,可以支持服务之间调用的链路追踪。

    4.可以支持扫描模块引擎,cli 工具,任务调度服务,日志,swagger 文档,服务注册,服务发现,协议主机,缓存中间件,事件总线等功能。

    实例

    下面以上图流媒体集群分流的例子,看看是如何研发运行的。

     以部署两台服务提供者为例,服务A,通过下载surging企业版(非商业用户不能用于商业,只能用于学习),通过以下配置来修改surgingSettings.json文件

     {
     "Surging": {
     
        "Port": "${Surging_Server_Port}|81",
         
        "Ports": {
          "HttpPort": "${HttpPort}|28",
          "WSPort": "${WSPort}|96",
          "MQTTPort": "${MQTTPort}|97",
          "GrpcPort": "${GrpcPort}|95"
        },
      "LiveStream": {
        "RtmpPort": 77, //rtmp 端口
        "HttpFlvPort": 8081, //HttpFlv 端口
        "EnableLog": true, //是否启用log
        "EnableHttpFlv": true,
        "RouteTemplate": "live1", //直播服务路由规则名称,可以根据规则设置,比如集群节点2,可以设置live2, 集群节点3,可以设置live3
        "ClusterNode": 2 //集群节点数里,会根据routetemplate 转推流
      }
    }

    服务B,通过以下配置来修改surgingSettings.json文件

     {
     "Surging": {
     
        "Port": "${Surging_Server_Port}|82",
         
        "Ports": {
          "HttpPort": "${HttpPort}|281",
          "WSPort": "${WSPort}|961",
          "MQTTPort": "${MQTTPort}|971",
          "GrpcPort": "${GrpcPort}|951"
        },
      "LiveStream": {
        "RtmpPort": 76, //rtmp 端口
        "HttpFlvPort": 8080, //HttpFlv 端口
        "EnableLog": true, //是否启用log
        "EnableHttpFlv": true,
        "RouteTemplate": "live1", //直播服务路由规则名称,可以根据规则设置,比如集群节点2,可以设置live2, 集群节点3,可以设置live3
        "ClusterNode": 2 //集群节点数里,会根据routetemplate 转推流
      }
    }

    然后可以通过ffmpeg或者obs进行推流,以ffmpeg 工具为例,可以输入以下命令

    ffmpeg -re -i D:/大H包.HDTC1280高清国语中字版.mp4 -c copy -f flv rtmp://127.0.0.1:76/live1/livestream2

    通过以下代码我们创建httpflv 的html 文件,url配置为:http://127.0.0.1:8080/live1/livestream2 

    <!DOCTYPE html>
    <html>
    
    <head>
        <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
        <title>flv.js demo</title>
    
        <style>
            .mainContainer {
                display: block;
                 1024px;
                margin-left: auto;
                margin-right: auto;
            }
    
            .urlInput {
                display: block;
                 100%;
                margin-left: auto;
                margin-right: auto;
                margin-top: 8px;
                margin-bottom: 8px;
            }
    
            .centeredVideo {
                display: block;
                 100%;
                height: 576px;
                margin-left: auto;
                margin-right: auto;
                margin-bottom: auto;
            }
    
            .controls {
                display: block;
                 100%;
                text-align: left;
                margin-left: auto;
                margin-right: auto;
                margin-top: 8px;
                margin-bottom: 10px;
            }
    
            .logcatBox {
                border-color: #CCCCCC;
                font-size: 11px;
                font-family: Menlo, Consolas, monospace;
                display: block;
                 100%;
                text-align: left;
                margin-left: auto;
                margin-right: auto;
            }
        </style>
    </head>
    
    <body>
        
        <div class="mainContainer">
            <video name="videoElement" class="centeredVideo" id="videoElement" controls width="1024" height="576" autoplay>
                Your browser is too old which doesn't support HTML5 video.
            </video>
    
        </div>
    
        <script src="https://cdn.bootcdn.net/ajax/libs/flv.js/1.5.0/flv.min.js"></script>
        
        <script>
            (function () {
                if (flvjs.isSupported()) {
                    startVideo()
                }
    
                function startVideo() {
                    var videoElement = document.getElementById('videoElement');
                    var flvPlayer = flvjs.createPlayer({
                        type: 'flv',
                        isLive: true,
                        hasAudio: true,
                        hasVideo: true,
                        enableStashBuffer: false,
                        url: 'http://127.0.0.1:8080/live1/livestream2'
                    });
                    flvPlayer.attachMediaElement(videoElement);
                    flvPlayer.load();
                    window.setTimeout(function () { flvPlayer.play(); }, 500);
    
                }
    
                videoElement.addEventListener('click', function () {
                    alert('是否支持点播视频:' + flvjs.getFeatureList().mseFlvPlayback + ' 是否支持httpflv直播流:' + flvjs.getFeatureList().mseLiveFlvPlayback)
                })
    
                function destoryVideo() {
                    flvPlayer.pause();
                    flvPlayer.unload();
                    flvPlayer.detachMediaElement();
                    flvPlayer.destroy();
                    flvPlayer = null;
                }
    
                function reloadVideo() {
                    destoryVideo()
                    startVideo()
                }
            }) (document)
        </script>
        
    </body>
    
    </html>
    

    然后就可以通过打开创建的html文件,运行效果如下图

     通过potplay 配置服务A,链接为:rtmp://127.0.0.1:77/live1/livestream2,然后如下图所示:

     可以通过potplay 配置服务B,链接为:rtmp://127.0.0.1:76/live1/livestream2,然后如下图所示:

     结尾

    通过此篇文章我们了解surging ,也了解如何播放httpflv ,如何针对于rtmp 推流转推到其它服务上进行订阅播放,后期计划打算支持rtsp 协议,也请各大用户和企业用户多多关注。

  • 相关阅读:
    67. @Transactional的类注入失败【从零开始学Spring Boot】
    66. No EntityManager with actual transaction available for current thread【从零开始学】
    Android ShapeDrawable之OvalShape、RectShape、PaintDrawable、ArcShape
    Android渲染器Shader:环状放射渐变渲染器RadialGradient(三)
    Android渲染器Shader:梯度渐变扫描渲染器SweepGradient(二)
    Android弹幕编程设计实现的解决方案(一)
    65.什么是IOC?【从零开始学Spring Boot】
    64.JPA命名策略【从零开始学Spring Boot】
    事务、视图和索引
    存储过程
  • 原文地址:https://www.cnblogs.com/fanliang11/p/14749259.html
Copyright © 2011-2022 走看看