首页 文章 精选 留言 我的

精选列表

搜索[搭建],共10000篇文章
优秀的个人博客,低调大师

Discord x Pulsar: 使用Pulsar、Flink和Iceburg搭建流式机器学习平台

本文整理自 Discord 机器学习工程师 David Christle 在 Pulsar Summit NA 上的演讲内容,一起来看Discord 是如何实现兼顾安全和个性化功能的实时流式机器学习平台的。 1. 背景 Discord 是一个实时⾳视频通信平台,⽀持⽂本/语⾳/视频频道交流,广泛应用于1对1、中小团队或⼤型社区的在线交流场景,能支持用户从私密聊天到百万级社区通信的不同需求。平台于2015年创立,最初在游戏社区中流行起来,目前已扩展到多个领域,月活用户达1.5亿。 2. 挑战 Discord 面临的核心挑战是升级其实时流式机器学习平台,以应对安全和个性化需求,例如限制垃圾信息访问或保护用户账户免遭入侵。其原先架构是为启发式规则设计的,而非机器学习。为了寻求一个稳健、可扩展且实时的解决方案,他们探索了集成 Apache Pulsar、Flink和 Iceberg 的方案。 2.1 需求 “该系统的运行速度和可扩展性是关键所在。” “该框架非常强大,支持过滤、转换、连接、聚合等操作;你在数据处理方式上拥有极大的自由度,即使在实时场景下效率也非常高。这些管道可以非常简单,比如事件采集和去重;也可以用来完成 ETL 任务。我们能在流数据上以极低延迟进行机器学习。” 安全 反垃圾邮件:通过跨职能团队协作,最大程度避免⽤户对垃圾内容和垃圾邮件发送者的接触 账户安全:主动保护⽤户账户免遭⼊侵,并在⼊侵发⽣时实现快速检测 处理速度和可扩展性:解决⽅案的速度和可扩展性⾄关重要,直接影响⽤户体验和安全防护效果 个性化 发现服务器(Discord Server,类似兴趣组):帮助⽤户快速发现感兴趣的新服务器 通知优化:实时确定最佳通知内容和发送时机,确保信息时效性 响应速度:需要在⼏分钟内完成相关计算,避免内容过时失效 2.2 痛点 规则引擎不适合ML: 专为人工规则设计,无法处理历史数据,基础计算困难,导致新特征上线延迟长达一个月。 批处理延迟高、整合难: 数据获取的延迟依赖批处理的效率,手动拼接批处理与实时特征易错难调,模型问题诊断困难。 微服务臃肿低效: 每个模型独立部署微服务带来高复杂度与部署负担,响应速度跟不上威胁变化,灵活性牺牲了实时性。 3. 解决方案 Discord 采用了基于 Pulsar、Flink和 Iceberg的实时流处理方案。其中,从 Google Cloud Pub/Sub(GCP) 迁移到 Pulsar 是一个关键决策,显著提升了效率和可扩展性。Flink 和 Iceberg 则在分析实时数据、管理历史事件以及回填(backfill)方面发挥了至关重要的作用。 “对我们而言,Pulsar 的关键优势在于它不仅拥有队列传输模式(这在 Discord 非常常用),还提供了分区式传输模式。” “Pulsar分区传输在保障顺序性的同时,还能实现极低的延迟 ;我们利用这一点实现了近乎即时的水位线(watermark)体验,并在低延迟的情况下获得了准确的结果。” GCP 提供了一种无状态且无序的内部事件流量托管方案,适用于不关⼼时间顺序的宽泛分发队列、大规模并⾏处理的⽆状态任务,但存在以下问题: Connector:Flink-PubSub连接器维护不⾜且过时;需要依赖开源PR才能实现统⼀批流API 高延迟:高达20-40s的延迟 高成本:随着规模扩大成本明显拉高 在这种场景下,Pulsar 凭借丰富的 Connector支持、分区和队列双模式、存算分离、原生多租户支持及优秀的低延迟表现从众多方案中脱颖而出。 基于业务需求,Discord的工程师团队构建了一个成熟精简、高效灵活且突破传统限制的生产级架构,Pulsar在其中扮演了实时数据主干网与流批融合关键枢纽的角色。 精简架构与生产就绪的ML生态系统: 该方案显著简化了架构,减少了部署组件。工程师无需关注底层数据来源的复杂性,系统自动处理数据分区和可靠交付。数据处理流程清晰高效:利用Flink作业进行实时的特征计算(过滤、聚合、连接等),并将长期运行(数月)的计算结果直接输出到Iceberg表中,作为高质量的训练数据集。模型部署采用ONNX格式,兼容XGBoost、PyTorch、TensorFlow等主流框架,其二进制文件可直接嵌入Flink作业运行,完全摒弃了传统独立的模型服务,这不仅大幅降低了系统复杂度和潜在错误,也使得开发调试更简单快速,显著提升了开发效率。 灵活流处理与混合源能力:系统的关键创新在于利用Flink的HybridSource技术,无缝融合了批处理源(Iceberg)和流处理源(Pulsar)。Pulsar作为核心的实时数据流来源,与Iceberg的历史数据结合得天衣无缝。系统能够在预定时间戳自动在批处理和流处理源之间透明切换,这对工程师完全隐藏了底层复杂性。这种设计确保了开发环境与生产环境数据源的高度一致性,工程师可以直接使用Pulsar流和Iceberg表进行开发测试,并支持从历史任意时间点(数月甚至一年前)启动作业,进行回溯或调试。即使在处理海量数据时,基于Pulsar提供的稳定实时流和Iceberg的可靠存储,系统也表现出极强的稳定性和增量处理能力。 突破实时状态与回填限制:该架构彻底解决了实时ML系统常见的状态管理和历史数据回填(backfill)难题。得益于流批一体的设计(核心是Pulsar流与Iceberg表的融合)和模型内嵌于Flink作业的简化架构(模型仅是作业中的一个“小方块”),系统发生变更后,历史数据的回填速度极快,仅需3-4小时即可完成。这使得快速训练新模型并部署上线观察效果成为现实,极大加速了模型迭代周期。运维层面,通过自定义Bazel规则简化了ML工程师的工作流,并利用Flink Kubernetes Operator自动化管理作业的完整生命周期(包括部署、保存点、高可用性),确保了系统的稳健运行。Pulsar提供的持久化、可重放实时流,是支撑快速、稳定回填的关键基础设施之一。 关键安全指标提升与广泛适用性:此系统在Discord最核心的安全场景(如垃圾邮件过滤和账户保护)中实现了两位数的关键指标提升,并成功将平台超过60%的安全评分决策从传统启发式规则迁移至实时ML模型驱动。这得益于Pulsar提供的高吞吐、低延迟实时数据流,使得系统能够在虚假账户和僵尸网络发起攻击、造成实际损害前就进行主动检测与拦截,显著增强了平台的实时防御能力。更重要的是,该架构设计具备高度通用性,其基于成熟开源技术栈(Flink、Pulsar、Iceberg)的精简模型和流批一体能力,使其可轻松扩展应用于A/B测试、用户实验、个性化推荐等多个场景。 4. 结语 Discord 的成功实践充分验证了由 Apache Pulsar、Flink 和 Iceberg 构建的实时机器学习平台的高效性与强大潜力。利用 Pulsar 作为高吞吐、低延迟的实时数据主干网,无缝连接流处理与批处理,为 Flink 的实时特征计算和模型嵌入提供了坚实基础。David Christle 的分享不仅展示了这一技术栈(尤其是 Pulsar 在流批融合中的关键作用)的强大实力,更凸显了小型团队基于成熟开源技术打造精简、高效生产系统的卓越能力。该案例也为业界探索实时机器学习融合、构建以可靠消息流(如 Pulsar)为核心的实时数据管道提供了极具参考价值的范本。

优秀的个人博客,低调大师

雷池 WAF 离线安装搭建全流程指南(2025 年最新版)

一、环境要求与准备工作 系统要求 操作系统:Debian12+(推荐大版本一致,如内网使用debian12,在线主机也需debian系列) CPU架构:x86_64,需支持SSSE3指令集(可通过 lscpu | grep ssse3 验证) 最小配置:1核CPU/1GB内存/5GB磁盘空间(高流量场景需扩容) 软件依赖 Docker 20.10.14+ Docker Compose 2.0.0+ 若离线环境需提前准备以下文件: Docker RPM包及本地YUM源(含createrepo工具生成) 雷池镜像包( image.tar.gz ) compose.yaml 编排脚本 二、在线环境生成离线包(联网主机操作) 在可联网设备上操作 # 创建离线包目录 2mkdir docker-offline && cd docker-offline 3 4# 安装必要工具 5sudo apt-get update && sudo apt-get install -y curl gnupg 6 7# 添加DockerGPG密钥 8curl -fsSL http://mirrors.volces.com/docker/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg 9 10# 配置Docker镜像源 11echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] http://mirrors.volces.com/docker/linux/debian $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null 12 13# 更新软件源 14sudo apt-get update 15 16# 下载docker全家桶及核心依赖(--download-only确保仅下载) 17sudo apt-get download \ 18 docker-ce \ 19 docker-ce-cli \ 20 containerd.io \ 21 docker-buildx-plugin \ 22 docker-compose-plugin \ 23 ca-certificates \ 24 libltdl7 \ 25 libseccomp2 \ 26 iptables \ 27 libdevmapper1.02.1 28 29# 收集所有deb包 30cp /var/cache/apt/archives/*.deb . 31 32# 确保没有遗漏的依赖,可以通过apt-cache depends命令检查每个包的依赖关系 33for pkg in docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin; do 34 echo "Checking dependencies for $pkg" 35 apt-cache depends $pkg | grep "Depends" | sed "s/Depends: //" | xargs -I % sudo apt-get download % 36done 37 38# 校验文件完整性(可选) 39md5sum *.deb > checksum.md5 40 41# 输出收集到的.deb包列表以供确认 42echo "Collected .deb packages:" 43ls -lh *.deb 打包压缩离线包目录 1tar -cvf docker-offline.tar.gz docker-offline/ 三、离线环境部署(内网主机操作) 1.文件传输将打包好的docker-offline目录通过物理介质拷贝到目标服务器的/tmp目录,然后执行命令解压 tar -xvf docker-offline.tar.gz -C /tmp 2.安装Docker环境 1 cd /tmp/docker-offline 2 3 # 按依赖顺序安装 4 sudo dpkg -i /tmp/docker-offline/ca-certificates*.deb 5 sudo dpkg -i /tmp/docker-offline/lib*.deb 6 sudo dpkg -i containerd.io*.deb 7 sudo dpkg -i docker-ce-cli*.deb 8 sudo dpkg -i docker-ce*.deb 9 sudo dpkg -i docker-buildx-plugin_*.deb docker-compose-plugin_*.deb 10 sudo dpkg -i *.deb 3.服务管理 1 # 配置守护进程 2 sudo mkdir -p /etc/docker 3 sudo tee /etc/docker/daemon.json <<-'EOF' 4 { 5 "registry-mirrors": ["https://registry-docker.cdnmirror.top"] 6 } 7 EOF 8 9 # 启动服务 10 sudo systemctl enable docker 11 12 sudo systemctl start docker 13 14 # 验证版本 15 sudo docker --version 4.增强配置 1.用户权限配置 1# 添加当前用户到docker组 2sudo usermod -aG docker $USER 3 4# 立即生效需要重新登录 5newgrp docker || true 2.镜像预加载(可选) # 在在线环境提前拉取并打包镜像 docker pull ubuntu:22.04 docker save ubuntu:22.04 > ubuntu.tar # 在离线环境加载 sudo docker load -i ubuntu.tar 5.下载雷池镜像与安装启动服务 创建雷池目录 mkdir -p /data/safeline && cd /data/safeline 下载雷池社区版镜像包 cd /data/safeline 2wget https://demo.waf-ce.chaitin.cn/image.tar.gz 下载compose编排脚本 cd /data/safeline 2wget https://waf-ce.chaitin.cn/release/latest/compose.yaml 加载雷池社区版镜像包 cat image.tar.gz | gzip -d | docker load 配置环境变量 cat > .env <<EOF 2SAFELINE_DIR=/data/safeline 3IMAGE_TAG=latest 4MGT_PORT=9443 5POSTGRES_PASSWORD=$(tr -dc A-Za-z0-9 </dev/urandom | head -c 32) 6SUBNET_PREFIX=172.22.222 7IMAGE_PREFIX=swr.cn-east-3.myhuaweicloud.com/chaitin-safeline 8ARCH_SUFFIX= 9RELEASE= 10REGION= 11EOF 启动雷池服务 docker compose up -d 四、配置与验证 初始化控制台 访问 https://<服务器IP>:9443 ,首次登录需执行命令获取随机密码。 docker exec safeline-mgt resetadmin 添加防护站点 上游服务器配置 :根据业务架构选择(如反向代理至Nginx或直接指向应用服务器)。 证书管理 :上传SSL证书至控制台,支持HTTP自动跳转HTTPS。 防护测试 1 # 模拟攻击验证拦截效果 2 curl "http://<域名>/?id=1%20AND%201=1" # SQL注入测试 3 curl "http://<域名>/?html=<script>alert(1)</script>" # XSS测试 五、常见问题与优化 启动报错处理 unknown shorthand flag: 'd' in -d :升级Docker Compose至2.0+。 镜像加载失败:检查镜像完整性,重新导出加载。 性能调优 资源限制 :通过 docker-compose.yaml 调整容器内存与CPU配额。 日志管理 :挂载外部目录持久化日志,避免磁盘占满。 升级与迁移 离线升级 :替换镜像包后执行 docker compose down && docker compose up -d 。 跨服务器迁移 :备份 /data/safeline 目录,复制至新主机按相同步骤启动。 六、总结 本文基于雷池社区实践整合了雷池WAF离线部署的最优路径,覆盖环境准备、离线包生成、服务配置及故障排查全流程。通过语义分析引擎与轻量级设计,雷池社区版可有效防御OWASP Top 10攻击,适合内网及无外网环境的业务防护。建议定期关注官方更新,结合业务流量调整防护策略。

优秀的个人博客,低调大师

Ollama 介绍,搭建本地 AI 大模型 deepseek,并使用 Web 界面调用

Ollama 是一个基于 Go 语言的本地大语言模型运行框架,类 Docker 产品(支持 list,pull,push,run 等命令),事实上它保留了 Docker 的操作习惯,支持上传大语言模型仓库 (有 deepseek、llama 2,mistral,qwen 等模型,你也可以自定义模型上传)。 在管理模型的同时,它还提供了一些 Api 接口,让你能够像调用 OpenAI 提供的接口那样进行交互。 一、下载安装 Ollama Ollama 支持多平台部署,你可以在官网,选择适合的安装包。 下载地址:https://ollama.com 运行之后,访问 localhost:11434,查看是否正常运行: 二、AI 模型管理 ollama 安装之后,其同时还是一个命令,与模型交互就是通过命令来进行的。 ollama list:显示模型列表。 ollama show:显示模型的信息 ollama pull:拉取模型 ollama push:推送模型 ollama cp:拷贝一个模型 ollama rm:删除一个模型 ollama run:运行一个模型 官方提供了一个模型仓库,https://ollama.com/library, 你可以搜索你想要的模型。 官方建议:应该至少有 8 GB 可用 RAM 来运行 7 B 型号,16 GB 来运行 13 B 型号,32 GB 来运行 33 B 型号。 在这里我选择下载目前最火的开源 deepseek-r1 模型来做演示。模型地址为:https://ollama.com/library/deepseek-r1,因我的电脑有 32G,所以选择了 14b 的模型来调试。 ollama run deepseek-r1:14b 执行命令,如果本地没有该模型,则会先下载模型再运行。首次运行启动可能略慢。 三、简单交互 模型运行之后,会默认进入到交互状态,你可以按下Ctrl + D退出交互,但此时模型并不会退出,仍旧可以正常通过 Api 接口交互。 终端交互示例: 接口请求参考官方文档的介绍API 文档,下边是简单的示例: curl http://localhost:11434/api/generate -d "{\"model\":\"deepseek-r1:14b\", \"prompt\":\"介绍下JeecgBoot是什么项目\", \"stream\": false}" 接口请求支持 stream 模式,上边这个请求响应 10s 左右,如果使用 stream 模式,体验会提升不少。 四、通过 Web 界面调用大模型 这里介绍几个 UI 框架可以直接与 ollama 大模型对接。 项目一 :ollama-webui-lite 项目地址:https://github.com/ollama-webui/ollama-webui-lite 此项目是 open-webui 的简化版,注意需:node >= 16。 git clone https://github.com/ollama-webui/ollama-webui-lite.git cd ollama-webui-lite yarn yarn dev 运行之后,你可以对连接信息进行设置,默认是连接本机的http://localhost:11434/api,如果你也是本机部署,那就不用更改。然后界面选择启动的模型,就可以对话了。 项目二 :lobe-chat 项目地址:https://github.com/lobehub/lobe-chat 这是一个集成多种模型能力的对话聊天 UI,部署简单,界面酷炫。 Docker 部署命令: docker run -itd --name=lobechat -p 3210:3210 registry.cn-hangzhou.aliyuncs.com/jeecgdocker/lobe-chat 如果你是本地 ollama 部署,启动之后,就可以在 web 界面进行交互了。 目前最新版还不支持 deepseek v3,可以先用其他大模型测试下

优秀的个人博客,低调大师

图文结合丨Prometheus+Grafana+GreatSQL性能监控系统搭建指南(上)

一、环境介绍 本文环境,以及本文所采用数据库为GreatSQL 8.0.32-24 $ cat /etc/system-release Red Hat Enterprise Linux Server release 7.9 (Maipo) $ uname -a Linux gip 3.10.0-1160.el7.x86_64 #1 SMP Tue Aug 18 14:50:17 EDT 2020 x86_64 x86_64 x86_64 GNU/Linux $ ldd --version ldd (GNU libc) 2.17 二、手动安装 0.简单介绍 Prometheus Server : 用于收集和存储时间序列数据。 Client Library : 客户端库,为需要监控的服务生成相应的 metrics 并暴露给 Prometheus server。当Prometheus server 来 pull 时,直接返回实时状态的 metrics。 Push Gateway : 主要用于短期的 jobs。由于这类 jobs 存在时间较短,可能在 Prometheus 来 pull 之前就消失了。为此,这次 jobs 可以直接向 Prometheus server 端推送它们的 metrics。这种方式主要用于服务层面的metrics,对于机器层面的 metrices,需要使用 node exporter。 Exporters : 用于暴露已有的第三方服务的 metrics 给 Prometheus。 Alertmanager : 从 Prometheus server 端接收到 alerts 后,会进行去除重复数据,分组,并路由到对收的接收方式,发出报警。常见的接收方式有:电子邮件,pagerduty,OpsGenie, webhook 等。 网上介绍很多这里就不再过多介绍了 1.安装Prometheus 官网下载最新二进制安装包➥ https://prometheus.io/download/ 可以看到有很多的版本,这里选择LTS的版本,LTS在软件版本中通常表示Long Term Support,即长期支持版本,对于Prometheus来说,LTS版本表示这个版本会获得更长期的支持和维护,而非LTS版本则更新频繁,新特性来得快,但稳定性和支持周期较短,所以在追求稳定的生产环境中,建议优先考虑使用LTS长期支持版本。 这里选择二进制软件包prometheus-2.45.0.linux-amd64.tar.gz $ mkdir /usr/local/prometheus $ cd /usr/local/prometheus $ wget https://github.com/prometheus/prometheus/releases/download/v2.45.0/prometheus-2.45.0.linux-amd64.tar.gz 下载完成后,用sha256sum校验一下安装包,没问题的话解压即可 $ sha256sum prometheus-2.45.0.linux-amd64.tar.gz 1c7f489a3cc919c1ed0df2ae673a280309dc4a3eaa6ee3411e7d1f4bdec4d4c5 $ tar xvf prometheus-2.45.0.linux-amd64.tar.gz 建议使用systemctld来管理守护进程Prometheus服务 若文件路径或名字和本文不同记得修改 $ vi /lib/systemd/system/prometheus.service [Unit] Description=Prometheus server Documentation=https://prometheus.io/docs/introduction/overview/ After=network-online.target [Service] Type=simple User=root Group=root Restart=on-abnormal ExecStart=/usr/local/prometheus/prometheus-2.45.0.linux-amd64/prometheus \ --config.file=/usr/local/prometheus/prometheus-2.45.0.linux-amd64/prometheus.yml \ --storage.tsdb.path=/usr/local/prometheus/prometheus-2.45.0.linux-amd64/data \ --storage.tsdb.retention.time=60d \ --web.enable-lifecycle [Install] WantedBy=multi-user.target 使用$ ./prometheus -h 就可以看到帮助信息 通知systemd重新加载配置文件 $ systemctl daemon-reload 以下为相关systemd命令 $ systemctl enable prometheus.service # 设置为开机自启动 $ systemctl disable prometheus.service # 如果不想设置为开机自启动,可以关闭 $ systemctl start prometheus.service # 开启服务 $ systemctl status prometheus.service # 查看状态 $ systemctl restart prometheus.service # 重启服务 $ systemctl stop prometheus.service # 停止服务 启动Prometheus server,并查看是否启动成功active (running) $ systemctl start prometheus.service $ systemctl status prometheus.service ● prometheus.service - Prometheus server Loaded: loaded (/usr/lib/systemd/system/prometheus.service; disabled; vendor preset: disabled) Active: active (running) since 三 2023-09-06 16:14:34 CST; 2s ago Docs: https://prometheus.io/docs/introduction/overview/ Main PID: 21472 (prometheus) CGroup: /system.slice/prometheus.service └─21472 /usr/local/prometheus/prometheus-2.45.0.linux-amd64/prometheus --config.file=/usr/local/prometheus/prometheus-2.45.0.linux-amd64/prometheus.yml --storage.tsdb.path=/usr/local/pr... #下方省略 若启动失败可自行排查 $ journalctl -u prometheus.service -f 访问地址: 名称 地址 prometheus http://172.17.137.104:9090/ 监控指标 http://172.17.137.104:9090/metrics 界面如下: 安装完成Prometheus,接下来安装Alertmanager 2.安装Alertmanager 官网下载➥ https://prometheus.io/download/ 这里我们选择alertmanager-0.26.0.linux-amd64.tar.gz $ cd /usr/local/prometheus $ wget https://github.com/prometheus/alertmanager/releases/download/v0.26.0/alertmanager-0.26.0.linux-amd64.tar.gz 下载完成后,用sha256sum校验一下安装包,没问题的话解压即可 $ sha256sum alertmanager-0.26.0.linux-amd64.tar.gz abd73e2ee6bf67d3888699660abbecba7b076bf1f9459a3a8999d493b149ffa6 $ tar xvf alertmanager-0.26.0.linux-amd64.tar.gz 建议使用Systemd来管理守护进程Alertmanager服务 若文件路径或名字,和下方示例不同记得修改 $ vi /lib/systemd/system/alertmanager.service [Unit] Description=Alert Manager Wants=network-online.target After=network-online.target [Service] Type=simple User=root Group=root Restart=always ExecStart=/usr/local/prometheus/alertmanager-0.26.0.linux-amd64/alertmanager \ --config.file=/usr/local/prometheus/alertmanager-0.26.0.linux-amd64/alertmanager.yml \ --storage.path=/usr/local/prometheus/alertmanager-0.26.0.linux-amd64/data [Install] WantedBy=multi-user.target 通知systemd重新加载配置文件 $ systemctl daemon-reload 启动alertmanager.service $ systemctl start alertmanager.service 若启动失败可自行排查journalctl -u alertmanager.service -f 访问地址 应用名称 地址 Alertmanager http://172.17.137.104:9093/ Alertmanager界面如下 添加Prometheus配置 因为我们安装了Alertmanager,所以需要添加到Prometheus里面 $ vi /usr/local/prometheus/prometheus-2.45.0.linux-amd64/prometheus.yml 把# - alertmanager:9093修改为localhost:9093 因为我们是装在同一个机器上,所以是localhost,若安装不在同一个机器上请修改为正确IP地址 # Alertmanager configuration alerting: alertmanagers: - static_configs: - targets: - localhost:9093 <--修改这里,注意缩进 注意!yml文件是有缩进格式的,修改时不要打乱原有格式 在rule_files:添加- "alert.yml",前面缩进只需保留两格! # Load rules once and periodically evaluate them according to the global 'evaluation_interval'. rule_files: - "alert.yml" <--添加这里,注意缩进2格即可 # - "first_rules.yml" # - "second_rules.yml" 增加触发器配置文件 编辑新文件alert.yml添加以下内容,注意格式缩进 $ vi /usr/local/prometheus/prometheus-2.45.0.linux-amd64/alert.yml groups: - name: Prometheus alert rules: # 任何实例超过30s无法联系的情况发出告警 - alert: 服务告警 expr: up == 0 for: 30s labels: severity: critical annotations: instance: "{{ $labels.instance }}" description: "{{ $labels.job }} 服务已关闭" 检查一下配置文件,与下方一致即为成功 $ cd /usr/local/prometheus/prometheus-2.45.0.linux-amd64 $ ./promtool check config prometheus.yml Checking prometheus.yml SUCCESS: 1 rule files found SUCCESS: prometheus.yml is valid prometheus config file syntax Checking alert.yml SUCCESS: 1 rules found 接下来重启一下Prometheus或重新加载配置文件 $ systemctl restart prometheus # 二选一即可 $ curl -X POST http://localhost:9090/-/reload 再次访问http://172.17.137.104:9093/,并检查Status,确认没有问题 3.安装Grafana 官网下载Grafana➥https://grafana.com/grafana/download 进入官网后选择Linux,下方会展示出安装方式,这里选择二进制的方式安装 $ wget https://dl.grafana.com/enterprise/release/grafana-enterprise-10.1.1.linux-amd64.tar.gz $ tar -zxvf grafana-enterprise-10.1.1.linux-amd64.tar.gz 创建 Systemd 服务 $ vi /lib/systemd/system/grafana-server.service [Unit] Description=Grafana server Documentation=https://doce.grafana.org [Service] Type=simple User=root Group=root Restart=on-abnormal ExecStart=/usr/local/prometheus/grafana-10.1.1/bin/grafana-server \ --config=/usr/local/prometheus/grafana-10.1.1/conf/defaults.ini \ --homepath=/usr/local/prometheus/grafana-10.1.1 [Install] WantedBy=multi-user.target 通知 Systemd 重新加载配置文件 $ systemctl daemon-reload 启动grafana-server.service $ systemctl start grafana-server.service 若启动失败可自行排查journalctl -u grafana-server.service -f 访问地址 应用名称 地址 Grafana http://172.17.137.104:3000/ 没问题安装成功! 4.安装node_exporter 下载node_exporter➥ https://prometheus.io/download/ 下拉网页找到node_exporter选择对应文件名下载即可 $ wget https://github.com/prometheus/node_exporter/releases/download/v1.6.1/node_exporter-1.6.1.linux-amd64.tar.gz #验证一下是否下载完整 $ sha256sum node_exporter-1.6.1.linux-amd64.tar.gz $ tar -xvf node_exporter-1.6.1.linux-amd64.tar.gz 创建 Systemd 服务 $ vi /lib/systemd/system/node_exporter.service [Unit] Description=node_exporter Documentation=https://prometheus.io/ After=network.target [Service] Type=simple User=root Group=root Restart=on-abnormal ExecStart=/usr/local/prometheus/node_exporter-1.6.1.linux-amd64/node_exporter [Install] WantedBy=multi-user.target 通知 Systemd 重新加载配置文件 $ systemctl daemon-reload 启动alertmanager.service $ systemctl start node_exporter.service 若启动失败可自行排查journalctl -u node_exporter.service -f node_exporter访问地址: 应用名称 地址 node_exporter http://172.17.137.104:9100/metrics 添加Prometheus配置 安装完成后还需要添加Prometheus配置,为避免大家打错,这里采用追加写入 $ cat >> /usr/local/prometheus/prometheus-2.45.0.linux-amd64/prometheus.yml <<"EOF" # 在scrape_configs这行下面添加配置 - job_name: "node-exporter" scrape_interval: 15s static_configs: - targets: ["localhost:9100"] labels: instance: prometheus服务器 EOF 重载Prometheus配置 $ curl -X POST http://localhost:9090/-/reload Prometheus web上检查一下 http://172.17.137.104:9090/,点击Status->Targets 可以看到有node_exporter,以及可以检查下我们配置的触发器Alerts->勾选Inactive 至此,通过二进制安装Prometheus就到此完成! 三、使用Grafana 1. 添加Prometheus数据源 我们可以进入Grafana对监控的内容做一个图形的展示,登入http://172.17.137.104:3000/ 输入默认用户名admin,默认密码admin,之后会提示你修改密码,然后就成功登入Grafana 进入后添加Prometheus的数据源,在Connections里有Data sources,总之找到Data sources即可 点击Add data source选择Prometheus,进入配置 在红框处填写Prometheus地址,因为本文部署在本机,所以是localhost,填写完成后滑动页面到最下方,点击Save & test保存和测试 2.导入Grafana仪表盘 下载Grafana仪表盘➥https://grafana.com/grafana/dashboards/ 红框框起来的就是我们需要下载的Node Exporter Full,如果首页没有展示的话,可以直接搜索 点击进去,选择Copy ID to clipboard复制ID 进入http://172.17.137.104:3000/到Grafana上,选择Dashboards,点击New 选择Import 在红框处粘贴刚刚复制的,其实也就是1860,接着点击LOAD加载 可以修改一下名字,在选择下Prometheus点击Import导入即可 这样就完成了Grafana对Prometheus数据的展示 四、监控GreatSQL 不建议采用GreatSQL的root用户监控,因为root的权限非常大,所以我们进入GreatSQL先创建一个用于监控的用户 greatsql> CREATE USER 'exporter'@'localhost' IDENTIFIED BY 'GreatSQL@666'; greatsql> GRANT PROCESS,REPLICATION CLIENT,SELECT ON *.* TO 'exporter'@'localhost'; 接下来需要安装mysqld_exporter,本文依旧采用二进制方式安装 在[点击此处下载https://prometheus.io/download/中找到mysqld_exporter,下载即可 $ wget https://github.com/prometheus/mysqld_exporter/releases/download/v0.15.0/mysqld_exporter-0.15.0.linux-amd64.tar.gz #验证一下是否下载完整 $ sha256sum mysqld_exporter-0.15.0.linux-amd64.tar.gz $ tar -xvf mysqld_exporter-0.15.0.linux-amd64.tar.gz 创建一个连接数据库的文件.mysqld_exporter.cnf $ vi /usr/local/prometheus/mysqld_exporter-0.15.0.linux-amd64/.mysqld_exporter.cnf #填入以下内容即可 [client] user=exporter password=GreatSQL@666 host=localhost port=3306 创建 Systemd 服务 $ vi /lib/systemd/system/mysqld_exporter.service [Unit] Description=Prometheus GreatSQL After=network.target [Service] Type=simple User=root Group=root Restart=always ExecStart=/usr/local/prometheus/mysqld_exporter-0.15.0.linux-amd64/mysqld_exporter \ --config.my-cnf=/usr/local/prometheus/mysqld_exporter-0.15.0.linux-amd64/.mysqld_exporter.cnf \ --collect.global_status \ --collect.auto_increment.columns \ --collect.info_schema.processlist \ --collect.binlog_size \ --collect.info_schema.tablestats \ --collect.global_variables \ --collect.info_schema.innodb_metrics \ --collect.info_schema.query_response_time \ --collect.info_schema.userstats \ --collect.info_schema.tables \ --collect.perf_schema.tablelocks \ --collect.perf_schema.file_events \ --collect.perf_schema.eventswaits \ --collect.perf_schema.indexiowaits \ --collect.perf_schema.tableiowaits \ --collect.slave_status \ --collect.perf_schema.replication_group_members \ --collect.perf_schema.replication_group_member_stats \ --web.listen-address=0.0.0.0:9104 [Install] WantedBy=multi-user.target 通知 Systemd 重新加载配置文件 $ systemctl daemon-reload 启动alertmanager.service $ systemctl start mysqld_exporter.service 若启动失败可自行排查journalctl -u mysqld_exporter.service -f 访问一下看看能否成功http://172.17.137.104:9104 1.添加Prometheus配置 安装完成后还需要添加Prometheus配置,为避免大家打错,这里采用追加写入 $ cat >> /usr/local/prometheus/prometheus-2.45.0.linux-amd64/prometheus.yml <<"EOF" # mysqld-exporter配置 - job_name: "mysqld-exporter" static_configs: - targets: ["localhost:9104"] labels: instance: prometheus服务器 EOF 重载Prometheus配置 $ curl -X POST http://localhost:9090/-/reload Prometheus web上检查一下 http://172.17.137.104:9090/,点击Status->Targets 2.增加触发器配置文件 编辑prometheus.yml在rule_files:添加- "alert.yml",前面缩进只需保留两格! $ vi /usr/local/prometheus/prometheus-2.45.0.linux-amd64/prometheus.yml # Load rules once and periodically evaluate them according to the global 'evaluation_interval'. rule_files: - "alert.yml" - "rules/*.yml" <-添加这里,注意缩进2格即可 # - "first_rules.yml" # - "second_rules.yml" 表示把rules文件夹下的所有yml文件都导入进来 $ mkdir /usr/local/prometheus/prometheus-2.45.0.linux-amd64/rules $ vi /usr/local/prometheus/prometheus-2.45.0.linux-amd64/rules/mysqld.yml groups: - name: GreatSQL rules: # 任何实例超过30s无法联系的情况发出告警 - alert: GreatSQLDown expr: mysql_up == 0 for: 30s labels: severity: critical annotations: summary: "GreatSQL Down,实例:{{ $labels.instance }}" description: "连接不上GreatSQL了,当前状态为:{{ $value }}" 类似的告警信息都可以自行编写 检查一下配置文件,出现SUCCESS: prometheus.yml is valid prometheus config file syntax即为成功 $ cd /usr/local/prometheus/prometheus-2.45.0.linux-amd64 $ ./promtool check config prometheus.yml Checking prometheus.yml SUCCESS: 2 rule files found SUCCESS: prometheus.yml is valid prometheus config file syntax Checking alert.yml SUCCESS: 1 rules found Checking rules/mysqld.yml SUCCESS: 1 rules found 接下来重启一下 Prometheus 或重新加载配置文件 $ systemctl restart prometheus # 二选一即可 $ curl -X POST http://localhost:9090/-/reload 再次访问http://172.17.137.104:9093/,并检查Status,确认没有问题 3.导入Grafana仪表盘 展示 Prometheus 从 mysql_exporter 收集到的数据,添加仪表盘ID7362 修改名称后点击Import即可 可以看到页面中已经展示了许多内容,例如GreatSQL数据库运行的时间,QPS值,InnoDB Buffer Pool Size,Buffer Poll of Total RAM等 这里Buffer Poll of Total RAM值有些低,说明设置的InnoDB buffer pool大小不对,应该设置约占用总内存的50%到75%,这样可以合理利用内存,提高缓存命中率。 来简单看几个监控项目的意义和内容 MySQL Connections,监控GreatSQL的连接数,有最大连接数及最大使用连接数 MySQL Client Thread Activity,监控GreatSQL的活动线程数,有连接线程数(Threads Connected)和运行线程数(Threads Running) MySQL Table Locks,监控GreatSQL的表锁,我们可以看到GreatSQL从存储引擎请求了多少表级锁。在InnoDB的情况下,很多时候锁实际上可能是行锁,因为它只在少数特定情况下使用表级锁。比较“立即锁定”和“等待锁定”最有用。如果等待的锁数正在上升,则表示存在锁争用。否则,锁立即上升和下降是正常活动。 来查看下QPS是如何监控的,鼠标移动到内容的右上角,会出现三个点,点击Edit,进入编辑 可以看到如下内容 这段监控规则中使用了rate()和irate()函数来计算GreatSQL queries状态计数器的速率。 mysql_global_status_queries{instance="$host"} 表示提取实例$host的queries全局状态计数器。 rate()函数计算该计数器在$interval时间段内的每秒速率。 irate()函数计算该计数器在最近5分钟的每个瞬时速率。 或运算符表示取这两者中的较大值。 如果觉得你想监控的内容没有你想要的,可以点击右上角Add,点击Visualization添加监控内容 例如我想添加一个group_replication_flow_control_countMGR累计触发流控的次数,在Select metric中搜索想监控的状态, label标签 Label filters用于过滤和选择时间序列数据。它可以针对特定的标签值来选择显示哪些时间序列。 例如instance="192.168.1.1:9090"表示只选择instance标签值为"192.168.1.1:9090"的时间序列。 可以在Grafana的面板中使用Label filters字段来指定过滤条件,其作用主要包括: 选择特定实例的数据:如instance="A" 只看实例A的数据 查看特定模式匹配的实例:如instance=~"10\\.8\\..*"选取符合模式的实例 查看某个状态的序列:state="200" 只看状态码为200的 组合多个标签进行过滤: instance=~"1\\d\\.8\\..*",state!="500" 也可以直接输入PromQL进行各种复杂过滤 Operations Operations选项允许对查询结果进行各种操作,常用的操作及含义如下: Rate:计算计数器的增长速率,常用于计数器指标的速率转换,如QPS。 Delta:计算时间序列的增量变化值。 Derivative:计算时间序列的一阶导数,表示瞬时变化率。 Integral:对时间序列求积分,计算面积图。 Aggregation:对结果series做聚合,如平均,最大最小值等。 Transform:进行数学变换,如log等。 Aliasing:结果串进行重命名。 Group by:分组归类。 我们可以选中Metric后,在Operations下拉列表中选择所需要的计算操作。这些操作无需修改PromQL查询语句,在结果集上进行,可以方便地衍生出新的时间序列。例如可以将 COUNTER 计数器转换为 QPS 速率等。这为Grafana提供了灵活的统计和分析能力。 添加完成参数后点击Apply应用即可,回到界面上就可以看到刚刚添加的监控项了 记得要对整个仪表盘也保存,点击右上角图标如下所示,保存即可 也可以对表的情况进行监控,只需导入仪表盘ID9625 至此,通过Prometheus监控GreatSQL到此结束,下部文章将介绍如何使用告警功能 使用Prometheus并不太好监控GreatSQL的MGR,推荐还是使用PMM来监控 欢迎阅读《使用PMM图形化监控MySQL MGR动态》https://mp.weixin.qq.com/s/8v94kxczl5m0MFcp_Dm87w 相关文章: 技术分享 | Prometheus+Grafana监控MySQL浅析➥https://mp.weixin.qq.com/s/Y8YHE7_oBPIfceV8HVywtw Prometheus+Grafana+钉钉部署一个单机的MySQL监控告警系统➥https://mp.weixin.qq.com/s/vck-uD2mmZSQ-RvzU9b0ug Enjoy GreatSQL :) 关于 GreatSQL GreatSQL是适用于金融级应用的国内自主开源数据库,具备高性能、高可靠、高易用性、高安全等多个核心特性,可以作为MySQL或Percona Server的可选替换,用于线上生产环境,且完全免费并兼容MySQL或Percona Server。 相关链接: GreatSQL社区 Gitee GitHub Bilibili GreatSQL社区: 社区有奖建议反馈: https://greatsql.cn/thread-54-1-1.html 社区博客有奖征稿详情: https://greatsql.cn/thread-100-1-1.html (对文章有疑问或者有独到见解都可以去社区官网提出或分享哦~) 技术交流群: 微信&QQ群: QQ群:533341697 微信群:添加GreatSQL社区助手(微信号:wanlidbc )好友,待社区助手拉您进群。

优秀的个人博客,低调大师

在元宇宙中搭建语聊房,设计思路和实现方法分享

目标 1. 制定目标 不妨大家想一下这个场景: 你走进一个咖啡厅,看到了一个美女或者帅哥,想要一个微信号,方便后续发展。 那我们要怎么做呢? 走到对方跟前,小声对他说:“你好,你长的很像我的前女友(前男友),可以加下你的微信吗?”。 对方有可能悄声的说,“我扫你”。 你这个时候你就需要把你的二维码展示给他。 当你们恋爱成功,求婚的时候,可能要找一个更加浪漫的环境,并且你们的对话希望给更多人看到、听到。 通过这个上面场景的想象,我们可以简单的确定一些基本的要素 可以更改的场景 (咖啡厅和求婚现场) 自主塑造形象功能(毕竟外貌是一见钟情的原点) 单聊 (要微信号不能一次要一群人得呀。不然可能被当成流氓给打得哟) 文件共享 (把自己得二维码展示给对方,让对方加好友) 群聊、群视频 (把求婚现场给其他用户看) 2. 拆解目标 为了满足上面提到得要求,我们需要以下功能: 支持unity的方便接入。毕竟unity是一个非常好的3D引擎,如果可以方便接入得话,在后续得场景创建和人物创造上都可以有更大的扩展空间 1 vs 1的视频,或者 1 vs 多的直播模式。可以满足单聊和群聊的需求 同步本地播放的本地视频或者远端视频给其他用户。可以满足共享二维码的需求。 3. 效果预览 如果要完整的实现一个完整的项目会花费比较多的时间,而我发现目前声网的 Demo 会提供简单的人物模型和素材,但是他们开放度较高,开发者可以根据需要使用自己定制化的模型素材,为了实现上述提到的需求,我只做了一些微小的修改,就满足了我们的需求。本次主要看下效果,为后续在生产环境中落地做一些技术上的储备。 以下是在demo上调整后显示出来的效果。 这是用unity来实现的一个咖啡厅的样子 这是一个服装店,我们可以给人物进行换装,这个也是由unity来实现的。 以上两个的接入都非常的方便,我们可以很好的对接unity,如果需要的话,后续有自己的unity场景也可以快速接入。 这个是我自己测试的1 vs 1的视频测试效果 这个是我自己测试的将本地视频分享给对方的一个效果 想象一下,是不是可以和你的对象一起看剧了呢? 简单实现 以上效果都是基于声网的sdk来实现的,如果你也想进行尝试或者使用,可以继续查看我的接入过程和中间遇到的问题以及解决方案。 1. 账号准备 我们既然使用了声网的sdk,那注册一个声网的账号做一些声网的账号配置也很合理吧。 注册账号 完成实名 创建项目 配置项目 然后进入详细配置 生成token,并将appid、证书、token复制保存。 注意!!!这里很重要,一定要看仔细,项目中会使用到! 至此,账号的准备已经完成了。 2. 配置项目 demo源码 通过声网官网客服,申请元宇宙 SDK、Unity工程文件、开发指南,同时申请开通使用权限,详情可访问 shengwang.cn 将sdk解压并配置到项目中 一定要注意目录,如果自己的项目中不存在当前的目录要自己创建 配置id一般情况下,这个文件是不会上传到远程仓库的,写到这里也主要是安全考虑。将在后台中申请的appid、证书,复制后粘贴到/Android/local.properties里面,如下: 配置channel 将在后台生成token的时候,填写的channel给写到类中,如下 配置项目权限 <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.BLUETOOTH" /> <!-- 对于 Android 12.0 及以上设备,还需要添加如下权限: --> <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" /> 注意: Manifest.permission.RECORD_AUDIO, Manifest.permission.CAMERA 需要动态申请权限,否则无法正常完成视频功能。 sdk本身是不会去申请权限的,所以需要我们自己在合适的位置帮sdk申请好权限。 混淆配置 咖啡厅 做形象 服装店 这里是直接使用了声网给的效果,如果自己项目需要的话,可以去自己去调整。 其中换装和捏脸都需要unity上的一些修改和native与unity的通信。整个可以参考换装和捏脸 3. 视频1vs1 前面已经完成了整体项目的构建。并且已经把unity内容跑起来了,那么接下来我们看下,如果要实现 1vs1的视频要怎么处理。为了方便处理,我单独写了一个页面来处理视频1vs1,效果如下: 视频聊天 这个流程图,建议大家多看几遍,在我们遇到问题的时候,这个图会给我们启发,帮助我们解决问题。 详细流程: 1. 创建RtcEngine对象 该对象管理了整个的视频等场景,是一个非常核心的对象。 try { RtcEngineConfig config = new RtcEngineConfig(); config.mContext = getBaseContext(); config.mAppId = appId; config.mEventHandler = mRtcEventHandler; config.mAudioScenario = Constants.AudioScenario.getValue(Constants.AudioScenario.DEFAULT); mRtcEngine = RtcEngine.create(config); } catch (Exception e) { throw new RuntimeException("Check the error."); } 2. 创建RtcEngine属性 // 视频默认禁用,你需要调用 enableVideo 启用视频流。 mRtcEngine.enableVideo(); // 录音默认禁用,你需要调用 enableAudio 启用录音。 mRtcEngine.enableAudio(); // 开启本地视频预览。 mRtcEngine.startPreview(); 3. 将本地摄像头内容显示到local_video_view_container上 FrameLayout container = findViewById(R.id.local_video_view_container); // 创建一个 SurfaceView 对象,并将其作为 FrameLayout 的子对象。 SurfaceView surfaceView = new SurfaceView (getBaseContext()); container.addView(surfaceView); // 将 SurfaceView 对象传入声网,以渲染本地视频。 mRtcEngine.setupLocalVideo(new VideoCanvas(surfaceView, VideoCanvas.RENDER_MODE_FIT, KeyCenter.RTC_UID)); 4. 设置当前的模式 ChannelMediaOptions options = new ChannelMediaOptions(); // 将用户角色设置为 BROADCASTER。 options.clientRoleType = Constants.CLIENT_ROLE_BROADCASTER; // 视频通话场景下,设置频道场景为 BROADCASTING。 options.channelProfile = Constants.CHANNEL_PROFILE_LIVE_BROADCASTING; 其中clientRoleType有两种,如果是CLIENT_ROLE_BROADCASTER就是可以播和收,如果是CLIENT_ROLE_AUDIENCE就只能收看,当前就成了主播模式。 5. 加入频道 // 使用临时 Token 加入频道。 // 你需要自行指定用户 ID,并确保其在频道内的唯一性。 int res = mRtcEngine.joinChannel(token, channelName, KeyCenter.RTC_UID, options); if (res != 0) { // Usually happens with invalid parameters // Error code description can be found at: // en: https://docs.agora.io/en/Voice/API%20Reference/java/classio_1_1agora_1_1rtc_1_1_i_rtc_engine_event_handler_1_1_error_code.html // cn: https://docs.agora.io/cn/Voice/API%20Reference/java/classio_1_1agora_1_1rtc_1_1_i_rtc_engine_event_handler_1_1_error_code.html Log.e("video","join err:"+RtcEngine.getErrorDescription(Math.abs(res))); } joinChannel方法有返回值,可以看到我们加入频道是否成功了,如果不成功的话,我们可以看下错误原因,并对照解决;如果成功了,就可以观察IRtcEngineEventHandler对象的回调方法,重点关注下 onError(int err) 和onJoinChannelSuccess(String channel, int uid, int elapsed) 如果收到 onJoinChannelSuccess方法的回调,我们就可以关注 onUserJoined(int uid, int elapsed) 方法,我们可以在这个方法里开始显示远端内容。 6. 显示远端内容 @Override // 监听频道内的远端主播,获取主播的 uid 信息。 public void onUserJoined(int uid, int elapsed) { Log.e(TAG, "onUserJoined->" + uid); runOnUiThread(new Runnable() { @Override public void run() { // 从 onUserJoined 回调获取 uid 后,调用 setupRemoteVideo,设置远端视频视图。 setupRemoteVideo(uid); } }); } private void setupRemoteVideo(int uid) { FrameLayout container = findViewById(R.id.remote_video_view_container); SurfaceView surfaceView = new SurfaceView (getBaseContext()); surfaceView.setZOrderMediaOverlay(true); container.addView(surfaceView); mRtcEngine.setupRemoteVideo(new VideoCanvas(surfaceView, VideoCanvas.RENDER_MODE_FIT, uid)); } 最终,远端的视频会显示在 remote_video_view_container 上。 4. 将本地播放的视频显示给远端用户 同步本地播放给远端 将本地视频怎么同步给远端的用户呢?其实从本质上来讲,将本地摄像头和将本地播放的视频给远端用户看,对远端用户都是一样的,不一样的是本地用户给远端用户的数据源是哪个。一个是摄像头,一个是播放器。 设置本地video的时候做下修改 FrameLayout container = findViewById(R.id.local_video_view_container); // 创建一个 SurfaceView 对象,并将其作为 FrameLayout 的子对象。 SurfaceView surfaceView = new SurfaceView (getBaseContext()); container.addView(surfaceView); // 将 SurfaceView 对象传入声网,以渲染本地视频。 VideoCanvas videoCanvas = new VideoCanvas(surfaceView, Constants.RENDER_MODE_HIDDEN, Constants.VIDEO_MIRROR_MODE_AUTO, Constants.VIDEO_SOURCE_MEDIA_PLAYER, mediaPlayer.getMediaPlayerId(), KeyCenter.RTC_UID); mRtcEngine.setupLocalVideo(videoCanvas); 在int res = mRtcEngine.joinChannel(token, channelName, KeyCenter.RTC_UID, options);是0的时候,调用如下方法: int res = mRtcEngine.joinChannel(token, channelName, KeyCenter.RTC_UID, options); if (res != 0) { // Usually happens with invalid parameters // Error code description can be found at: // en: https://docs.agora.io/en/Voice/API%20Reference/java/classio_1_1agora_1_1rtc_1_1_i_rtc_engine_event_handler_1_1_error_code.html // cn: https://docs.agora.io/cn/Voice/API%20Reference/java/classio_1_1agora_1_1rtc_1_1_i_rtc_engine_event_handler_1_1_error_code.html Log.e("video","join err:"+RtcEngine.getErrorDescription(Math.abs(res))); }else { mediaPlayer = mRtcEngine.createMediaPlayer(); mediaPlayer.registerPlayerObserver(this); mediaPlayer.open(MetaChatConstants.VIDEO_URL, 0); } 3.监听onPlayerStateChanged回调并在state是PLAYER_STATE_OPEN_COMPLETED的时候执行play方法,代码如下: public void onPlayerStateChanged(io.agora.mediaplayer.Constants.MediaPlayerState state, io.agora.mediaplayer.Constants.MediaPlayerError error) { if(state == io.agora.mediaplayer.Constants.MediaPlayerState.PLAYER_STATE_OPEN_COMPLETED){ mediaPlayer.play(); } } 至此,就完成了功能上的使用。 其它功能 除了上面提到的功能外,声网还提供了一些其他的功能,在需要的时候可以直接使用,或者少量修改就可以用的。 比如说空间音效功能,该功能基于声学原理,模拟声音在不同空间环境中的传播、反射、吸收效果。可以为用户提供旅游中路人聊天声、海浪声、风声等,让用户更沉浸式体验 再比如说实时共赏影音功能。该功能可以几乎无延时的实现,远程观影、听歌等功能。甚至可以实现k歌的能力。 更多的功能期待大家一起发掘! 参考资料 注册声网账号 声网官网 SDK下载 快速开始 - 实现音视频通话 媒体播放器

优秀的个人博客,低调大师

Sa-Token v1.29.0 更新,轻松搭建 OAuth2.0 服务

Sa-Token 是一个轻量级 Java 权限认证框架,主要解决:登录认证、权限认证、分布式 Session 会话、单点登录、OAuth2.0 等一系列权限相关问题。 框架针对踢人下线、自动续签、前后台分离、分布式会话……等常见业务进行N多适配,通过 Sa-Token,你可以以一种极简的方式实现系统的权限认证部分 Sa-Token v1.29.0 版本更新包括以下内容: 升级:sa-token-jwt插件可在登录时添加额外数据。 重构:优化Dubbo调用时向下传递Token的规则,可避免在项目启动时由于Context无效引发的bug。 重构:OAuth2 授权模式开放由全局配置和Client单独配置共同设定。 重构:OAuth2 模块部分属性支持每个 Client 单独配置。 重构:OAuth2 模块部分方法名修复单词拼写错误:converXxx -> convertXxx。 重构:修复 OAuth2 模块deleteAccessTokenIndex回收 token 不彻底的bug。 新增:OAuth2 模块新增pastClientTokenTimeout,用于指定 PastClientToken 默认有效期。 文档:常见报错章节增加目录树,方便查阅。 文档:优化文档样式。 新增:新增 BCrypt 加密。 修复:修复StpUtil.getLoginIdByToken(token) 在部分场景下返回出错的bug。 重构:优化OAuth2模块密码式校验步骤。 新增:新增Jackson定制版Session,避免timeout属性的序列化。 新增:SaLoginModel新增setToken方法,用于预定本次登录产生的Token。 新增:新增 StpUtil.createLoginSession() 方法,用于无Token注入的方式创建登录会话。 新增:OAuth2 与 StpUtil 登录会话数据互通。 新增:新增StpUtil.renewTimeout(100);方法,用于 Token 的 Timeout 值续期。 修复:修复默认dao实现类中updateObject无效的bug 完善:完善单元测试。 代码仓库:https://gitee.com/dromara/sa-token 框架功能结构图

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册