(golang学习)2.goroutine测试,beego框架安装、api测试(*)
1.并发测试
这里Windows电脑端编辑器使用 goland。
a.代码
goroutine.go:
package main import ( "fmt" "time" ) func newTask() { i := 0 for { i++ fmt.Printf("-- new goroutine task: i = %d\n", i) time.Sleep(1 * time.Second) //延时1s if i >= 20 { break; } } } func main() { go newTask() //新建一个协程任务 i := 0 for { i++ fmt.Printf("main task: i = %d\n", i) time.Sleep(1 * time.Second) //延时1s if i >= 10 { break; } } //这里被for阻塞 fmt.Printf("main OK!\n") }
上面主进程先退出,子进程会执行不完。
2.以docker镜像运行
a.本地安装beego
设置gopath路径,到工作目录:
sed -i '$a export GOROOT=/usr/local/go' /etc/profile sed -i '$a export GOBIN=$GOROOT/bin' /etc/profile sed -i '$a export GOPATH=$HOME/gocode' /etc/profile sed -i '$a export PATH=$PATH:$GOPATH:$GOBIN' /etc/profile #容器可以把source换成点 . source /etc/profile
查看go env正常。
[]:~/tmp/dk/golang# go get github.com/astaxie/beego []:~/tmp/dk/golang# go get github.com/beego/bee []:~/tmp/dk/golang# go get github.com/astaxie/beego/orm []:~/tmp/dk/golang# go get github.com/go-sql-driver/mysql []:~/tmp/dk/golang# ln -s /usr/local/go/bin/bee /usr/local/bin/bee
执行 bee new beego,go run src/beego/main.go 发现与已有端口冲突,修改src/github.com/astaxie/beego/config.go中219行HTTPPort为9600,框架启动正常。
b.web访问
Handler crashed with error can't find templatefile in the path:views/index.tpl
访问不了,查看src/beego/main.go文件发现,BeeApp.Run()运行依然在src/github.com/astaxie/beego/beego.go,修改src/github.com/astaxie/beego/config.go回到8080。因为是用bee命令创建的,修改app.conf端口后,所以进入项目根目录使用bee run即可,web打开正常。注意使用bee工具。
参考官网,添加一个页面:
# 编辑routers/route.go,添加 beego.Get("/hi",func(ctx *context.Context){ ctx.Output.Body([]byte("hello world")) }) # import添加 "github.com/astaxie/beego/context"
访问 http://remote_host:9600/hi 输出 hello world ,正常。
c.api项目
参考《官方api文档》:
go get -u github.com/beego/bee
go get -u github.com/astaxie/beego
然后进入到你的GOPATH/src目录,执行命令bee api beeapi,进入目录cd beeapi,执行命令bee run -downdoc=true -gendoc=true.
# 注意所在目录位置,生成到src目录下: []:~/tmp/dk/golang# bee api beeapi []:~/tmp/dk/golang/src/beeapi# bee generate appcode -driver=mysql -conn="root:123456@tcp(172.1.11.11:3306)/test" []:~/tmp/dk/golang/src/beeapi# bee run -downdoc=true -gendoc=true
输入bee help 可以看到api的参数,bee generate官方文档。修改端口为9601,进入swapper的web页面,找到user-->try复制请求 curl -X GET "http://x.x.x.x:9601/v1/user/?query=id%3A1" -H "accept: application/json" 返回及解析正常。
3.api容器化运行
参考官网《如何为你的Go应用创建轻量级Docker镜像?》、《dockerfile方式创建beego镜像》。主要分为编译阶段和生产阶段:
a.编译阶段
Dockerfile:
FROM alpine:3.10 #MAINTAINER 维护者信息 MAINTAINER [email protected] # dependencies required for running "phpize" ENV GOLANG_VERSION 1.12.7 RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \ && apk update && cd /tmp \ && apk add --no-cache --virtual .build-deps \ bash \ gcc \ musl-dev \ openssl \ go \ && wget -O go.tgz "https://studygolang.com/dl/golang/go${GOLANG_VERSION}.src.tar.gz" \ && mkdir -p /usr/local/go && cd /usr/local/go \ && tar -xzf go.tgz --strip-components 1 \ && rm -f /tmp/go.tgz \ #默认安装包的路径 && sed -i '$a export GOROOT=/usr/local/go' /etc/profile \ && sed -i '$a export GOBIN=$GOROOT/bin' /etc/profile \ && sed -i '$a export GOPATH=$HOME/gocode' /etc/profile \ && sed -i '$a export PATH=$PATH:$GOPATH:$GOBIN' /etc/profile \ && source /etc/profile && echo $PATH \ #安装beego依赖 && go get github.com/astaxie/beego \ && go get github.com/beego/bee \ && go get github.com/astaxie/beego/orm \ && go get github.com/go-sql-driver/mysql #源码路径。按照golang默认约定,go run,go install等命令的当前工作路径(即在此路径下执行上述命令)。 WORKDIR $GOPATH/src #添加所有需要编译的应用代码 COPY beeapi . # 编译一个静态的go应用(在二进制构建中包含C语言依赖库) #RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo . RUN CGO_ENABLED=0 GOOS=linux bee build -a -installsuffix cgo . # 设置我们应用程序的启动命令 #CMD ["./beeapi"]
docker build -t beeapi .
docker run -it --name beeapi -p 9601:9601 --rm beeapi
容器启动正常,网页访问 http://xx.xx:9601/swagger/ 失败。查看宿主机端口监听正常,进入容器 docker exec -it beeapi bash,bee run main.go,启动完成后网页可以访问(报了个数据库连接超时的错误),刷新web端可以访问。
b.目标是代码提交重启服务自动更新api
e.后台运行
nohup和&的区别
& : 指在后台运行
nohup : 不挂断的运行,注意并没有后台运行的功能,,就是指,用nohup运行命令可以使命令永久的执行下去,和用户终端没有关系,例如我们断开SSH连接都不会影响他的运行,注意了nohup没有后台运行的意思;&才是后台运行
bohup CMD &
针对git clone下载过慢的问题