1. 配置文件解析
使用配置文件解析神器viper
,链接,文件类型为可读性较高的yaml
,先下载vper
go get github.com/spf13/viper
在/config
目录下新建config.yaml
文件,暂时添加以下内容
server:
AppMode: "debug"
HttpPort: ":8080"
mysql:
Host: "192.168.18.3"
Port: "3306"
User: "root"
Password: "123456"
Name: "douyin"
redis:
Host: "192.168.18.3"
Port: "6379"
Password: "123456"
rabbitmq:
Host: "192.168.18.3"
Port: "5672"
User: "guest"
Password: "guest"
jwt:
secret: "douyin"
ssh:
Host: "192.168.18.3"
User: "ftpuser"
Password: "123456"
ftp:
Host: "192.168.18.3"
Port: "21"
User: "ftpuser"
Password: "123456"
在/global
目录下新建config.go
文件存放和加载配置类,先创建配置类和全局配置变量Config
type Server struct {
AppMode string
HttpPort string
}
type Mysql struct {
Host string
Port string
User string
Password string
Name string
}
type Redis struct {
Host string
Port string
Password string
}
type RabbitMq struct {
Host string
Port string
User string
Password string
}
type Jwt struct {
secret string
}
type Ssh struct {
Host string
User string
Password string
}
type Ftp struct {
Host string
Port string
User string
Password string
}
type ConfigEnv struct {
Server Server
Mysql Mysql
Redis Redis
RabbitMq RabbitMq
Jwt Jwt
Ssh Ssh
Ftp Ftp
}
var Config ConfigEnv
用viper解析配置文件
func LoadConfig() {
viper.SetConfigName("config")
viper.SetConfigType("yaml")
// viper.AddConfigPath("./config") 用相对路径在项目其他地方调用时路径会出错
viper.AddConfigPath("/Users/cengdong/GolandProjects/faker-douyin/config")
err := viper.ReadInConfig()
if err != nil {
panic(fmt.Errorf("fatal error config file: %w", err))
}
LoadServerConfig()
LoadMysqlConfig()
LoadRedisConfig()
LoadRabbitMqConfig()
LoadJwtConfig()
LoadSshConfig()
LoadFtpConfig()
fmt.Println("配置加载完毕")
fmt.Println(Config)
}
func LoadServerConfig() {
Config.Server.AppMode = viper.GetString("server.AppMode")
Config.Server.HttpPort = viper.GetString("server.HttpPort")
}
func LoadMysqlConfig() {
Config.Mysql.Host = viper.GetString("mysql.Host")
Config.Mysql.Port = viper.GetString("mysql.Port")
Config.Mysql.User = viper.GetString("mysql.User")
Config.Mysql.Password = viper.GetString("mysql.Password")
Config.Mysql.Name = viper.GetString("mysql.Name")
}
func LoadRedisConfig() {
Config.Redis.Host = viper.GetString("redis.Host")
Config.Redis.Port = viper.GetString("redis.Port")
Config.Redis.Password = viper.GetString("redis.Password")
}
func LoadRabbitMqConfig() {
Config.RabbitMq.Host = viper.GetString("rabbitmq.Host")
Config.RabbitMq.Port = viper.GetString("rabbitmq.Port")
Config.RabbitMq.User = viper.GetString("rabbitmq.User")
Config.RabbitMq.Password = viper.GetString("rabbitmq.Password")
}
func LoadJwtConfig() {
Config.Jwt.secret = viper.GetString("jwt.secret")
}
func LoadSshConfig() {
Config.Ssh.Host = viper.GetString("ssh.Host")
Config.Ssh.User = viper.GetString("ssh.User")
Config.Ssh.Password = viper.GetString("ssh.Password")
}
func LoadFtpConfig() {
Config.Ftp.Host = viper.GetString("ftp.Host")
Config.Ftp.Port = viper.GetString("ftp.Port")
Config.Ftp.User = viper.GetString("ftp.User")
Config.Ftp.Password = viper.GetString("ftp.Password")
}
main.go中调用LoadConfig
函数
2. Gorm连接Mysql数据库
安装
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql
连接,在/model
目录下新建dao
目录,新建initDao.go文件
package dao
import (
"faker-douyin/global"
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"gorm.io/gorm/logger"
"log"
"os"
"time"
)
var (
Db *gorm.DB
)
func Init() {
mysqlLogger := logger.New(
log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer
logger.Config{
SlowThreshold: time.Second, // 慢 SQL 阈值
LogLevel: logger.Info, // Log level
Colorful: true, // 彩色打印
},
)
dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local",
global.Config.Mysql.User, global.Config.Mysql.Password, global.Config.Mysql.Host, global.Config.Mysql.Port,
global.Config.Mysql.Name)
var err error
Db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{Logger: mysqlLogger})
if err != nil {
log.Panicln("err:", err.Error())
}
fmt.Println("数据库链接成功")
}
DB, err := Db.DB()
if err != nil {
panic(fmt.Sprintf("数据库初始化配置失败,%s", err))
}
// SetMaxIdleConns 设置空闲连接池中连接的最大数量
DB.SetMaxIdleConns(10)
// SetMaxOpenConns 设置打开数据库连接的最大数量。
DB.SetMaxOpenConns(100)
// SetConnMaxLifetime 设置了连接可复用的最大时间。
DB.SetConnMaxLifetime(10 * time.Second)