ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-12-04 18:00:08  阅读:151  来源: 互联网

标签:容器 string err redis 博客 全栈 toml config log


原文链接:

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

标签:容器,string,err,redis,博客,全栈,toml,config,log
来源: https://www.cnblogs.com/secondtonone1/p/15642761.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有