Go语言实战流媒体视频网站

学习笔记 Alan 6年前 (2019-03-31) 12856次浏览 0个评论 扫描二维码

相关文章: Google资深工程师深度讲解Go语言

Golang 常用命令

本文参考代码见 GitHub 仓库:https://github.com/alanhou/golang-streaming

Test的写法

  • 每一个 test 文件必须 import 一个 testing
  • test 文件下的每一个 test case 均必以 Test 开头并且符合 TestXxx 形式,否则 go test 会直接跳过测试不执行
  • test case 的入参为 t *testing.T 或 b *testing.B
  • t.Errorf 为打印错误信息,并且当前 test case 会被跳过
  • t.SkipNow()为跳过当前 test,并且直接按 PASS 处理继续下一个 test
  • Go 的 test 不会保证多个 TestXxx 是顺序执行,但是通常会按顺序执行
  • 使用 t.Run 来执行 subtests 可以做到控制 test 输出以及 test 的顺序
  • 使用 TestMain 作为初始化 test, 并且使用 m.Run()来调用其它 tests 可以完成一些需要初始化操作的 testing,比如数据库连接、文件打开、REST服务登录等
  • 如果没有在 TestMain 中调用 m.Run()则除了 TestMain 以外的其它 tests 都不会被执行

Test之 benchmark

  • benchmark 函数一般以 Benchmark 开头
  • benchmark 的 case 一般会跟 b.N 次,而且每次执行都会如此
  • 在执行过程中会根据实际 case 的执行时间是否稳定会增加 b.N 的次数以达到稳态

Go语言实战流媒体视频网站

什么是前后端解耦

  • 前后端解耦是时下流行的 web 网站架构
  • 前端页面和服务通过普通的 web 引擎渲染
  • 后端数据通过渲染后的页面脚本调用后处理和呈现

前后端解耦的优势

  • 解放生产力,提高合作效率
  • 松耦合的架构更灵活,部署更方便,更符合微服务的设计特征
  • 性能的提升,可靠性的提升

前后端解耦的缺点

  • 工作量大
  • 前后端分享带来的团队成本以及学习成本
  • 系统复杂度加大

API

  • REST(Representational State Transfer) API
  • REST是一种设计风格,不是任何架构标准
  • 当今 RESTful API通常使用 HTTP 作为通信协议,JSON 作为数据格式
  • 特点
    • 统一接口(Uniform Interface)
    • 无状态(Stateless)
    • 可缓存(Cachable)
    • 分层(Layered System)
    • CS 模式(Client-server Architecture)
  • 设计原则
    • 以 URL(统一资源定位符)风格设计 API
    • 通过不同的 METHOD(GET, POST, PUT, DELETE)来区分对资源的 CRUD
    • 返回码(Status Code)符合 HTTP 资源描述的规定

Go语言实战流媒体视频网站

API设计:用户

  • 创建(注册)用户:URL: /user Method: POST, SC: 201, 400, 500
  • 用户登录:URL: /user/:username Method: POST, SC: 200, 400, 500
  • 获取用户基本信息:URL: /user/:username Method: GET, SC: 200, 400, 401, 403, 500
  • 用户注销:URL: /user/:username Method: DELETE, SC: 204, 400, 401, 403, 500

goroutine 是非常轻量级的协程,每个协程仅占用4K内存

listen -> RegisterHandlers -> handlers

API设计:用户资源

SC -> Status Code

  • List all videos:URL:/user/:username/videos Method: GET, SC: 200, 400, 500
  • Get one video:URL:/user/:/username/videos/:vid-id Method: GET, SC: 200, 400, 500
  • Delete on video: URL:/user/:username/videos/:vid-id Method: GET, SC: 204, 400, 401, 403, 500

API设计:评论

  • Show comments:URL:/videos/:vid-id/comments Method: GET, SC: 200, 400, 500
  • Post a comment:URL:/videos/:vid-id/comments Method: POST, SC: 201, 400, 500
  • Delete a comment:URL:/videos/:vid-id/comment/:comment-id Method: DELETE, SC: 204, 400, 401, 403, 500

数据库设计:用户

数据库设计:视频资源

数据库设计:评论

数据库设计:sessions

Session

  • 什么是 session
  • 为什么要用 session
  • session 和 cookie 的区别:服务端&客户端

Go语言实战流媒体视频网站

Streaming

  • 静态视频,非 RTMP
  • 独立的服务,可独立部署
  • 统一的 api 格式

Stream Server

  • Streaming
  • Upload files

测试方法

Scheduler

  • 什么是 scheduler:调度器
  • 为什么需要 scheduler
  • scheduler 通常做什么:异步任务、系统周期性任务 等

Scheduler 包含什么

  • RESTful 的 http server
  • Timer
  • 生产者/消费者模型下的 task runner

Go语言实战流媒体视频网站

前端服务

Go 的模板引擎

  • 模板引擎是将 html 解析和元素预置替换生成最终页面的工具
  • Go 的模板有两种 text/template 和 html/template
  • Go 的模板采用动态生成的模式

Go语言实战流媒体视频网站

网站上云

Cloud Native(云原生)

广义上的云原生

  • 松耦合的架构(SOA/Microservice)
  • (Stateless)无状态,(Scalability)伸缩性,(Redundancy)冗余
  • 平台无关性

 

喜欢 (12)
[]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址