1.
边(Edge ):
2.
当添加边时,集群里会广播该边的消息
3.
边连接源通过MRTMP:9035
4.
边上不需要部署服务
5.
边和源最好不要同一台机器
6.
连接由SimpleMRTMPEdgeManager管理,可自己实现IMRTMPEdgeManager
7.
它和客户端是长连接,故有连接数限制
2.
源:(origin)
1.
当添加源时,该源的其他边会自动连上来
i. 因为如果边连接不到源(或者源中途停了),则会不断地隔时连接
3.
边启动--开放一个端口:RTMP用于监听客户端
1.
监听客户端mina,rtmp:调用RTMPMinaTransport的start方法
,EdgeRTMPMinaIoHandler,
用于接收客户端请求,并向源取数据
a)
与客户端建立长连接:
i. EdgeRTMPMinaIoHandler.sessionCreated()=>
ii. EdgeRTMPMinaIoHandler.createRTMPMinaConnection()
iii. RTMPConnManager.createConnection()=>
iv. 创建EdgeRTMPMinaConnection并根据hashCode计算出conn.setId()
v. RTMPConnManager.connMap存放(conn.getId(),conn)
i. EdgeRTMPMinaIoHandler.messageReceived()=>
ii. EdgeRTMPHandler.messageReceived()=>
iii. handleConnect()=>
iv. sendConnectMessage(conn)()=>
v. SimpleMRTMPEdgeManager.lookupMRTMPConnection(conn)
vi. 将客户端请求资源转发给源
2.
连接源mina,mrtmp:根据red5-edge-core.xml里面配置MRTMPClient的start方法,创建线程轮循连接源,用于与源之间的连接,等待源返回资源,将资源发给客户端
a)
建立连接
i. 如果和源建立好连接后mrtmpManager.registerConnection(conn);
b)
源返回资源:
i. EdgeMRTMPHandler. messageReceived()=>
ii. conn =rtmpConnManager.getConnection(clientId);
iii. conn.write(rtmpBody.getRtmpPacket());
iv. 即将源返回的资源发给客户端
4.
源启动--开放两个端口:MRTMP用于监听边,8080用于应用(是否必须?)
1.
由org.red5.server.Bootstrap入口:并找到red5.xml并交给spring初始化,
2.
通过red5.xml=》red5-origin-core.xml
3.
调用MRTMPMinaTransport的start方法,该方法会监听9035端口(等待边的连接)
4.
与边建立连接
a)
源执行OriginMRTMPHandler.sessionCreated()注册连接
b)
SimpleMRTMPOriginManager.registerConnection(conn);
5.
收到拿资源、返回资源:
a)
OriginMRTMPHandler.messageReceived()=>
b)
BaseRTMPHandler. messageReceived()=>
c)
BaseRTMPHandler.onInvoke();=>
d)
RTMPHandler.onInvoke()=>根据协议中的path可以知道tcUrl=rtmp://localhost:1933/helloWorld中的helloWorld,再通过它找到red5-web.xml
i. channel.write(reply);=>
ii. connection.write(packet);
e)
StreamService.play()
f)
PlayEngine.play()
g)
File file =
ProviderService. getVODProviderFile(scope, name)获取文件
h)
msg = msgIn.pullMessage();//会生成*.flv.meta文件
i)
它是支持文件夹目录的
5.
自己的想法
java/spring/mina
边、源:
减小源负载连接
边有压缩作用的意味:将所有连接的请求复用
边任务:流分离、流缓存
和源建立好连接后,客户端的请求可以利用这个连接