从零开始搭建后台服务 - 编程语言Golang(01)

906 阅读4分钟

前言

服务器基础环境搭好了,接下来少不了编程语言的选择,此次我选择未学习过的Golang语言作为挑战,原因很简单,高性能易部署,公司后端同事技术栈都是基于Golang,学习的同时也可以向他们请教。

目标

服务器部署Web应用程序,端口号10001,使用Docker容器进行部署,部署完后用Jmeter-5.5进行机器生产环境测试验收,并完成从零开始搭建后台服务(IAA业务)- Nginx(02)系列集成测试,整篇系列中只会从实战角度选择性学习,不会千篇一律的先来一套Golang语言入门之类,这基本记不住,而且市面上也有很多教程。

安装开发环境

Golang开发包,选择当前最新版本Golang-1.18.8,IDE选择GoLand-2022.2.4,注意:链接都是Windows版本。点击安装,点击下一步完成安装,配置环境变量如下

image.png

测试,在命令行中,输入: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工具,又访问不了,这次没有办法了,只能开启工具,登入成功

image.png

创建新工程:

image.png

新建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

image.png

image.png

第一个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/

样式如下:
image.png

Dockerfile vim高亮链接文件下载:
pan.baidu.com/s/1NJKrHP56…
提取码:q7dx
解压复制文件到机器上,执行以下命令

chmod +x dockerfile.sh
./dockerfile.sh

样式如下:

image.png

开始编译Docker Image,到工程目录下执行./make_image.sh,开始执行Dockerfile:

image.png
直到结束查看镜像制作完成,输入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端口,如何关闭防火墙请查看从零开始搭建后台服务 - 装机篇,外网验证如下:

image.png

以上本人第一个Docker镜像,第一个Go Web应用正式上线,接下来会对这个应用做反向代理,验证用户->Nginx->Docker->Golang的程序的性能调优,关注从零开始搭建后台服务 - Nginx(02) 性能测试和Nginx调优