WechatIMG186

作者:申屠鹏会

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

项目介绍

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

需求分析

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

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

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

技术选型

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

备选技术 实现功能 理由
Golang 后端语言 能够很方便的编译成可执行文件,然后打包成容器服务
html等 Web前端页面 不采用vue等框架的原因是为了快速开发体验
Mysql 后端数据库 开源免费,够用就行
Redis 缓存,用户鉴权等功能  
Agora SDK 实时音视频互动 业界最流畅最强大的音视频SDK
腾讯云 后端服务器 提供容器部署,网关等服务。
第三方白板 白板功能  

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

架构设计

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

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

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

环境准备

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

所需的开发环境:

操作系统:macos或者windows 10

编程环境:Golang

软件:Docker

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

数据库

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

缓存

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

检查环境是否都正常:
image

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

编码开发

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

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

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

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

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

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

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

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

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

获取SDK的权限

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

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

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

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

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

部署测试

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

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

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

后端Dockerfile:
image

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

体验分享

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

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

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

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

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

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

补充

本文的例子和官网的一对一需求是差不多的,官网会更简单些,因为有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

原文链接:https://dev.agora.io/category/精选文章/blog/19586