首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Prometheus 通过 consul 分布式集群实现自动服务发现

Prometheus 通过 consul 分布式集群实现自动服务发现

作者头像
哎_小羊
发布于 2020-04-08 09:17:48
发布于 2020-04-08 09:17:48
2.3K00
代码可运行
举报
文章被收录于专栏:哎_小羊哎_小羊
运行总次数:0
代码可运行

1、Consul 介绍

Consul 是基于 GO 语言开发的开源工具,主要面向分布式,服务化的系统提供服务注册、服务发现和配置管理的功能。Consul 提供服务注册/发现、健康检查、Key/Value存储、多数据中心和分布式一致性保证等功能。Prometheus 通过 Consul 可以很方便的实现服务自动发现和维护,同时 Consul 支持分布式集群部署,将大大提高了稳定性,通过 Prometheus 跟 Consul 集群二者结合起来,能够高效的进行数据维护同时保证系统稳定。

2、环境、软件准备

本次演示环境,我是在虚拟机上安装 Linux 系统来执行操作,以下是安装的软件及版本:

  • Oracle VirtualBox: 5.1.20 r114628 (Qt5.6.2)
  • System: CentOS Linux release 7.3.1611 (Core)
  • Docker: 18.06.1-ce
  • Prometheus: v2.11.1
  • Consul: 1.6.1

注意:这里为了方便启动 Prometheus,我使用 Docker 方式启动,所以本机需要安装好 Docker 环境,这里忽略 Docker 的安装过程。其中 Prometheus 安装配置,可以参照之前文章 Prometheus 监控报警系统 AlertManager 之邮件告警,这里着重介绍一下如何配置 Consul 分布式集群,以及使用 nginx 来负载均衡 Consul 集群,最后分别验证配置 Prometheus 基于 Consul 集群来实现自动服务发现。

3、Consul 分布式集群搭建

Consul 单机安装很方便,官网 提供各个系统版本二进制安装包,解压安装即可,可以参照之前文章 Prometheus 通过 consul 实现自动服务发现 文章来安装。这里我们要搭建 Consul 分布式集群,既然是分布式集群,那么肯定至少得部署到三台机器上,组成一个集群,苦于手上没有那么多的机器,我们只能在一台机器上部署三个 Consul 服务来模拟 “分布式” 集群,Consul 默认以 client 方式启动,这里我们采用 Server 方式来启动实例,通过不同的端口来区分不同的服务,集群实例如下:

  • 172.30.12.100:8500 node1 leader
  • 172.30.12.100:8510 node2 follower
  • 172.30.12.100:8520 node2 follower

下载最新版二进制安装包,解压后并拷贝到 /usr/local/bin 目录下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ cd /root/prometheus/consul
$ wget https://releases.hashicorp.com/consul/1.6.1/consul_1.6.1_linux_amd64.zip
$ unzip consul_1.6.1_linux_amd64.zip  
$ mv consul /usr/local/bin

集群启动三个实例,这里因为在一台机器上,直接使用 consul anget -server -bootstrap-expect=3 -data-dir=xxx...命令来启动,稍显麻烦且不直观,这里我们采用配置文件的方式分别启动实例。配置 node1 实例,新建配置文件 consul01.json 如下 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "datacenter": "dc1",
  "data_dir": "/root/prometheus/consul/consul01",
  "log_level": "INFO",
  "server": true,
  "node_name": "node1",
  "ui": true,
  "bind_addr": "172.30.12.100",
  "client_addr": "0.0.0.0",
  "advertise_addr": "172.30.12.100",
  "bootstrap_expect": 3,
  "ports":{
    "http": 8500,
    "dns": 8600,
    "server": 8300,
    "serf_lan": 8301,
    "serf_wan": 8302
    }
}

说明一下参数:

  • datacenter:数据中心名称
  • data_dir:数据存放本地目录
  • log_level:输出的日志级别
  • server:以 server 身份启动实例,不指定默认为 client
  • node_name:节点名称,集群中每个 node 名称不能重复,默认情况使用节点 hostname
  • ui:指定是否可以访问 UI 界面
  • bind_addr:监听的 IP 地址,指 Consul 监听的地址,该地址必须能够被集群中的所有节点访问,默认监听 0.0.0.0
  • client_addr:客户端监听地址,0.0.0.0 表示所有网段都可以访问
  • advertise_addr:集群广播地址
  • bootstrap_expect:集群要求的最少成员数量
  • ports:该参数详细配置各个服务端口,如果想指定其他端口,可以修改这里。

后台启动一下 node1 Consul 服务,执行如下命令启动:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
nohup consul agent -config-dir=consul01.json > ./consul01.log 2>&1 &

查看服务启动日志会发现如下输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ootstrap_expect > 0: expecting 3 servers
==> Starting Consul agent...
           Version: 'v1.6.1'
           Node ID: '18450af8-64a3-aa0f-2a6c-4c2fc6e35a4b'
         Node name: 'node1'
        Datacenter: 'dc1' (Segment: '<all>')
            Server: true (Bootstrap: false)
       Client Addr: [0.0.0.0] (HTTP: 8500, HTTPS: -1, gRPC: -1, DNS: 8600)
      Cluster Addr: 172.30.12.100 (LAN: 8301, WAN: 8302)
           Encrypt: Gossip: false, TLS-Outgoing: false, TLS-Incoming: false, Auto-Encrypt-TLS: false

==> Log data will now stream in as it occurs:

    2020/03/30 17:03:18 [INFO]  raft: Initial configuration (index=0): []
    2020/03/30 17:03:18 [INFO]  raft: Node at 172.30.12.100:8300 [Follower] entering Follower state (Leader: "")
    2020/03/30 17:03:18 [INFO] serf: EventMemberJoin: node1.dc1 172.30.12.100
    2020/03/30 17:03:18 [INFO] serf: EventMemberJoin: node1 172.30.12.100
    2020/03/30 17:03:18 [INFO] agent: Started DNS server 0.0.0.0:8600 (udp)
    2020/03/30 17:03:18 [INFO] consul: Handled member-join event for server "node1.dc1" in area "wan"
    2020/03/30 17:03:18 [INFO] consul: Adding LAN server node1 (Addr: tcp/172.30.12.100:8300) (DC: dc1)
    2020/03/30 17:03:18 [INFO] agent: Started DNS server 0.0.0.0:8600 (tcp)
    2020/03/30 17:03:18 [INFO] agent: Started HTTP server on [::]:8500 (tcp)
    2020/03/30 17:03:18 [INFO] agent: started state syncer
==> Consul agent running!
==> Newer Consul version available: 1.7.2 (currently running: 1.6.1)
    2020/03/30 17:03:23 [WARN]  raft: no known peers, aborting election
    2020/03/30 17:03:25 [ERR] agent: failed to sync remote state: No cluster leader

我们会看到类似 [ERR] agent: failed to sync remote state: No cluster leader 这样的报错,这是因为目前还没有任何其他实例加入,无法构成一个集群。接下来,按照上边的配置,启动第二个实例 node2,并加入到 node1 集群中,新建配置文件 consul02.json 如下 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "datacenter": "dc1",
  "data_dir": "/root/prometheus/consul/consul02",
  "log_level": "INFO",
  "server": true,
  "node_name": "node2",
  "ui": true, 
  "bind_addr": "172.30.12.100", 
  "client_addr": "0.0.0.0", 
  "advertise_addr": "172.30.12.100", 
  "bootstrap_expect": 3, 
  "ports":{
    "http": 8510,
    "dns": 8610,
    "server": 8310,
    "serf_lan": 8311,
    "serf_wan": 8312
    }
}

注意:由于这里是一台服务器上启动了多个实例,所以必须修改各个服务端口号,否则会报错,这里新启动的 Consul 服务端口为 8510。启动 node2 Consul 服务,并加入到 node1 Consul 服务中组成集群,启动命令如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
nohup consul agent -config-dir=consul02.json -join 172.30.12.100:8301 > ./consul02.log 2>&1 &

启动完毕后,此时会发现 node1 的日志输出中会打印如下日志:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    2020/03/30 17:14:54 [INFO] serf: EventMemberJoin: node2 172.30.12.100
    2020/03/30 17:14:54 [INFO] consul: Adding LAN server node2 (Addr: tcp/172.30.12.100:8310) (DC: dc1)
    2020/03/30 17:14:54 [INFO] serf: EventMemberJoin: node2.dc1 172.30.12.100
    2020/03/30 17:14:54 [INFO] consul: Handled member-join event for server "node2.dc1" in area "wan"

可以看到 node2 成功加入到 node1 集群,不过接下来它还会一直报错 agent: failed to sync remote state: No cluster leader,这是为什么?日志明明已经显示 node2 成功加入了,怎么还一直报错呢?这是因为我们创建时指定了 bootstrap_expect3,那么就必须至少存在 3 个实例才能组成该 Consul 集群。那么,依照以上步骤,继续启动 node3 Consul 服务并添加到 node1 集群中,新建配置文件 consul03.json 如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "datacenter": "dc1",
  "data_dir": "/root/prometheus/consul/consul03",
  "log_level": "INFO",
  "server": true,
  "node_name": "node3",
  "ui": true, 
  "bind_addr": "172.30.12.100", 
  "client_addr": "0.0.0.0", 
  "advertise_addr": "172.30.12.100", 
  "bootstrap_expect": 3, 
  "ports":{
    "http": 8520,
    "dns": 8620,
    "server": 8320,
    "serf_lan": 8321,
    "serf_wan": 8322
    }
}

启动 node3 Consul 实例命令如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
nohup consul agent -config-dir=consul03.json -join 172.30.12.100:8301 > ./consul03.log 2>&1 &

此时,我们会发现 node1 日志输出中会打印如下日志:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    2020/03/30 17:24:39 [INFO] serf: EventMemberJoin: node3 172.30.12.100
    2020/03/30 17:24:39 [INFO] consul: Adding LAN server node3 (Addr: tcp/172.30.12.100:8320) (DC: dc1)
    2020/03/30 17:24:39 [INFO] consul: Found expected number of peers, attempting bootstrap: 172.30.12.100:8300,172.30.12.100:8310,172.30.12.100:8320
    2020/03/30 17:24:39 [INFO] serf: EventMemberJoin: node3.dc1 172.30.12.100
    2020/03/30 17:24:39 [INFO] consul: Handled member-join event for server "node3.dc1" in area "wan"
    2020/03/30 17:24:40 [WARN]  raft: Heartbeat timeout from "" reached, starting election
    2020/03/30 17:24:40 [INFO]  raft: Node at 172.30.12.100:8300 [Candidate] entering Candidate state in term 2
    2020/03/30 17:24:40 [INFO]  raft: Election won. Tally: 2
    2020/03/30 17:24:40 [INFO]  raft: Node at 172.30.12.100:8300 [Leader] entering Leader state
    2020/03/30 17:24:40 [INFO]  raft: Added peer b7212be5-7d33-a5b6-0ca8-522f05ab9eeb, starting replication
    2020/03/30 17:24:40 [INFO]  raft: Added peer 0afe6fcb-3a07-e443-3802-f822ae9df422, starting replication
    2020/03/30 17:24:40 [INFO] consul: cluster leadership acquired
    2020/03/30 17:24:40 [INFO] consul: New leader elected: node1
    2020/03/30 17:24:40 [WARN]  raft: AppendEntries to {Voter 0afe6fcb-3a07-e443-3802-f822ae9df422 172.30.12.100:8320} rejected, sending older logs (next: 1)
    2020/03/30 17:24:40 [INFO]  raft: pipelining replication to peer {Voter 0afe6fcb-3a07-e443-3802-f822ae9df422 172.30.12.100:8320}
    2020/03/30 17:24:40 [WARN]  raft: AppendEntries to {Voter b7212be5-7d33-a5b6-0ca8-522f05ab9eeb 172.30.12.100:8310} rejected, sending older logs (next: 1)
    2020/03/30 17:24:40 [INFO]  raft: pipelining replication to peer {Voter b7212be5-7d33-a5b6-0ca8-522f05ab9eeb 172.30.12.100:8310}
    2020/03/30 17:24:40 [INFO] consul: member 'node1' joined, marking health alive
    2020/03/30 17:24:40 [INFO] consul: member 'node2' joined, marking health alive
    2020/03/30 17:24:40 [INFO] consul: member 'node3' joined, marking health alive
    2020/03/30 17:24:42 [INFO] agent: Synced node info

node3 成功加入到 node1 集群,整个集群已选出 node1 作为新的 Leader,此时集群状态为 health,那么整个 “分布式” 集群就搭建完毕了。此时,浏览器访问以下任意一个 http://127.0.0.1:8500http://127.0.0.1:8510http://127.0.0.1:8520 地址,均可打开 Consul Web 管理页面。

我们也可以通过命令行查看集群状态、以及集群成员状态。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 查看集群状态
$ consul operator raft list-peers
Node   ID                                    Address             State     Voter  RaftProtocol
node1  18450af8-64a3-aa0f-2a6c-4c2fc6e35a4b  172.30.12.100:8300  leader    true   3
node2  b7212be5-7d33-a5b6-0ca8-522f05ab9eeb  172.30.12.100:8310  follower  true   3
node3  0afe6fcb-3a07-e443-3802-f822ae9df422  172.30.12.100:8320  follower  true   3
# 查看集群成员状态
$ consul members
Node   Address             Status  Type    Build  Protocol  DC   Segment
node1  172.30.12.100:8301  alive   server  1.6.1  2         dc1  <all>
node2  172.30.12.100:8311  alive   server  1.6.1  2         dc1  <all>
node3  172.30.12.100:8321  alive   server  1.6.1  2         dc1  <all>

4、配置 Prometheus 实现自动服务发现

接下来,我们配置 Prometheus 来使用 Consul 集群来实现自动服务发现,目的就是能够将添加的服务自动发现到 Prometheus 的 Targets 中,详细配置说明可以参考之前文章 Prometheus 通过 consul 实现自动服务发现 中的配置,在修改 Prometheus 配置之前,我们需要往 Consul 集群中注册一些数据。首先,我们注册一个 node-exporter-172.30.12.100 的服务,新建 consul-1.json 如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "ID": "node-exporter",
  "Name": "node-exporter-172.30.12.100",
  "Tags": [
    "node-exporter"
  ],
  "Address": "172.30.12.100",
  "Port": 9100,
  "Meta": {
    "app": "spring-boot",
    "team": "appgroup",
    "project": "bigdata"
  },
  "EnableTagOverride": false,
  "Check": {
    "HTTP": "http://172.30.12.100:9100/metrics",
    "Interval": "10s"
  },
  "Weights": {
    "Passing": 10,
    "Warning": 1
  }
}

# 调用 API 注册服务
$ curl --request PUT --data @consul-1.json http://172.30.12.100:8500/v1/agent/service/register?replace-existing-checks=1

然后,我们再注册一个 cadvisor-exporter-172.30.12.100 的服务,新建 consul-2.json 并执行如下命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "ID": "cadvisor-exporter",
  "Name": "cadvisor-exporter-172.30.12.100",
  "Tags": [
    "cadvisor-exporter"
  ],
  "Address": "172.30.12.100",
  "Port": 8080,
  "Meta": {
    "app": "docker",
    "team": "cloudgroup",
    "project": "docker-service"
  },
  "EnableTagOverride": false,
  "Check": {
    "HTTP": "http://172.30.12.100:8080/metrics",
    "Interval": "10s"
  },
  "Weights": {
    "Passing": 10,
    "Warning": 1
  }
}

# 调用 API 注册服务
$ curl --request PUT --data @consul-2.json http://172.30.12.100:8500/v1/agent/service/register?replace-existing-checks=1

注册完毕,通过 Consul Web 管理页面可以查看到两服务已注册成功。注意:这里需要启动 node-exporter 及 cadvisor-exporter,否则即使注册成功了,健康检测也不通过,在后边 Prometheus 上服务发现后状态也是不健康的,这里我就不在演示了,可以直接拿 Docker 启动二者即可。

接下来,我们修改 Prometheus 配置如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
...
  - job_name: 'consul-node-exporter'
    consul_sd_configs:
      - server: '172.30.12.100:8500'
        services: []  
    relabel_configs:
      - source_labels: [__meta_consul_tags]
        regex: .*node-exporter.*
        action: keep
      - regex: __meta_consul_service_metadata_(.+)
        action: labelmap

  - job_name: 'consul-cadvisor-exproter'
    consul_sd_configs:
      - server: '172.30.12.100:8510'
        services: []
      - server: '172.30.12.100:8520'
        services: []
    relabel_configs:
      - source_labels: [__meta_consul_tags]
        regex: .*cadvisor-exporter.*
        action: keep
      - action: labelmap
        regex: __meta_consul_service_metadata_(.+)
...

启动一下 Prometheus 服务,通过 web 界面看下 Target 中是否能够发现 Consul 中注册的服务。

可以看到,妥妥没有问题,这里 consul-node-exporter 我配置指向了 node1 Consul 服务地址,consul-cadvisor-exproter 配置指向了 node2、node3 Consul 服务,二者都能够正确发现之前注册的服务,因为 Consul 集群数据是保持同步的,无论连接哪一个节点,都能够获取到注册的服务信息,同理,我们也可以指定 consul_sd_configs 分别指向集群所有节点,这样即使某个节点挂掉,也不会影响 Prometheus 从 Consul 集群其他节点获取注册的服务,从而实现服务的高可用。

5、配置 nginx 负载均衡 Consul 集群

虽然我们可以将整个 Consul 集群 IP 添加到 Prometheus 的配置中,从而实现 Prometheus 从 Consul 集群获取注册的服务,实现服务的高可用,但是这里有个问题,如果 Consul 集群节点新增或者减少,那么 Prometheus 配置也得跟着修改了,这样不是很友好,我们可以在 Consul 集群前面使用 nginx 反向代理将请求负载均衡到后端 Consul 集群各节点服务上,这样 Prometheus 只需要配置代理地址即可,后期不需要更改了。

这里为了方便,nginx 也使用容器方式启动,新增配置文件 default.conf 如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
upstream service_consul {
    server 172.30.12.100:8500;
    server 172.30.12.100:8510;
    server 172.30.12.100:8520;
    ip_hash;
}

server {
    listen       80;
    server_name  172.30.12.100;
    index  index.html index.htm;    

    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        add_header Access-Control-Allow-Origin *;
        proxy_next_upstream http_502 http_504 error timeout invalid_header;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://service_consul;    
    }

    access_log /var/log/consul.access.log;
    error_log /var/log/consul.error.log;    

    error_page  404              /404.html;

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

Docker 启动 nginx 服务,启动命令如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ docker run --name nginx-consul -p 80:80 -v /root/prometheus/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro -d nginx

这里就没啥好说的了,启动完成后,可以浏览器访问一下 http://172.30.12.100/ui ,妥妥也是没有问题的。

最后,我们修改一下 Prometheus 配置文件,将 server 指向 172.30.12.100 即可,修改配置如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
...
  - job_name: 'consul-node-exporter'
    consul_sd_configs:
      - server: '172.30.12.100'
        services: []  
    relabel_configs:
      - source_labels: [__meta_consul_tags]
        regex: .*node-exporter.*
        action: keep
      - regex: __meta_consul_service_metadata_(.+)
        action: labelmap

  - job_name: 'consul-cadvisor-exproter'
    consul_sd_configs:
      - server: '172.30.12.100'
        services: []
    relabel_configs:
      - source_labels: [__meta_consul_tags]
        regex: .*cadvisor-exporter.*
        action: keep
      - action: labelmap
        regex: __meta_consul_service_metadata_(.+)
...

重启 prometheus 服务,验证也是妥妥没问题的。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Windows平台C#版RTSP转RTMP直播推送定制版
前几年我们发布了C++版的多路RTMP/RTSP转RTMP转发官方定制版。在秉承低延迟、灵活稳定、低资源占用的前提下,客户无需关注开发细节,只需图形化配置转发等各类参数,实现产品快速上线目的。
音视频牛哥
2024/05/19
2370
Windows平台C#版RTSP转RTMP直播推送定制版
低延迟播放超高分辨率(4K+)帧率(50帧+)RTSP|RTMP流技术探讨和实现
我们在对接RTSP、RTMP推拉流播放的时候,开发者提到这样的技术诉求,他们在用于安检等场景的时候,采集分辨率甚至需要4K+,帧率需要达到50帧以上,码率也非常高,这就对推流和播放模块,提出了更高的要求。
音视频牛哥
2024/07/15
4030
低延迟播放超高分辨率(4K+)帧率(50帧+)RTSP|RTMP流技术探讨和实现
Windows平台如何实现RTSP流二次编码并添加动态水印后推送RTMP或轻量级RTSP服务
我们在对接RTSP播放器相关的技术诉求的时候,遇到这样的需求,客户做特种设备巡检的,需要把摄像头拍到的RTSP流拉下来,然后添加动态水印后,再生成新的RTSP URL,供平台调用。真个流程需要延迟尽可能的低,分辨率要支持到1080p,并需要把添加过动态水印的数据,保存到本地。
音视频牛哥
2023/11/22
5240
Windows平台如何实现RTSP流二次编码并添加动态水印后推送RTMP或轻量级RTSP服务
Unity平台如何实现RTSP转RTMP推送?
Unity平台下,RTSP、RTMP播放和RTMP推送,甚至包括轻量级RTSP服务这块都不再赘述,今天探讨的一位开发者提到的问题,如果在Unity下,实现RTSP播放的同时,随时转RTMP推送出去?
音视频牛哥
2023/07/14
3580
Unity平台如何实现RTSP转RTMP推送?
wpf下如何实现超低延迟的RTMP或RTSP播放
我们在做Windows平台RTMP和RTSP播放模块对接的时候,有开发者需要在wpf下调用,如果要在wpf下使用,只需要参考C#的对接demo即可,唯一不同的是,视频流数据显示的话,要么通过控件模式,要么可以让RTMP、RTSP播放模块回调rgb数据上来,在wpf直接绘制即可。
音视频牛哥
2024/04/10
6830
wpf下如何实现超低延迟的RTMP或RTSP播放
Windows平台如何实现多路RTSP|RTMP流合成后录像或转发RTMP服务
我们在对接Windows平台RTSP|RTMP直播播放模块的时候,有开发者提出来这样的技术需求,他们做驾考、全景摄像头、多路会议录制等场景的时候,希望把多路视频流数据,合并到一路保存或者对外推送到RTMP服务。
音视频牛哥
2024/07/15
3290
Windows平台如何实现多路RTSP|RTMP流合成后录像或转发RTMP服务
QT下实现低延迟RTSP|RTMP播放器
好多开发者在QT环境下实现RTMP或RTSP播放时,首先考虑到的是集成VLC,集成后,却发现VLC在延迟、断网重连、稳定性等各个方面不尽人意,无法满足上线环境需求。本文以调用大牛直播SDK(官方)的Windows平台播放端SDK为例,介绍下如何在QT下实现低延迟的RTMP|RTSP播放器,废话不多说,先上图:
音视频牛哥
2021/04/30
1.9K0
跨平台低延迟RTSP转RTMP推送技术方案探讨
实现RTSP摄像头数据转RTMP推送到服务器,可以用第三方库或者工具实现,总体设计架构如下:
音视频牛哥
2023/07/11
1.2K0
跨平台低延迟RTSP转RTMP推送技术方案探讨
Windows平台基于RTMP实现一对一互动直播
基于 https://github.com/daniulive/SmarterStreaming/ 拉流端封装的代码:
音视频牛哥
2020/04/05
9900
Windows平台RTSP播放器、RTMP播放器几点设计细节讨论
我们在实现Windows平台RTSP播放器或RTMP播放器的时候,需要考虑的点很多,比如多实例设计、多绘制模式兼容、软硬解码支持、快照、RTSP下TCP-UDP自动切换等,以下就其中几个方面,做个大概的探讨:
音视频牛哥
2020/06/07
1.7K0
Windows平台如何实现RTSP拉流添加动态水印|视频处理后转推RTMP或轻量级RTSP服务
我们在做Windows平台流数据转发的时候,除了常规的RTSP转RTMP推送外,还有个场景就是,好多开发者希望拉取的RTSP流,做二次视频分析,或者加动态水印等,处理后的数据,再二次编码推送到RTMP服务或轻量级RTSP服务。
音视频牛哥
2023/12/27
5440
Windows平台如何实现RTSP拉流添加动态水印|视频处理后转推RTMP或轻量级RTSP服务
Windows平台如何实现RTSP|RTMP流录像?
​好多开发者使用场景,除了实现基础的低延迟RTSP、RTMP播放外,还需要实现RTSP、RTMP流数据的本地录像功能。本文以大牛直播SDK的Windows平台播放模块为例,介绍下如何实现RTSP、RTMP流录像。
音视频牛哥
2024/10/01
3050
Windows平台如何实现RTSP|RTMP流录像?
如何在Unity3d实现多路RTSP或RTMP流播放
好多开发者在做AR、VR或者教育类产品时,苦于如何在windows平台构建一个稳定且低延迟的RTSP或者RTMP播放器,如果基于Unity3d完全重新开发一个播放器,代价大、而且周期长,不适合快速出产品,我们认为当前最好的方式就是集成现有Native平台上成熟稳定播放器,回调rgb/yuv数据到上层,上层做绘制即可。
音视频牛哥
2021/03/12
2.3K0
如何在Unity3d实现多路RTSP或RTMP流播放
wpf下RTSP|RTMP播放器两种渲染模式实现
在这篇blog之前,我提到了wpf下播放RTMP和RTSP渲染的两种方式,一种是通过控件模式,另外一种是直接原生RTSP、RTMP播放模块,回调rgb,然后在wpf下渲染,本文就两种方式做个说明。
音视频牛哥
2024/04/14
3860
wpf下RTSP|RTMP播放器两种渲染模式实现
对话音视频牛哥:开发RTSP|RTMP直播播放器难不难?难在哪?
好多开发者跟我交流音视频相关技术的时候,经常问我的问题是,多久可以开发个商业级别的RTMP或RTSP播放器?你们是怎样做到毫秒级延迟的?为什么一个播放器,会被你们做到那么复杂?带着这些疑问,结合Windows平台RTMP、RTSP播放模块,探讨下我的一点心得,不当之处权当抛砖引玉:
音视频牛哥
2023/08/20
6030
对话音视频牛哥:开发RTSP|RTMP直播播放器难不难?难在哪?
Windows平台RTSP|RTMP播放器如何实现细粒度录像控制
好多开发者在跟我做技术交流的时候,说用大牛直播SDK模块的特点是,想到什么功能,找找头文件和demo几乎都有对应的实现,你们是何收集到这么多技术需求的?
音视频牛哥
2024/04/17
7340
Windows平台RTSP|RTMP播放器如何实现细粒度录像控制
Windows平台RTMP、RTSP播放器录像模块精细化控制
上篇文章,我们介绍了Unity平台RTMP、RTSP播放器录像功能,这里,我们详细的介绍下,做个RTSP或RTMP拉流端录像模块有哪些需要考虑的技术点?
音视频牛哥
2022/12/24
1.2K0
Windows平台RTMP、RTSP播放器录像模块精细化控制
Unity3D下Linux平台播放RTSP或RTMP流
尽管Windows平台有诸多优势,Linux平台的发展还是势不可挡,特别实在传统行业,然而Linux生态构建,总是差点意思,特别是有些常用的组件,本文基于已有的Linux平台RTSP、RTMP播放模块,构建Unity下的RTSP和RTMP直播播放。
音视频牛哥
2022/04/01
1.2K0
RTSP播放器实现回调RGB|YUV给视觉算法,然后二次编码推送到RTMP服务
在本文中,我们将介绍如何基于大牛直播SDK构建一个功能强大的RTSP|RTMP播放器,该播放器利用自定义SDK解码视频、处理RGB帧,并将其推送到RTMP流中进行直播。这个解决方案非常适合需要在实时视频流中集成视觉算法的场景,在处理后将数据推送到RTMP服务器。我们将详细探讨播放器的架构、回调处理以及图像帧的操作过程。
音视频牛哥
2025/04/24
1190
RTSP播放器实现回调RGB|YUV给视觉算法,然后二次编码推送到RTMP服务
D3D还是GDI? Windows平台播放RTSP或RTMP渲染模式比较
好多开发者纠结播放端绘制,是D3D还是GDI,先说结论,Windows平台播放渲染这块,支持D3D的前提下,优先D3D,如果检测到不支持D3D,数据回调上来,GDI模式绘制。
音视频牛哥
2020/06/20
1.4K0
推荐阅读
相关推荐
Windows平台C#版RTSP转RTMP直播推送定制版
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验