golang web服务搭建学习和优雅的停止服务
这里分享一下golang web服务搭建过程,仅分享安装搭建过程中的配置,相关工具的安装请自行下载安装:
项目打包使用了(go-bindata)包实现将项目静态配置文件编译成二进制嵌入到go文件中,解决了打包时候因相对路径问题,导致的二进制文件不能再任何目录下运行
优雅的启停服务
环境
- centos7.8
- golang1.15.*
- supervisor
- git (用于项目代码拉取)
代码配置
go mod文件
该示例使用go mod进行依赖包管理
module goleaning
go 1.15
require (
github.com/gin-gonic/gin v1.6.3
github.com/go-sql-driver/mysql v1.4.1
github.com/go-xorm/xorm v0.7.9
github.com/fvbock/endless
github.com/gohouse/converter v0.0.3 // indirect
github.com/gohouse/gorose v1.0.5 // indirect
github.com/jteeuwen/go-bindata v3.0.7+incompatible // indirect
)
demo的入口文件
package main
import (
"encoding/json"
"fmt"
"goleaning/tool"
"log"
"net/http"
"strings"
"github.com/fvbock/endless"
)
func parseParams(w http.ResponseWriter, r *http.Request) {
r.ParseForm() //解析参数,默认是不会解析的
fmt.Println(r.Form) //这些信息是输出到服务器端的打印信息
fmt.Println("path", r.URL.Path)
fmt.Println("scheme", r.URL.Scheme)
fmt.Println(r.Form["url_long"])
for k, v := range r.Form {
fmt.Println("key:", k)
fmt.Println("val:", strings.Join(v, ""))
}
fmt.Fprintf(w, "Hello astaxie!") //这个写入到w的是输出到客户端的
}
func main() {
getConf()
http.HandleFunc("/", parseParams) //设置访问的路由
address := fmt.Sprintf("%s:%s", "", viper.GetString("app.port"))
s := initServer(address, app)
// 保证文本顺序输出
// In order to ensure that the text order output can be deleted
time.Sleep(10 * time.Microsecond)
fmt.Println("info", "server run success on ", address)
fmt.Println("error", "initServer server error ", s.ListenAndServe().Error())
}
type server interface {
ListenAndServe() error
}
// 初始化服务
func initServer(address string, router *gin.Engine) server {
s := endless.NewServer(address, router)
s.ReadHeaderTimeout = 20 * time.Second
s.WriteTimeout = 20 * time.Second
s.MaxHeaderBytes = 1 << 20
return s
}
var cfg interface{}
func getConf() {
conf, err := tool.Asset("config/apps.json")
if err != nil {
fmt.Println(err)
}
json.Unmarshal(conf, &cfg)
fmt.Println(cfg)
}
二进制编译
在二进制编译文件执行过程中遇到问题:在非命令执行的目录下运行二进制文件会到时配置文件无法正常加载
解决方案:使用go-bindata打包配置文件嵌入到二进制文件
//命令:会在项目当前目录下生成编译文件
go build
//在{gopath}/bin/目录下生成编译文件
go install
//将编译文件移动到相应的位置执行
nginx 配置
nginx代理到相应的监听端口
server {
charset utf-8;
client_max_body_size 128M;
server_name api.go.cn;
location / {
try_files $uri @backend;
}
location @backend {
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $http_host;
proxy_pass http://127.0.0.1:8001;
}
}
福利彩蛋:没有好玩的 API 接口?上百款免费接口等你来,免费 API,免费 API 大全