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;
width: 1024px;
margin-left: auto;
margin-right: auto;
} .urlInput {
display: block;
width: 100%;
margin-left: auto;
margin-right: auto;
margin-top: 8px;
margin-bottom: 8px;
} .centeredVideo {
display: block;
width: 100%;
height: 576px;
margin-left: auto;
margin-right: auto;
margin-bottom: auto;
} .controls {
display: block;
width: 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;
width: 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 协议,也请各大用户和企业用户多多关注。
surging 基于流媒体服务如何集群分流的更多相关文章
- 基于puppet分布式集群管理公有云多租户的架构浅谈
基于puppet分布式集群管理公有云多租户的架构浅谈 一.架构介绍 在此架构中,每个租户的业务集群部署一台puppet-master作为自己所在业务集群的puppet的主服务器,在每个业务集群所拥 ...
- 理解OpenShift(7):基于 Prometheus 的集群监控
理解OpenShift(1):网络之 Router 和 Route 理解OpenShift(2):网络之 DNS(域名服务) 理解OpenShift(3):网络之 SDN 理解OpenShift(4) ...
- 基于Ceph分布式集群实现docker跨主机共享数据卷
上篇文章介绍了如何使用docker部署Ceph分布式存储集群,本篇在此基础之上,介绍如何基于Ceph分布式存储集群实现docker跨主机共享数据卷. 1.环境准备 在原来的环境基础之上,新增一台cen ...
- 从零开始:Mysql基于Amoeba的集群搭建
从零开始:Mysql基于Amoeba的集群搭建 准备环境 1.mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz 2.amoeba-mysql-binary-2.0. ...
- 基于k8s的集群稳定架构-转载
基于k8s的集群稳定架构-转载 前言 我司的集群时刻处于崩溃的边缘,通过近三个月的掌握,发现我司的集群不稳定的原因有以下几点: 1.发版流程不稳定 2.缺少监控平台[最重要的原因] 3.缺少日志系统 ...
- 《基于Kubernetes舵手集群的设计与实现》
前言 <基于Kubernetes舵手集群的设计与实现>是我的毕业设计项目.本系统采用Kubernetes容器编排.基于Jenkins\Gitlab的CICD技术.EFK日志收集.Prome ...
- RDD:基于内存的集群计算容错抽象(转)
原文:http://shiyanjun.cn/archives/744.html 该论文来自Berkeley实验室,英文标题为:Resilient Distributed Datasets: A Fa ...
- 基于Hadoop分布式集群YARN模式下的TensorFlowOnSpark平台搭建
1. 介绍 在过去几年中,神经网络已经有了很壮观的进展,现在他们几乎已经是图像识别和自动翻译领域中最强者[1].为了从海量数据中获得洞察力,需要部署分布式深度学习.现有的DL框架通常需要为深度学习设置 ...
- RDD:基于内存的集群计算容错抽象
转载自:http://shiyanjun.cn/archives/744.html 摘要 本文提出了分布式内存抽象的概念--弹性分布式数据集(RDD,Resilient Distributed Dat ...
随机推荐
- springAop:Aop(Xml)配置,Aop注解配置,spring_Aop综合案例,Aop底层原理分析
知识点梳理 课堂讲义 0)回顾Spring体系结构 Spring的两个核心:IoC和AOP 1)AOP简介 1.1)OOP开发思路 OOP规定程序开发以类为模型,一切围绕对象进行,OOP中完成某个任务 ...
- 「视频小课堂」Logstash如何成为镇得住场面的数据管道(文字版)
视频地址 B站视频地址:Logstash如何成为镇得住场面的数据管道 公众号视频地址:Logstash如何成为镇得住场面的数据管道 知乎视频地址:Logstash如何成为镇得住场面的数据管道 内容 首 ...
- 批量实现SSH无密码登陆认证脚本
批量实现SSH无密码登陆认证脚本 问题背景 使用为了让linux之间使用ssh不需要密码,可以采用了数字签名RSA或者DSA来完成.主要使用ssh-key-gen实现. 1.通过 ssh-key-ge ...
- nsqlookupd:高性能消息中间件 NSQ 解析
摘要:本篇将会结合源码介绍 nsqlookupd 的实现细节. 本篇将会结合源码介绍 nsqlookupd 的实现细节.nsqlookupd 主要流程与nsqd 执行逻辑相似,区别在于具体运行的任务不 ...
- vue-cli2 项目中使用node-sass
公司的项目,换了个电脑要重新安装一下依赖,但是直接npm install的时候报错了,提示node-sass未安装成功. 然后直接npn install node-sass --save 的时候还是下 ...
- 干货!Apache Hudi如何智能处理小文件问题
1. 引入 Apache Hudi是一个流行的开源的数据湖框架,Hudi提供的一个非常重要的特性是自动管理文件大小,而不用用户干预.大量的小文件将会导致很差的查询分析性能,因为查询引擎执行查询时需要进 ...
- [Fundamental of Power Electronics]-PART II-8. 变换器传递函数-8.4 变换器传递函数的图形化构建
8.4 变换器传递函数的图形化构建 第7章推导出的buck变换器小信号等效电路模型在图8.55中再次给出.让我们用上一节的图解方法来构造该变换器的传递函数和端阻抗. Fig. 8.55 Small-s ...
- 03_利用pytorch解决线性回归问题
03_利用pytorch解决线性回归问题 目录 一.引言 二.利用torch解决线性回归问题 2.1 定义x和y 2.2 自定制线性回归模型类 2.3 指定gpu或者cpu 2.4 设置参数 2.5 ...
- 面试系列<3>——java并发
面试系列--java并发 一.使用线程 有三种使用线程的方法: 实现Runnable接口 实现Callable接口 继承Thread类 实现 Runnable 和 Callable 接口的类只能当做一 ...
- Day05_18_类和对象的含义与关系
Java 类和对象 类的含义? 类属于引用数据类型,java语言中所有的.class都属于引用数据类型, 在类体当中,方法体之外定义的变量被称为 成员变量,成员变量若没有赋值,系统会默认赋值为0: 先 ...