当前位置:   article > 正文

golang web服务搭建学习和优雅的停止服务

golang web服务搭建学习和优雅的停止服务

golang web服务搭建学习和优雅的停止服务

这里分享一下golang web服务搭建过程,仅分享安装搭建过程中的配置,相关工具的安装请自行下载安装:

项目打包使用了(go-bindata)包实现将项目静态配置文件编译成二进制嵌入到go文件中,解决了打包时候因相对路径问题,导致的二进制文件不能再任何目录下运行
优雅的启停服务

环境

  1. centos7.8
  2. golang1.15.*
  3. supervisor
  4. 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
)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

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)
}


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64

二进制编译

在二进制编译文件执行过程中遇到问题:在非命令执行的目录下运行二进制文件会到时配置文件无法正常加载

解决方案:使用go-bindata打包配置文件嵌入到二进制文件

    //命令:会在项目当前目录下生成编译文件
    go build
    
    //在{gopath}/bin/目录下生成编译文件
    go install
    
    //将编译文件移动到相应的位置执行
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

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;
        }
    }

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

福利彩蛋:没有好玩的 API 接口?上百款免费接口等你来,免费 API,免费 API 大全

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/天景科技苑/article/detail/790195
推荐阅读
相关标签
  

闽ICP备14008679号