为了丰富自己的技术栈,现在开始自学
Go
,很多教程参差不齐,记录一下自己的学习过程,持续更新~
通过本篇文章您将学习到:
Go
环境搭建(windows
),使用Vscode
开发GO
Gin
框架路由配置,编写第一个接口- 阿里云
Docker
镜像创建与使用 Github Action + Docker
自动部署到腾讯云服务器
Go 环境搭建
-
解压到本地文件夹
D:\Go
-
添加环境变量:
Path
里面新增D:\Go\bin
,至此安装完成PS C:\Windows\system32> go version go version go1.22.5 windows/amd64
配置 VsCode 开发环境
- 安装
Go
插件
- 配置Go插件:重启
Vscode
后ctrl + shit + p
,输入Go: Install/Update tools
然后选择安装
初始化 Go 项目
- 新建一个项目目录,初始化go项目
go mod init jiang-go-study
会自动生成一个 go.mod
文件,相当于前端项目的 package.json
- 修改
go proxy
,否则无法下载资源,根目录下添加go.env
,写入修改后重启终端生效
export GOPROXY=https://goproxy.io,direct
Gin
是一个高性能、支持中间件和灵活路由的Go
语言HTTP web
框架,适用于开发高并发web
应用。
- 安装
Gin
, gin 教程地址
go get -u github.com/gin-gonic/gin
会自动生成 go.sum
文件,相当于前端项目的 lock
文件
- 创建并运行一个简单的
Gin
应用程序:在项目根目录下创建一个名为main.go
的文件,并写入以下代码:
package main
import (
"fmt"
"jiang-go-study/routers"
)
func main() {
// 注册路由
r := routers.CreateHttpHandler()
fmt.Println(r)
err := r.Run(":8080")
if err != nil {
fmt.Println("服务器启动失败!")
}
}
Go
语言中,只要import
了包就可以直接使用 包名.方法,我们将路由放到单独的文件夹分配管理
在根目录下新建以下结构文件
index.go 文件内容:
package routers
import (
"github.com/gin-gonic/gin"
"jiang-go-study/routers/module"
)
func CreateHttpHandler() *gin.Engine {
root := gin.New()
base := root.Group("/jiang")
routersModule.SetupCommonRouter(base)
return root
}
------------------------------------------------------------------------
common.go 内容:
package routersModule
import (
"github.com/gin-gonic/gin"
)
func SetupCommonRouter(base *gin.RouterGroup) {
common := base.Group("/common")
common.GET("/log", func(c *gin.Context) {
c.String(200, "common log")
})
}
之后不同模块路由都将放到 module
文件夹内管理
- 执行
go run main.go
,
打开 http://127.0.0.1:8080/jiang/common/log
,看到输出则成功
至此我们第一个 go
接口就完成啦,接下来就要把这个接口放到服务器上,为了开发更便捷,我们通过 Github Action + docker
自动部署到服务器,这里希望您有一台自己的服务器,我们将使用阿里云 docker
容器镜像服务
使用阿里云 Docker 容器镜像上传
自行在阿里云容器镜像网站上,注册并创建一个仓库,后面会使用到阿里云帐号、密码、仓库名称,需要绑定 Github
帐号以及仓库
自动构建打包上传
- 根目录下新建
Dockerfile
# 使用官方 Golang 镜像作为基础镜像
FROM golang:1.22.5
# 设置工作目录
WORKDIR /app
# 复制所有文件到容器中
COPY . .
# 下载并安装依赖包
RUN go mod tidy
# 编译 Go 程序
RUN go build -o jiang-go-study
# 声明服务端口
EXPOSE 8080
# 启动 Go 应用
CMD ["./jiang-go-study"]
- 根目录下新建
.github/workflows/deploy.yml
文件
name: Deploy to Alibaba Cloud
on:
push:
branches:
- main
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Set up Go
uses: actions/setup-go@v2
with:
go-version: "1.22.5"
- name: Build
run: go build -o jiang-go-study
- name: Login to Alibaba Cloud Container Registry
run: |
echo "${{ secrets.ALIYUN_DOCKER_PASSWORD }}" | docker login --username ${{ secrets.ALIYUN_DOCKER_USERNAME }} --password-stdin registry.cn-hangzhou.aliyuncs.com
- name: Build Docker image
run: docker build -t registry.cn-hangzhou.aliyuncs.com/jiang-go/jiang-go-study:latest .
- name: Push Docker image
run: docker push registry.cn-hangzhou.aliyuncs.com/jiang-go/jiang-go-study:latest
deploy:
runs-on: ubuntu-latest
needs: build
steps:
- name: SSH to server and deploy
uses: appleboy/ssh-action@v0.1.6
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USERNAME }}
key: ${{ secrets.SERVER_SSH_KEY }}
script: |
docker login --username ${{ secrets.ALIYUN_DOCKER_USERNAME }} --password ${{ secrets.ALIYUN_DOCKER_PASSWORD }} registry.cn-hangzhou.aliyuncs.com
docker pull registry.cn-hangzhou.aliyuncs.com/jiang-go/jiang-go-study:latest
docker ps -q --filter "name=jiang-go-study" | grep -q . && docker stop jiang-go-study || echo "Container jiang-go-study is not running"
docker ps -a -q --filter "name=jiang-go-study" | grep -q . && docker rm jiang-go-study || echo "Container jiang-go-study does not exist"
docker run -d --name jiang-go-study -p 8080:8080 registry.cn-hangzhou.aliyuncs.com/jiang-go/jiang-go-study:latest
- 在
Github
仓库中的新建 5 个Repository secrets
SERVER_HOST
:服务器ip
SERVER_USERNAME
:服务器登录用户名,一般root
SERVER_SSH_KEY
:服务器上生成的私钥,这里不会的可以参考我的 过去文章ALIYUN_DOCKER_USERNAME
:阿里云Docker
用户名ALIYUN_DOCKER_PASSWORD
:阿里云Docker
密码
-
在腾讯云防火墙中 放行
8080
端口,腾讯云的防火墙添加自定义安全组 -
腾讯云服务器需要安装
Docker
,我这边是宝塔Linux
版的,我直接在宝塔面板上安装了
至此若不出意外,在推送代码到 GitHub
仓库后,将会在阿里云镜像网站中看到一条新的镜像版本,可以在服务器终端中查看 Docker
状态
然后通过服务器 ip
地址访问接口,打开 http://121.4.86.16:8080/jiang/common/log
到这里,我们的第一个 Go
接口就成功的自动部署到服务器,之后开发只需要推送代码到仓库就会自动构建了,先把这么一个流程把它弄通,后面再慢慢学习其它的,加油!!!