• 全栈博客开发(三)完善项目并容器化


    原文链接:

    https://llfc.club/category?catid=20RbopkFO8nsJafpgCwwxXoCWAs#!aid/21lXHiY0k69T0TXhqqk9BsrlPZy

    本节目标

    上一节完成了模板渲染,业余时间我增加了几个页面,大家可以根据分支去查看每天做的工作,这一节增加配置文件的读取,完成redis缓存的添加,一些信息优先访问redis缓存,另外增加日志库打印日志,最后完成项目的容器化

    redis缓存

    之前的文章讲述过redis的增删改查,这里也和之前redis操作类似,增加文章的查询效率。
    初始化redis连接池

    func InitRedis() {
    	rediscli = redis.NewClient(&redis.Options{
    		Addr:         config.TotalCfgData.Redis.Host,
    		Password:     config.TotalCfgData.Redis.Passwd,
    		DB:           config.TotalCfgData.Redis.DB,
    		PoolSize:     config.TotalCfgData.Redis.PoolSize,
    		MinIdleConns: config.TotalCfgData.Redis.IdleCons,
    	})
     
    	_, err := rediscli.Ping().Result()
    	if err != nil {
    		log.Println("ping failed, error is ", err)
    		return
    	}
     
    	clearch = make(chan struct{}, 1000)
    	exitch = make(chan struct{})
    	log.Println("redis init success!!!")
    }
    

      比如我们将session保存在redis中

    func AddAdminSession(sessionId string, sessionData string) error {
    	_, err := rediscli.HSet(ADMIN_SESSION, sessionId, sessionData).Result()
    	rediscli.Expire(ADMIN_SESSION, time.Hour*24*30)
    	return err
    }
    

      

    依此类推,增加了很多redis读写模块,不一一赘述了。

    配置文件读取

    服务器用到的配置文件我写在config/config.toml中

    [mongo]
        host = "81.68.86.123:27017"
        user = "admin"
        passwd = "12345678"
        maxpoolsize = 10
        contimeout  = "5000"
        maxconidle = "5000"
        database = "blog"
     
    [cookie]
        host = "81.68.86.123"
        #本地启动请设置host为本地
        #host = "localhost"
        alive = 86400
     
    [location]
        timezone = "Asia/Shanghai"
     
    [redis]
        host = "81.68.86.123:6379"
        idlecons = 16
        poolsize = 1024
        idletimeout = 300
        passwd = "123456"
        db = 0
    

      然后实现了config.go用来读取配置文件

    package config
     
    import (
    	"log"
     
    	"flag"
     
    	"github.com/BurntSushi/toml"
    )
     
    type MongoCfg struct {
    	User        string `toml: "user"`
    	Passwd      string `toml: "passwd"`
    	Host        string `toml: "host"`
    	MaxPoolSize int16  `toml: "maxpoolsize"`
    	MaxConIdle  string `toml:"maxconidle"`
    	ConTimeOut  string `toml: "contimeout"`
    	Database    string `toml: "database"`
    }
     
    type CookieCfg struct {
    	Host  string `toml: "host"`
    	Alive int    `toml: "alive"`
    }
     
    type RedisCfg struct {
    	Host        string `toml: "host"`
    	PoolSize    int    `toml: "poolsize"`
    	IdleCons    int    `toml: "idlecons"`
    	IdleTimeout int    `toml: "idletimeout"`
    	Passwd      string `toml: "passwd"`
    	DB          int    `toml: "db"`
    }
     
    type TotalCfg struct {
    	Mongo     MongoCfg  `toml: "mongo"`
    	Cookie    CookieCfg `toml: "cookie"`
    	Location_ Location  `toml:"location"`
    	Redis     RedisCfg  `toml:"redis"`
    }
     
    type Location struct {
    	TimeZone string `toml:"timezone"`
    }
     
    var TotalCfgData TotalCfg
     
    func init() {
    	cfgpath := flag.String("config", "./config/config.toml", "-config ./config/config.toml")
    	flag.Parse()
    	if _, err := toml.DecodeFile(*cfgpath, &TotalCfgData); err != nil {
    		log.Println("decode file failed , error is ", err)
    		panic("decode file failed")
    	}
    }
    

      

    上述代码根据toml标签读取配置文件将对应字段写入结构体对象中,就完成了读取。

    增加日志库

    对于日志库的选择,我选择了uber提供的zap库,同时配合lumberjack完成日志切割

    package logger
     
    import (
    	"github.com/natefinch/lumberjack"
    	"go.uber.org/zap"
    	"go.uber.org/zap/zapcore"
    )
     
    var Sugar *zap.SugaredLogger = nil
     
    func getLogWriter() zapcore.WriteSyncer {
     
    	lumberJackLogger := &lumberjack.Logger{
    		Filename:   "./log/blog.log",
    		MaxSize:    10,
    		MaxBackups: 5,
    		MaxAge:     30,
    		Compress:   false,
    	}
     
    	return zapcore.AddSync(lumberJackLogger)
    }
     
    func init() {
    	// 编码器配置
    	config := zap.NewProductionEncoderConfig()
    	// 指定时间编码器
    	config.EncodeTime = zapcore.ISO8601TimeEncoder
    	// 日志级别用大写
    	config.EncodeLevel = zapcore.CapitalLevelEncoder
    	// 编码器
    	encoder := zapcore.NewConsoleEncoder(config)
    	writeSyncer := getLogWriter()
    	// 创建Logger
    	core := zapcore.NewCore(encoder, writeSyncer, zapcore.DebugLevel)
    	logger := zap.New(core, zap.AddCaller())
    	Sugar = logger.Sugar()
    	// 打印日志
    	Sugar.Info("logger init success")
    }
    

      

    设置日志文件最大10M,最多备份五个文件,最长时间为30天,同时可以支持打印行号等功能。

    容器化

    先实现dockerfile,然后生成镜像

    FROM golang:1.16
    # 为我们的镜像设置必要的环境变量
    ENV GO111MODULE=on \
        CGO_ENABLED=0 \
        GOOS=linux \
        GOARCH=amd64 \
    	GOPROXY="https://goproxy.cn,direct"
     
    ENV TZ=Asia/Shanghai
     
    # 创建代码目录
    WORKDIR  /src
    # copy代码放入代码目录
    COPY . .
    # 将代码编译为二进制可执行文件
    RUN go build -o main .
    # 创建运行运行环境
    WORKDIR /bin
    #将二进制文件从 /src 移动到/bin
    RUN cp /src/main .
    # 将项目所需配置和static资源copy至该目录
    RUN cp -r /src/config .
    RUN cp -r /src/public .
    RUN cp -r /src/views .
     
    # 暴露端口对外服务
    EXPOSE 8080
     
    # 启动容器运行命令
    CMD ["/bin/main"]
    

    设置ENV准备了golang的运行环境,时区设置为上海,工作目录为/src,然后将源码由宿主机拷贝进入镜像编译并运行
    在项目的根目录,执行如下命令生成镜像

    docker build -t blog .
    

      启动容器即可

    docker run --name blogds -p 8088:8088 -v /data/blog/log:/bin/log  --restart=always  -d blog
    

      

    总结

    到目前为止,我们完成了博客系统后台的开发,仅用三篇文章无法全部说明其中细节,只是列举了后台系统经历的几个阶段,具体代码可以去github看看,谢谢大家赏星。
    源码地址:
    https://github.com/secondtonone1/bstgo-blog

    谢谢关注我的公众号

  • 相关阅读:
    一天一道算法题---6.8--数学题
    TOJ----1037---最大独立集
    一天一道算法题---6.6---排列递推(我不会)
    一天一道算法题---6.4--中途相遇法
    一天一道算法题--6.5--数学题
    夜太美---酒不醉--人自醉
    SSH组合之Spring3整合Hibernate4(一)
    Hibernater入门
    Java微信公众平台进入开发模式
    新浪sae平台进行数据库的连接
  • 原文地址:https://www.cnblogs.com/secondtonone1/p/15642761.html
Copyright © 2020-2023  润新知