相关文章: 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 的次数以达到稳态
什么是前后端解耦
- 前后端解耦是时下流行的 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 资源描述的规定
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 的区别:服务端&客户端
Streaming
- 静态视频,非 RTMP
- 独立的服务,可独立部署
- 统一的 api 格式
Stream Server
- Streaming
- Upload files
测试方法
Scheduler
- 什么是 scheduler:调度器
- 为什么需要 scheduler
- scheduler 通常做什么:异步任务、系统周期性任务 等
Scheduler 包含什么
- RESTful 的 http server
- Timer
- 生产者/消费者模型下的 task runner
前端服务
Go 的模板引擎
- 模板引擎是将 html 解析和元素预置替换生成最终页面的工具
- Go 的模板有两种 text/template 和 html/template
- Go 的模板采用动态生成的模式
网站上云
Cloud Native(云原生)
广义上的云原生
- 松耦合的架构(SOA/Microservice)
- (Stateless)无状态,(Scalability)伸缩性,(Redundancy)冗余
- 平台无关性