前言
服务器基础环境搭好了,接下来少不了编程语言的选择,此次我选择未学习过的Golang语言作为挑战,原因很简单,高性能易部署,公司后端同事技术栈都是基于Golang,学习的同时也可以向他们请教。
目标
服务器部署Web应用程序,端口号10001,使用Docker容器进行部署,部署完后用Jmeter-5.5进行机器生产环境测试验收,并完成从零开始搭建后台服务(IAA业务)- Nginx(02)系列集成测试,整篇系列中只会从实战角度选择性学习,不会千篇一律的先来一套Golang语言入门之类,这基本记不住,而且市面上也有很多教程。
安装开发环境
Golang开发包,选择当前最新版本Golang-1.18.8,IDE选择GoLand-2022.2.4,注意:链接都是Windows版本。点击安装,点击下一步完成安装,配置环境变量如下
测试,在命令行中,输入:go version
,命令行返回go version go1.18.8 windows/386
,大功告成。
选择Web框架
早就听说过Gin大名,此次用Gin出一个Docker镜像,Gin入门可以查看官方网站,安装Gin,输入go get -u github.com/gin-gonic/gin
,发现不对劲,无法访问,猜测应该是有国内仓库代理,输入命令解决。
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct
go get -u github.com/gin-gonic/gin
编写第一个Go Web应用
打开IDE工具,又访问不了,这次没有办法了,只能开启工具,登入成功
创建新工程:
新建go文件,main.go,命令行执行:
go mod init 工程名
go mod tidy
多出一个go.mod文件,这个文件其实就是依赖库,go mod tidy
本质是同步远程仓库到本地,文件中indirect
表示同步完成。
编写第一个web程序,复制官网教学文档第一个gin web程序,main.go
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"web-gin/service"
)
func main() {
fmt.Println(Hello())
fmt.Println(service.Hello())
r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "pong",
})
})
r.Run(":80") // 监听并在 0.0.0.0:80上启动服务
}
func Hello() string {
return "hello"
}
工程左侧,右击,执行run
第一个web应用程序跑通,程序先不分析,接下来编写DockerFile制作镜像文件。
编写Docker镜像构建脚本
工程根目录编写Dockerfile镜像文件,内容如下
FROM golang:1.18 as builder
MAINTAINER Swei
WORKDIR /go/src/web-gin
ENV GO111MODULE on
ENV GOPROXY https://goproxy.cn,direct
# Get dependancies - will also be cached if we won't change mod/sum
COPY go.mod .
COPY go.sum .
# Get dependancies - will also be cached if we won't change mod/sum
RUN go mod download
COPY . .
# Build the Go app,编译到容器内/go/bin/go-docker目录
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o /go/bin/go-docker
# docker容器内时间不对,设置时间准确
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
#Docker运行时内部监听80端口和应用程序80保持一致
EXPOSE 80
ENTRYPOINT ["/go/bin/go-docker"]
工程根目录编写make_image.sh文件,用于构建镜像,内容如下
docker build -t web-gin .
工程根目录编写run_image.sh文件,用于运行镜像,内容如下
docker run -d -p 10001:80 web-gin
后两者不必须,直接输Docker命令也可以,之所以这么做是为了后续批量跑脚本运维方便,更改起来也方便,注意需要赋予权限chmod +x *.sh
中途编辑的时候发现vim 无法对go、Dockerfile文件都无法高亮,go vim高亮执行以下命令,
wget https://storage.googleapis.com/golang/go1.3.3.src.tar.gz
tar -zxvf go1.3.3.src.tar.gz
cp -R go/misc/vim/syntax/ /usr/share/vim/vim74/
cp -R go/misc/vim/ftplugin/ /usr/share/vim/vim74/
cp -R go/misc/vim/indent/ /usr/share/vim/vim74/
cp -R go/misc/vim/compiler/ /usr/share/vim/vim74/
cp -R go/misc/vim/ftdetect/ /usr/share/vim/vim74/
样式如下:
Dockerfile vim高亮链接文件下载:
pan.baidu.com/s/1NJKrHP56…
提取码:q7dx
解压复制文件到机器上,执行以下命令
chmod +x dockerfile.sh
./dockerfile.sh
样式如下:
开始编译Docker Image,到工程目录下执行./make_image.sh
,开始执行Dockerfile:
直到结束查看镜像制作完成,输入docker images
,以下代表制作完成
REPOSITORY TAG IMAGE ID CREATED SIZE
web-gin latest b7bdacb961b4 46 minutes ago 1.2GB
开始执行镜像,输入./run_image.sh
,执行完毕输入docker ps
查看镜像是否启动
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6c12f2c0926a web-gin "/go/bin/go-docker" 49 minutes ago Up 49 minutes 0.0.0.0:10001->80/tcp, :::10001->80/tcp
以上等同于启动一个docker镜像,该镜像是一个go语言编写的web项目,监听80端口,镜像启动为10001端口,外网验证时需要在防火墙关闭10001端口,如何关闭防火墙请查看从零开始搭建后台服务 - 装机篇,外网验证如下:
以上本人第一个Docker镜像,第一个Go Web应用正式上线,接下来会对这个应用做反向代理,验证用户->Nginx->Docker->Golang的程序的性能调优,关注从零开始搭建后台服务 - Nginx(02) 性能测试和Nginx调优