基于容器环境的1-1课堂的开发部署

申屠鹏会

2020 年 11 月 05 日

基于容器环境的1-1课堂的开发部署

近年来,容器化已经是业界的共识了,不仅可以减少运维的成本,也有助于进行产品的快速迭代,同时,本地也可以利用容器,搭建出和生产几乎一样的环境,很方便的进行开发 demo 或者进行小功能的测试部署。接下来,我将从产品的需求分析,设计,业务编码,集成测试,到正式上线,利用声网强大的 SDK,全程用容器化的思想,完成一个一对一课堂软件的开发。(因为资源关系,开发时候的容器环境只用 Docker,而非 k8S)。

项目介绍

疫情以来,传统的一对一家教已经很难实现了,利用网络进行视频教学逐渐成为主流,但是现有的腾讯会议,ZOOM,小鱼会议等平台,侧重点还是多人视频会议的场景,对于一对一辅导教学还是有所欠缺的。因此,希望开发一个能够支持学生和老师实时音频互动,实时文字沟通,白板,课堂回放,作业布置,批改,屏幕共享的 1 对 1 课堂教学软件。

需求分析

一般通过项目介绍,可以大致知道是一个怎么样的产品。如:产品的形态是什么,用户是什么,主要功能是什么。那么在需求分析阶段,就要细化,归类,取舍。在一般的互联网公司,经常有的还有需求评审,有了需求,能不能实现,能不能按时完成,都是需要考虑的。但是现在我们自己做 demo 的化,最简单的还是画一个思维导图,把功能分成几个模块,列一下优先级就行了。接下来就是对项目介绍的需求分析。首先,我们明确产品的形态,对于教学软件来说,最方便的就是 Web 端了,只要打开浏览器,配备一个有摄像头的电脑就可以开始学习,手机总归小了一点。然后根据介绍,一对一的教学意味着还有用户管理的功能。除此之外,最重要的就是课堂功能了,老师能够在课堂给学生讲课,录视频,共享桌面等功能,同时还需要和学生进行沟通,布置作业,因此还需要消息通知等功能。

那么经过以上分析,我们先做一个思维导图,重点是功能分类。如下



经过分析总结,发现总共分为四个模块,分别是课堂管理,用户管理,白板功能,实时音视频,根据需求分析,就可以开始进行下一步的技术选型了。

技术选型

现在的技术有很多,光编程语言就有几十种,每种语言都有自己的框架,通信协议也有各种 RPC,那么技术选型其实就是从广泛的技术海中选取最适合自己需求的技术,需要注意的是,技术选型从来不是以技术稳定或者技术先进为标准的,而是应该找最适合的。由此,我们开始进行技术的选型。通常我会从底层开始选取,下面我制作了一个表格,以供参考。


有了大致的技术选型之后,接下去就是进行架构设计。

架构设计

由于功能较少,服务大致分成了Redis缓存,Mysql数据库,后端服务,前端服务,以及网关五个服务。架构图画的比较丑,如下:


声网有个更好看的图片,我也放上来:


对比着看的化,声网的更加细化,尤其AgoraEdu云服务提供了不少功能,但我们自己开发的时候,用自己的服务器,那需要干的事情还是有点多的。在自己设计的架构图里,所有Agora的 SDK 会被打包进前端服务里,用户管理等模块会属于后端服务,两者都是容器化的服务,之间通过https的接口进行访问。而Mysql和Redis则提供了数据库的功能。网关层则是一个鉴权,限流和 HTTPS 加密的服务。接下去就是实战部分了。实战我会偷点懒,会把 CI/CD 的省略,我会在本地编程测试完成之后再打包镜像到服务器的Docker,如果工程量大的时候还是建议大家用持续部署的方式来做。

环境准备

尽管从这开始已经是实战部分了,但是“磨刀不误砍柴工”,我们可以先准备好所需的环境。

所需的开发环境:

操作系统:macos 或者 windows 10

编程环境:Golang

软件:Docker

有了最基础的几个之后,可以开启一些服务了。

1. 数据库

Docker run -d -p 3306:3306 --name mysql  mysql:5.7

2. 缓存

Docker run -d -p 6379:6379 --name redis redis:4.0

检查环境是否都正常:



环境就绪后,那么接下去就是开发了。

编码开发

在编码过程中,我们可以先编写后端的服务,然后有接口提供了,再编写前端的,如此交替式编程,快速完成一个 Demo。


首先我们创建两个空文件夹,一个作为后端服务,一个作为前端服务。然后打开前端服务,新建一个 Html。



为了方便起见,我们用 CDN 的方式引入 Agora 的 SDK。

<script src="https://cdn.agora.io/sdk/release/AgoraRTCSDK-3.2.1.js"></script>

Agora 提供了一个实现音视频通话的调用过程,强烈建议阅读一下:



从上往下,以教师学生为例,业务逻辑可以是这样的:


老师通过 AgoraRTC.createClient 和 Client.init 创建本地客户端,然后通过 Client.join 加入频道。这时候可以理解为创建了一个课堂。接着通过创建本地流-播放本地流-发布本地流的过程,发送音视频数据。

那么学生端的操作就是通过订阅远端流,接受音频数据,然后进行播放。

如果要离开课堂的话,那就是通过 Client.leave 离开频道。

Agora 的 SDK 可以替我们做这些工作,是不是非常强大?

获取 SDK 的权限

我们先到 agora.io 上注册一下我们的项目,随后会展示一些示例代码,如图:


我们选择 Web 端,按照请求调用的路径,我们需要先初始化一个客户端对象,然后填入项目的 APP ID 和 Token。同时,对于一对一视频场景,mode 设置为 rtc。


可以看到我们需要传入一个 APPID 和一个 Token 还有频道。这些就由我们的后端提供。



具体逻辑为,用户登录之后,停留在课堂管理界面。然后新建课堂,输入频道号,然后点击建立的时候,后台返回 APPID 和 Token,同时将课堂号存入数据库。


Agora 很贴心的列出了几乎所有涉及的 API,如下:



部署测试

代码编写完成后,就可以打包成镜像,然后部署到服务器上,再配置一个反向代理,就能给朋友分享访问啦,接下来我们对前端和后端分别进行打包。

 

对于前端来说,我们没有用框架,因此我们可以直接用一个 nginx 镜像,将其中的 index 替换成我们项目的 index.html 即可。


对于后端来说,Go 可以通过:CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go 方便的编译成可执行文件。我们只需要 From 一个空镜像,copy 编译好的可执行文件即可。

后端 Dockerfile:



非常简单,只需要将编译好的可执行文件 main 用 copy 命令复制到容器内部某个目录,然后等容器起来的时候运行 ./main 运行即可。

 

体验分享

Agora 的开发者中心文档非常全面,关键的地方还有最佳实践的示例可以避免踩坑,同时,Agora 提供了很多新手入门的 Demo 和开源项目,社区也是非常的活跃。



几乎可以这么说,只要懂得基础的编程知识,不管是初级程序员还是高级程序员,也不管是后端开发还是前端开发,都很快速的上手,如果有问题也能在开发者中心的文档库里搜到,这就是开发者中心最大的价值吧。


除此之外,通过 Agora 的 demo 体验,整个音视频的效果是出人意料的。可能很多人会觉得,不就是音视频通话吗,微信也有啊,QQ 也有啊,甚至只要一个聊天社交软件可能都会有视频通话;先别说很多都用了声网的技术,就算是微信自研的,也会发现,相同的网络环境下,微信视频比较模糊,延迟也会稍高,同时如果在密闭房间,回音的现象很严重。声网这点做的很不错。

除此之外,声网也是见过 SDK 覆盖最全的,


可以从这截图发现,几乎涵盖了所有的平台。这些细节也可以看出声网在这方面也是投入了很多精力。

最让人惊喜的还是注册用户就送超长的视频通话时长,足够用来做一个小范围的音视频直播应用了。感谢声网。

补充

本文的例子和官网的一对一需求是差不多的,官网会更简单些,因为有 Agora 云服务,提供了开箱即用的 API,可以让前端同学减少对后端的接触——换句话说,没有后端知识,也能够很快速的开发一个合格的应用。

本文的目的还在于对全栈开发者有个参考,如何从需求分析到技术选型,乃至产品部署上线,用模块化,容器化的思想快速开发一个音视频的 Demo。

本 Demo 在线体验地址:https://agora.xabc.site

官方教程 Demo 体验地址:https://docs.agora.io/cn/Video/1_to_1_class_overview?platform=All%20Platforms

作者网站:https://xabc.site


2020 年 11 月 05 日 18:42432

评论

发布
暂无评论
发现更多内容

第二周课后练习

大大猫

极客大学架构师训练营

浅析 Java 内存模型 三

朱华

Java volatile JMM

云服务时代,未来怎么样保障自己的核心竞争力?

boshi

个人成长 职业规划 云服务

《我想进大厂》之Redis夺命连环11问

艾小仙

Java redis 面试 程序语言

浅析 Java 内存模型 一

朱华

Java JMM

手把手教你AspNetCore WebApi:数据验证

AI代笔

ASP.NET Core web api 数据验证

架构师训练营第 1 期 -week4

习习

典型互联网公司使用的技术

happy

第9周总结

Vincent

极客时间 极客大学

架構師訓練營 week4 總結

ilake

Redis-技术专题-哨兵配置和原理

李浩宇/Alex

TensorFlow安装

菜鸟小sailor 🐕

学习

go-zero流数据处理利器

Kevin Wan

go stream functional

架构师训练营 1 期 - 第四周作业(vaik)

行之

极客大学架构师训练营

Spring学习笔记(一)手写一个简单的Spring

无语

Spring Framework

面朝大海,夏日的遗憾一定会被秋风温柔化解

张sir

美食 摄影 摄影征文 旅行

【硬件篇之功耗测试】

良知犹存

硬件

诺奖以上,真相未满:追捕黑洞二百年

脑极体

甲方日常 27

句子

生活 工作 随笔杂谈 日常

详解「区块链」溯源

netkiller

区块链 防伪 超级账本 标签 区块链产品溯源

第 4 周 系统架构总结

bearlu

系统架构

实用威胁建模指南(二)

亚伦碎语

敏捷 安全 系统安全架构 系统安全 威胁建模

第三周架构师训练营作业

Geek_4c1353

极客大学架构师训练营

架构师训练营 1 期 - 第四周总结(vaik)

行之

极客大学架构师训练营

区块链支付系统开发源码,usdt承兑系统搭建

WX13823153201

区块链支付系统开发

第4周 作业一

bearlu

延迟满足

时间是一个人最好的证明

延迟满足感 成功

第四周作业

Geek_4c1353

极客大学架构师训练营

spring-boot-route(十一)数据库配置信息加密

Java旅途

Java Spring Boot

第9周作业

Vincent

极客时间 极客大学

一个典型的大型互联网应用系统使用了哪些技术方案和手段,主要解决什么问题?

高兵

基于容器环境的1-1课堂的开发部署-InfoQ