设为首页 加入收藏

TOP

golang web 方案(二)
2019-05-23 14:32:53 】 浏览:131
Tags:golang web 方案
quot;` DBName string `toml:"db_name"` UserName string `toml:"user_name"` Password string `toml:"password"` } type loggerConfig struct { Level string `toml:"level"` Type string `toml:"type"` LogPath string `toml:"logPath"` } type fileConfig struct { UploadDir string `toml:"uploadDir"` DownloadDir string `toml:"downloadDir"` } var conf *Config func GetConfig() *Config { return conf } func InitConfig(confPath string) error { _, err := toml.DecodeFile(confPath, &conf) return err }

静态文件服务

本工程中静态文件服务的目的是为了发布前端. 前端采用 react 开发, build 之后的代码放在静态服务目录中. 使用 gin 框架的静态服务中间件, 很容易实现此功能:

// static files
r.Use(static.Serve("/", static.LocalFile("./public", true)))

// 没有路由匹配时, 回到首页
r.NoRoute(func(c *gin.Context) {
  c.File("./public/index.html")
})

上传/下载

上传/下载 在 gin 框架中都有支持.

  • 上传

    func UploadXls(c *gin.Context) {
      // ... 省略的处理
    
      // upload form field name: uploadXls, 这个名字和前端能对上就行
      // file 就是上传文件的文件流
      file, header, err := c.Request.FormFile("uploadXls")
      if err != nil {
        Fail(c, "param error: "+err.Error(), nil)
        return
      }
    
      // ... 省略的处理
    }
  • 下载

    func DownloadXls(c *gin.Context) {
      // ... 省略的处理
    
      c.File(downloadPath)
    }

发布

基于上面几个模块, 一般业务不是很复杂的小应用都可以胜任. 开发之后, 就是打包发布. 因为这个方案是针对小应用的, 所以把前后端都打包到一起作为一个整体发布.

docker 打包

之所有采用 docker 方式打包, 是因为这种方式易于分发. docker file 如下:

# 编译前端
FROM node:10.15-alpine as front-builder

WORKDIR /user
ARG VERSION=no-version
ADD ./frontend/app-ui .
RUN yarn
RUN yarn build


# 编译前端
FROM golang:1.12.5-alpine3.9 as back-builder

WORKDIR /go
RUN mkdir -p ./src/app-api
ADD ./backend/src/app-api ./src/app-api
RUN go install app-api


# 发布应用 (这里可以用个更小的 linux image)
FROM golang:1.12.5-alpine3.9

WORKDIR /app
COPY --from=front-builder /user/build ./public
COPY --from=back-builder /go/bin/app-api .
ADD ./deploy/builder/settings.toml .

CMD ["./app-api", "-f", "./settings.toml", "-prod"]

部署中遇到的问题

时区问题

docker 的官方 image 基本都是 UTC 时区的, 所以插入数据库的时间一般会慢 8 个小时. 所以, 在 docker 启动或者打包的时候, 需要对时区做一些处理.

  1. 数据库连接的设置

    // 连接字符串中加上: loc=Local
    var conStr = fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8&loc=Local",
      c.DB.UserName, c.DB.Password, c.DB.Host, c.DB.Port, c.DB.DBName)
  2. 数据库镜像的设置 (环境变量中设置时区)

    # -e TZ=Asia/Shanghai 就是设置时区
    docker run --name xxx -e TZ=Asia/Shanghai -d mysql:5.7
  3. 应用镜像的设置 (docker-compose.yml) 在 volumes 中设置时区和主机一样

    services:
    user:
      image: xxx:latest
      restart: always
      networks:
        - nnn
      volumes:
        - "/etc/localtime:/etc/localtime:ro"
首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇golang 1.12 自动补全 下一篇关于goquery的“non-standard imp..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目