目录
go 开发的准备工作
- golang安装
- go modudle配置
- goctl安装
- protoc&protoc-gen-go安装
- etcd的安装
- ide的安装和配置
安装步骤和流程见: https://zeromicro.github.io/go-zero/prepare.html
go版本的控制
查看当前 go的版本 go version
- go多版本控制工具---gvm
安装方式如下:
bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)
校验是否安装成功:
gvm version
如果不成功,可能会提示错误,注意需要配置host 文件
2. 查看已经安装的版本有哪些?
gvm list
3. 查看所有的版本
gvm listall
4. 指定安装哪个版本
gvm install go1.16 -B 安装最新的1.16版本
5. go版本的使用和切换
gvm use go1.16
go语言的编译
go build 最常用的编译go 文件
go install 只是将编译的中间文件放在 GOPATH 的 pkg 目录下,以及固定地将编译结果放在 GOPATH 的 bin 目录下。
go build 文件
go install 文件 本地打包编译命令
GO111MODULE 有三个值:off, on和auto(默认值)
获取依赖包的使用
go get github.com/tal-tech/go-zero/core/discov 下载项目依赖包
go get github.com/tal-tech/go-zero/core/disco@latest 下载最新包
go get github.com/tal-tech/go-zero/core/disco@master 拉取master分之最新的commit
go get -u-patch github.com/tal-tech/go-zero/core/disco 更新到最新的修改bug的版本
go get github.com/tal-tech/go-zero/core/disco@v1.0.0 根据tag 拉取commit
go get github.com/tal-tech/go-zero/core/disco@commit_id 根据commit_id 获取依赖包 或自动转为对应的tag
go get github.com/tal-tech/go-zero/core/disco/v3 指定版本拉取
go get -u 更新包
mod的基本操作
模块是相关Go包的集合。modules是源代码交换和版本控制的单元。 go命令直接支持使用modules,包括记录和解析对其他模块的依赖性。
modules替换旧的基于GOPATH的方法来指定在给定构建中使用哪些源文件。
go help mod 查看命令
具体实现见以下说明:
创建一个模块 mkdir gomods && cd gomods
初始化模块 模块名为项目名
go.mod文件一旦创建后,它的内容将会被go toolchain全面掌控。go toolchain会在各类命令执行时,比如go get、go build、go mod等修改和维护go.mod文件。
go mod init gomods
- mod download 使用 目前所有模块版本数据均缓存在
$GOPATH/pkg/mod
和 $GOPATH/pkg/sum
下 直接下载依赖包到本地缓存 -
go mod download
- 编辑go.mod文件 选项有
-json
、-require
和-exclude
,可以使用帮助go help mod edit -
以文本模式打印模块需求图go help mod edit go mod edit -fmt // 如果手动编辑 可以用fmt进行格式化 go mod edit -require=golang.org/x/text 添加依赖 会自动加载到.mod 文件 go mod edit -replace=golang.org/x/crypto@v0.0.0=github.com/golang/crypto@latest //替代依赖包 module语句指定包的名字(路径) require语句指定的依赖项模块 replace语句可以替换依赖项模块 exclude语句可以忽略依赖项模块
go mod graph
- 删除错误或者不使用的modules 获取依赖的和清理不依赖的或者无效包
go mod tidy
- 生成vendor目录
go mod vendor
- 验证依赖是否正确
go mod verify
- 清理moudle 缓存
go clean -modcache
- 查看某个依赖包可下载的版本
go list -m -versions github.com/gogf/gf
go list -m -json all
go list -m输出的信息被称为build list,也就是构建当前module所要构建的所有相关package(及版本)的列表。
go list -m
go mod 包依赖分为2中: 本地项目:
1: 同一个项目之间引用包
具体事例见 moduledemo 项目 (mod 模块需要用replace)
2、不同项目之间引用包
具体事例见 moduledemo 项目 和mypackage 项目 统一目录的项目
注意点: 如果引用的最后的包名一样的话(无论路径是否相同),会导致错误,给包起个别名可以解决
3、远程控制事例:
见onemod 项目 在 twomod的应用
备注: 库的 版本升级规范
vendar -》 gopath
go test 单元测试
特殊:不需要 main() 作为函数入口。所有在以_test
结尾的源码内以Test
开头的函数会自动被执行
- 每一个test文件需要import一个testing
- 默认的情况下,
go test
命令不需要任何的参数,它会自动把你源码包下面所有 test 文件测试完毕,当然你也可以带上参数。 - 这里介绍几个常用的参数:
- -bench regexp 执行相应的 benchmarks,例如 -bench=.;
- -cover 开启测试覆盖率;
- -run regexp 只运行 regexp 匹配的函数,例如 -run=Array 那么就执行包含有 Array 开头的函数;
- -v 显示测试的详细命令
测试事例:
package main
import (
"fmt"
"testing"
)
/*test 测试,可以没有main 作为函数入口*/
func TestHelloWord(t *testing.T) {
fmt.Println("测试单元")
t.Log("Hello word")
}
/*执行方式 go test helloworld_test.go*/
/*可以多个测试函数*/
func TestHelloWord2(t *testing.T) {
fmt.Println("测试单元")
t.Log("Hello word")
}
/*默认多个测试案例一次测试,如果想指定特定函数 可以执行 go test run TestHelloWord2 helloword_test.go*/
/*终止测试单元*/
func TestFailNow(t *testing.T) {
t.Log("stop2 Hello word")
t.FailNow()
t.Log("stop2 Hello word")
}
/*标记错误不终止*/
func TestFail(t *testing.T) {
fmt.Println("before fail")
t.Fail()
fmt.Println("after fail")
}
/*一下是基准测试用例基准测试——获得代码内存占用和运行效率的性能数据*/
/*开启基准测试 go test -v -bench=. helloword_test.go
第 1 行的-bench=.表示运行 benchmark_test.go 文件里的所有基准测试,和单元测试中的-run类似。
第 4 行中显示基准测试名称,2000000000 表示测试的次数,也就是 testing.B 结构中提供给程序使用的 N。
“0.33 ns/op”表示每一个操作耗费多少时间(纳秒)。
*/
/*如果bench 和test 在同一个测试文件中,执行某个test 或者指定某个bench执行的时候,需要按照一下方式
go test -v helloword_test.go -test.bench Add -test.run Add
go test -v helloword_test.go -test.run TestHelloWord2
*/
func Benchmark_Add(b *testing.B) {
var n int
for i := 0; i < b.N; i++ {
n++
}
}
/*内存测试
go test -v -bench=Alloc -benchmem helloword_test.go
由于和test在同一个文件中 可用go test -v -bench=Alloc -benchmem helloword_test.go -test.bench Alloc -test.run Alloc 执行
第 1 行的代码中-bench后添加了 Alloc,指定只测试 Benchmark_Alloc() 函数。
第 4 行代码的“16 B/op”表示每一次调用需要分配 16 个字节,“2 allocs/op”表示每一次调用有两次分配。
*/
func Benchmark_Alloc(b *testing.B) {
for i := 0; i < b.N; i++ {
fmt.Sprintf("%d", i)
}
}
/*go pprof 命令
Go语言工具链中的 go pprof 可以帮助开发者快速分析及定位各种性能问题,如 CPU 消耗、内存分配及阻塞分析。 具体看文档*/
代码规范检测
1、ide 配置插件-代码格式化 gofmt
gofmt -代码格式化: func def() erro{} 之间的空格等
2、golint --对代码定义规范的检查 (主要 各种语法规范校验)
Golint会对代码做以下几个方面检查
package注释 必须按照 “Package xxx 开头”
package命名 不能有大写字母、下划线等特殊字符
struct、interface等注释 必须按照指定格式开头
struct、interface等命名
变量注释、命名
函数注释、命名
golint file //检测文件
golint dir //检测目录
goctl:代码生成工具
具体文档参考: https://zeromicro.github.io/go-zero/goctl.html
具体事例: https://www.yuque.com/tal-tech/go-zero/tdsgkg
goctl: API
goctl rpc goctl rpc
命令可以根据proto文件生成rpc服务代码,具体功能如下
启动rpc 服务端需要依赖 etcd 如果没有安装 需要先安装:
brew install etcd
goctl template
goctl template
命令用于对于api、rpc、model等代码生成模板管理,方便开发人员对模板进行自定义 具体样子见代码 bookstore
客户端和服务端项目的启动和调用: 见项目bookstore
goctl 见巨扬分享的开发文档: 框架文档:https://www.yuque.com/tal-tech/go-zero/yaoehb
插件:
file watcher: 作用:可以格式化代码
Save Actions: 作用:保存的时候可以自动删除一些不用的导入等
key promoter x : 作用: 点击方式完成时 提示的快捷方式
viper: 1. 支持Yaml、Json、 TOML、HCL 等格式的配置等
goclt
gofmt
go项目的部署
1、supervisor 管理 golang 进程
将创建的项目打包上传到服务器 和目前保持一致
在supervisord 的配置文件下添加项目配置
cd /etc/supervisor/conf.d
具体用已有项目事例
直接启动 supervisord
查看是否启动
supervisorctl status
参考文档:
https://zeromicro.github.io/go-zero/service-deployment.html
2、jekins的部署:
主要是基于git docker jekins build实现。
https://zeromicro.github.io/go-zero/service-deployment.html
这个后续项目成熟一些在测试部署
3、服务监控 :
基于prometheus的微服务指标监控
go-zero 框架中集成了基于prometheus的服务指标监控
https://zeromicro.github.io/go-zero/service-monitor.html
插件的介绍:
后续用到一次补充
远程调试:
go的异步任务
1、Machinery 5k*
获取下来源码:
go get -u github.com/RichardKnop/machinery/v1
具有哪些特性:
- 任务重试机制
- 延迟任务支持
- 任务回调机制
- 任务结果记录
- 支持Workflow模式:Chain,Group,Chord
- 多Brokers支持:Redis, AMQP, AWS SQS
- 多Backends支持:Redis, Memcache, AMQP, MongoDB
Machinery 的简单设计结构图
一般生产者先调用 signature := tasks.NewSignature
定义好任务,然后 machineryServer.SendTask
就完成了任务的产生。
具体使用参考使用教程:
其它: cron 7.5*
常见错误处理
1、goctl找不到
goctl 需要添加到环境变量中
2、 greet api 运行api的时候,提示 no required module provides package github.com/tal-tech/go-zero/core/conf; to add it:
需要通过 go mod tidy 来清理和获取相应的依赖包
3、go get 失效
go env -w GOPROXY=https://goproxy.cn 修改国内代理配置 后用go get 就解决了
git clone 依赖包直接到GOPATH/src/下
cd /d %GOPATH%/src/
git clone https://github.com/golang/net.git
4、 启动rpc服务的时候失败: exect state 2
没有启动 etcd 的原因 ,启动etcd 后正常
goctl model 与数据库关联 goctl model mysql datasource -url="dever:dever@tcp(123.57.148.27:16033)/cms_db" -table="cms_user" -dir ./model 对应的分别是 用户名:用户名密码@tcp(mysql地址)/ 哪个数据库 哪个数据表, 全部的数据表可以用 *
优先级---
执行流程--
原理--
why
版本升级流程规范
上线规范
参考文档:
http://www.topgoer.com/%E5%BC%80%E6%BA%90/%E5%8C%85%E8%A3%85%E7%AE%A1%E7%90%86.html