Yin的笔记本

vuePress-theme-reco Howard Yin    2021 - 2025
Yin的笔记本 Yin的笔记本

Choose mode

  • dark
  • auto
  • light
Home
Category
  • CNCF
  • Docker
  • namespaces
  • Kubernetes
  • Kubernetes对象
  • Linux
  • MyIdeas
  • Revolution
  • WebRTC
  • 云计算
  • 人工智能
  • 分布式
  • 图像处理
  • 图形学
  • 微服务
  • 数学
  • OJ笔记
  • 博弈论
  • 形式语言与自动机
  • 数据库
  • 服务器运维
  • 编程语言
  • C
  • Git
  • Go
  • Java
  • JavaScript
  • Python
  • Nvidia
  • Shell
  • Tex
  • Rust
  • Vue
  • 视频编解码
  • 计算机网络
  • SDN
  • 论文笔记
  • 讨论
  • 边缘计算
  • 量子信息技术
Tag
TimeLine
About
查看源码
author-avatar

Howard Yin

304

Article

153

Tag

Home
Category
  • CNCF
  • Docker
  • namespaces
  • Kubernetes
  • Kubernetes对象
  • Linux
  • MyIdeas
  • Revolution
  • WebRTC
  • 云计算
  • 人工智能
  • 分布式
  • 图像处理
  • 图形学
  • 微服务
  • 数学
  • OJ笔记
  • 博弈论
  • 形式语言与自动机
  • 数据库
  • 服务器运维
  • 编程语言
  • C
  • Git
  • Go
  • Java
  • JavaScript
  • Python
  • Nvidia
  • Shell
  • Tex
  • Rust
  • Vue
  • 视频编解码
  • 计算机网络
  • SDN
  • 论文笔记
  • 讨论
  • 边缘计算
  • 量子信息技术
Tag
TimeLine
About
查看源码
  • ION中的islb服务

ION中的islb服务

vuePress-theme-reco Howard Yin    2021 - 2025

ION中的islb服务


Howard Yin 2022-04-13 12:35:03 WebRTC编程框架pion实操

打开pkg/node/islb/islb.go 来看一眼,发现只有一个Start和Stop函数,核心代码应该是Start里的这一段。

首先是连Redis:

	i.redis = db.NewRedis(conf.Redis)
	if i.redis == nil {
		return errors.New("new redis error")
	}
1
2
3
4

然后又创建了一个全局的服务注册中心:

	//registry for node discovery.
	i.registry, err = NewRegistry(conf.Global.Dc, i.Node.NatsConn(), i.redis)
	if err != nil {
		log.Errorf("%v", err)
		return err
	}
1
2
3
4
5
6

这个NewRegistry是一个这样的东西:

看起来像是调用了一个registry包的什么东西创建了注册中心,然后用Listen指定了两个消息处理的函数。看看这个registry包是什么:

原来如此,是一个基于nats消息队列做的服务注册器啊。

那这个handleNodeAction和handleGetNodes肯定就是服务注册的主要逻辑了。看看:

就是个简单的按照指令增减节点的操作。

这就是个返回存储的节点信息的操作。在if service == proto.ServiceRTC的里面应该是查询SFU节点的操作,根据一个叫nid的变量和一个叫sid的变量进行的操作,这个nid还有可能是*?那这很有可能是一个根据聊天室Session从数据库里查找对应的视频流在哪个SFU上的操作。但是这查找的结果又没给返回回去,最后也有只是根据服务名称返回了所有符合要求的节点,看这样子所谓负载均衡好像都没完全实现,或者可能是准备删了。

回到pkg/node/islb/islb.go的代码里,可以看到有一个ServiceRegistrar被注册到了grpc和一个reflection包里面:

	i.s = newISLBServer(conf, i, i.redis)
	pb.RegisterISLBServer(i.Node.ServiceRegistrar(), i.s)

	// Register reflection service on nats-rpc server.
	reflection.Register(i.Node.ServiceRegistrar().(*nrpc.Server))
1
2
3
4
5

看这个ServiceRegistrar长这样: 所以这明显是一个构造grpc服务器的惯用操作。

再看这个reflection包是哪来的: 原来是一个基于nats实现的grpc!ion真就把所有通信操作都放进nats里面啊

再找到这个pb.RegisterISLBServer的位置看看proto文件:

syntax = "proto3";

import "proto/ion/ion.proto";

option go_package = "github.com/pion/ion/proto/islb";

package islb;

service ISLB {
}

message FindNodeRequest {
    string sid = 1;
    string nid = 2;
    string service = 3;
}

message FindNodeReply {
    repeated ion.Node nodes = 1;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

😂太简单了8

没有一点复杂的协议在里面,就只有FindNode相关的两个操作,而且ISLB服务居然是空的?

在newISLBServer这里面有一大段被注释的代码: 从这个注释看是接收流信息的函数,负责接收视频流的建立和断开过程,并且把现在所有的流信息写进数据库里。这地方和前面的handleGetNodes对应起来了,在islb里查SFU节点的流信息可能是一个将要被删除的功能。这功能应该移到别的地方去了吧。

回到pkg/node/islb/islb.go的代码里,可以看到上面那些东西都打包进了这个Node里面:

	node := discovery.Node{
		DC:      conf.Global.Dc,
		Service: proto.ServiceISLB,
		NID:     i.Node.NID,
		RPC: discovery.RPC{
			Protocol: discovery.NGRPC,
			Addr:     conf.Nats.URL,
			//Params:   map[string]string{"username": "foo", "password": "bar"},
		},
	}
1
2
3
4
5
6
7
8
9
10

没啥好说的

然后启动轮询上报自身状态和监测节点操作请求:

	go func() {
		err := i.Node.KeepAlive(node)
		if err != nil {
			log.Errorf("islb.Node.KeepAlive: error => %v", err)
		}
	}()

	//Watch ALL nodes.
	go func() {
		err := i.Node.Watch(proto.ServiceALL)
		if err != nil {
			log.Errorf("Node.Watch(proto.ServiceALL) error %v", err)
		}
	}()
1
2
3
4
5
6
7
8
9
10
11
12
13
14

也没啥好说的

所以综上所述,islb实际上就是一个节点注册中心,并没有所谓的负载均衡功能,存储和查询流信息的功能不知道被移到哪去了。推测这个模块后面应该会改个名字,比如改成“Registry”啥的,更符合它现在的功能。

帮助我们改善此页面!
创建于: 2022-04-13 11:56:10

更新于: 2022-04-13 12:35:33