相关文章: Google资深工程师深度讲解Go语言
Golang 常用命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
go build # 最常用的 go command 之一,编译 go 文件 # 跨平台编译:env GOOS=linux GOARCH=amd64 go build go install # 也是编译,与 build最大的区别是编译后会将输出文件打包成库放在 pkg 下 go get # 用于获取 go 的第三方包,通常会默认从 git repo 上 pull 最新的版本 # 常用命令如:go get -u github.com/go-sql-driver/mysql(从 github 上获取 MySQL的 driver 并安装至本地) go fmt # 类似于 C 中的 lint,统一代码风格和排版 # 常用命令如:go fmt go test # 运行当前包目录下的 tests # 常用命令如go test 或 go test -v /* main.go /* main_test.go # Go 的 test 一般以 XXX_test.go 为文件名 # XXX 部分一般为 XXX_test.go 所要测试的代码文件名 # 注:Go没有特别要求 XXX 部分必须 是要测试的文件名 |
本文参考代码见 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 的次数以达到稳态
1 |
go test -bench=. |
什么是前后端解耦
- 前后端解耦是时下流行的 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
数据库设计:用户
1 2 3 4 |
TABLE: users id UNSIGNED INT, PRIMARY KEY, AUTO_INCREMENT login_name VARCHAR(64), UNIQUE KEY pwd TEXT |
数据库设计:视频资源
1 2 3 4 5 6 |
TABLE: video_info id VARCHAR(64), PRIMARY KEY, NOT NULL author_id UNSIGNED INT name TEXT display_ctime TEXT create_time DATETIME |
数据库设计:评论
1 2 3 4 5 6 |
TABLE: comments id VARCHAR(64), PRIMARY, NOT NULL video_id VARCHAR(64) author_id UNSIGNED INT content TEXT time DATETIME |
数据库设计:sessions
1 2 3 4 |
TABLE: sessions session_id TINYTEXT, PRIMARY KEY, NOT NULL TTL TINYTEXT login_name VARCHAR(64) |
Session
- 什么是 session
- 为什么要用 session
- session 和 cookie 的区别:服务端&客户端
1 2 3 4 |
handler->validation(1.request, 2.user)->business logic->response 1. data model 2.error handling main -> middleware -> defs(message, err) -> handlers -> dbops -> response |
Streaming
- 静态视频,非 RTMP
- 独立的服务,可独立部署
- 统一的 api 格式
Stream Server
- Streaming
- Upload files
测试方法
1 2 3 4 5 6 7 |
# 进入源码video_server/streamserver 目录 go install # 将 upload.html拷贝到 GOBIN 目录的 videos 目录下,此时可以看到已编译好的 streamserver 文件 ./streamserver # 访问http://127.0.0.1:9000/testpage # 点击上传 # 访问http://127.0.0.1:9000/videos/ddd来浏览刚刚上传的视频 |
Scheduler
- 什么是 scheduler:调度器
- 为什么需要 scheduler
- scheduler 通常做什么:异步任务、系统周期性任务 等
Scheduler 包含什么
- RESTful 的 http server
- Timer
- 生产者/消费者模型下的 task runner
1 2 3 4 5 6 |
TABLE: video_del_rec session_id VARCHAR(64), PRIMARY KEY, NOT NULL api -> videoid-mysql dispatcher -> mysql-videoid -> datachannel executor -> datachannel-videoid -> delete videos |
前端服务
Go 的模板引擎
- 模板引擎是将 html 解析和元素预置替换生成最终页面的工具
- Go 的模板有两种 text/template 和 html/template
- Go 的模板采用动态生成的模式
网站上云
Cloud Native(云原生)
广义上的云原生
- 松耦合的架构(SOA/Microservice)
- (Stateless)无状态,(Scalability)伸缩性,(Redundancy)冗余
- 平台无关性