从github上获取私有go项目后在GoLand打开
用命令go run main.go运行报错
经查缺少参数server
重新执行go run main.go server运行成功
发现控制台不停的在运行输出,为了方便自己理解测试开发,尝试注释main.go里的AddSyncFun相关方法后就不输出了
试着写一个新接口,先从定义model开始
1.参考复制项目里原有的代码,结构体里字段基本是首字母大写,不明白,先遵守。
在就是下面的方法,只看了几眼菜鸟教程的我发现写法跟函数有差别,不明白是什么意思,经查 这是定义方法的意思,fun后面的(HiTest)是指定接收者的意思,有了这个接收者,定义的这个方法就和接收者绑定在了一起,称之为这个接收者的方法,方法里return的应该是表名。
意外查到函数名的大小写是作用域大小的区别,大写的作用域更大,可以被其他包调用。
另外查到该项目使用的gorm,并找到grom的文档:数据库操作gorm用法介绍
2.模块建立完毕,新建controller
方法同样是参考复制项目已有的代码,t *HiTestCtl是结构体,下面是属于这个结构体的方法
Db这个是文件里的sql连接配置,应该就是那个意思吧,先用着。
.find是gorm的,文档里写着是获取查询数据对象的
经查,项目里还用了gin,参数context *gin.Context就是,应该是获取路由参数一类的意思
找到gin文档:gin框架/gin牛逼的context
SuccessWithArray好像就是gin封装好的返回方式
添加路由
用postman访问
返回1,应该是代码写的有问题。通过打断点,发现是值没有初始化就引用而报错了
在main.go里照例添加
然后访问成功,第一个接口开发成功
再然后就是部署到Linux服务器上,服务器上已有部署好的go项目,我需要查出是怎么部署的,然后部署一遍即可。
百度查到需要安装go环境,配置gopath等,但在服务器上并没有发现go环境和相关路径的配置文件,也找不到go应用所在目录。
继续查,发现此服务器是用的nginx代理,应该是要把go项目的编译文件复制到Linux上启动后,用nginx代理指向到这个go项目的端口,找到Linux上go项目所在位置,但不确定是不是,服务器上又不能随便试,自己的服务器现在是windows系统,正好腾讯云的新用户领服务器还没用,就去领了一台一个月的ecs。
再查发现这tm是用的docker部署,我tm不会啊,再查文档看看docker是怎么用的
菜鸟教程真是个好东西呀,
执行sudo docker export 77bc49750a89 >eline-server.tar 导出容器
把tar包拷贝到测试服务器上
执行cat eline-server.tar | sudo docker import - eline-server:latest 导入容器
执行sudo docker images可以发现已经有eline-server这个镜像了
执行docker run eline-server运行 然后报错“Error response from daemon: No command specified”
提示要携带命令运行,查看原服务器上的命令后再来。依然报错,不过是因为程序内使用了内网连接,报连接超时。无法,只好想办法把本地的弄成镜像放上去运行试试了
发现项目里有Dockerfile文件,拷贝项目到服务器上 cd到该目录下,执行docker build -t eline-server .
到6/4的时候接着报错,提示没有这个文件,什么玩意就没有了,去tm的。
最后找到项目里还有makefile文件,所以应该是我的方式搞错了,查到make使用需要安装
在powershell下执行:
Set-ExecutionPolicy Bypass; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
安装好chocolatey,再执行choco install make安装,再配置下goland
然后执行make dp
tm的报错,docker不是命令。也就是说要装docker环境,装半天发现windows家庭版没法装docker
必须得在Linux系统下才行,我tm直接把项目拷贝到刚申请得测试服务器上,cd到项目目录下后运行make dp 依然报错go不是命令,才发现测试服务器上还没装go环境。
那就继续给测试服务器装go环境(到现在我的目标已经不是在测试服务器上部署了,而是在测试服务器上远程部署到正式线上服务器,我得代码是最新的,改动不影响线上运行,所以应该是没问题的......)
Linux安装go环境:
1.下载安装包
wget https://studygolang.com/dl/golang/go1.15.6.linux-amd64.tar.gz
解压安装包到usr/local下
sudo tar -C /usr/local -xzf go1.15.6.linux-amd64.tar.gz
执行vim ~/.bashrc 修改全局变量
最后一行加上下面配置
export GOPATH=$HOME/go
export GOROOT=/usr/local/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
然后按Esc健,输入:wq保存并退出
最后执行 source ~/.bashrc激活配置 安装完成
然后我再来执行make dp 依然报错
好像是有依赖是用的国外的网址,所以不行
执行go env -w GOPROXY=https://goproxy.cn 重新设置代理
再执行make dp依然报错:denied: requested access to the resource is denied
没权限得意思,这个得去问问原来得开发人员了,说是用得别人得,让我去腾讯云新建哥命名空间,去建得时候才发现,腾讯云得容器镜像服务tm得是要钱得。这可不行,只能试试用docker hub了,去上面新建个免费得私人存储库,把makefile得docker push改成我docker hub上得存储库得名字,再拷贝到测试服务器上试试
依然报错:
这应该是因为国外链接访问超时得原因,百度查到得解决方法:
添加这一行后,重新拷贝上去再试make dp
这次执行了很多,但依然报错;
单独执行了一下推送:docker push whl5217/eline-server发现成功了
上docker hub上也发现有了,再执行make dp,发行卡住了,算了,到这我已经明白了,我其实不用通过推送到远程存储库再去更新线上得,我可以直接在测试服务器上启动docker
执行命令:
sudo docker run --name=eline-server --restart=always -d -p 8081:8080 -it whl5217/eline-server:latest
启动后docker ps -a 查看全部得容器,可以发现已经有了,但是状态有点不对
在不停得重启,,,应该是启动报错了,看下日志发生了什么,执行:
docker logs -f -t --since="2021-06-03" --tail=100 ab6dda0b6579
这是查看今天得这个容器得最后一百行日志:
没有这样的文件或目录...百度搜半天又是改这个又是改那个,实在是不行了,不过我也看出来这是镜像的问题了,更换镜像为debian
在执行make dp,依然报错
应该是国外镜像获取超时的原因,按这文章换上国内源,再make dp启动后依然不停重启,不过这次通过日志发现已经是程序的报错了,不过还是可能是因为更换镜像系统的原因或没部署在正式线上而导致少了什么.... 未知机构的签署证书,应该是ssl的原因吧,算了,能到这一步说明部署应该没问题了,直接往线上放试试吧。。。
完犊子了,部署到线上也报这个错,什么几把证书不正确。原来的镜像已经被我删了,现在线上已经访问不了,有种要跑路的感觉了。
一不做,二不休。我tm直接把几把docker删了,给线上的Linux服务器装go环境,然后把项目拷贝上去,直接tm的后台启动运行项目。
起来了,但是tm得访问不到,看看nginx配置,发现用的是8080端口,代理到原来那个8081的docker上,懂了。直接把项目的端口改为8081,然后再后台启动
go build main.go
nohup ./main server &
ok,成功了,早tm这样搞多好,看个一天的docker,真是够了