You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
178 lines
5.0 KiB
178 lines
5.0 KiB
package common
|
|
|
|
import (
|
|
// "fmt"
|
|
"context"
|
|
"log"
|
|
"os"
|
|
"time"
|
|
|
|
"github.com/go-redis/redis/v8"
|
|
"github.com/spf13/viper"
|
|
"gorm.io/driver/mysql"
|
|
"gorm.io/gorm"
|
|
"gorm.io/gorm/logger"
|
|
)
|
|
|
|
func GetConsulConfig(url string, fileKey string) (*viper.Viper, error) {
|
|
conf := viper.New()
|
|
conf.AddRemoteProvider("consul", url, fileKey)
|
|
conf.SetConfigType("json")
|
|
err := conf.ReadRemoteConfig()
|
|
if err != nil {
|
|
log.Println("viper conf err:", err)
|
|
}
|
|
return conf, nil
|
|
|
|
// conf := viper.New()
|
|
// conf.AddRemoteProvider("consul", url, fileKey)
|
|
// conf.SetConfigType("json")
|
|
|
|
// err := conf.ReadRemoteConfig()
|
|
// if err != nil {
|
|
// log.Printf("viper配置读取错误: %v", err)
|
|
// // 返回错误而不是nil Viper实例
|
|
// return nil, fmt.Errorf("无法从Consul读取配置: %w", err)
|
|
// }
|
|
|
|
// // 验证配置是否真的读取到了内容
|
|
// if len(conf.AllKeys()) == 0 {
|
|
// return nil, fmt.Errorf("配置读取成功但未找到任何配置项")
|
|
// }
|
|
|
|
// return conf, nil
|
|
}
|
|
|
|
func GetMysqlFromConsul(vip *viper.Viper) (db *gorm.DB, err error) {
|
|
// 添加配置值检查
|
|
// host := vip.GetString("host")
|
|
// port := vip.GetString("port")
|
|
// user := vip.GetString("user")
|
|
// database := vip.GetString("database")
|
|
|
|
// log.Printf("数据库配置 - host:%s, port:%s, user:%s, database:%s", host, port, user, database)
|
|
|
|
// // 检查必要配置是否存在
|
|
// if host == "" || port == "" || user == "" || database == "" {
|
|
// return nil, fmt.Errorf("数据库配置不完整")
|
|
// }
|
|
|
|
newLogger := logger.New(
|
|
log.New(os.Stdout, "\r\n", log.LstdFlags),
|
|
logger.Config{
|
|
SlowThreshold: time.Second,
|
|
LogLevel: logger.Info,
|
|
Colorful: true,
|
|
},
|
|
)
|
|
str := vip.GetString("user") + ":" + vip.GetString("pwd") + "@tcp(" + vip.GetString("host") + ":" + vip.GetString("port") + ")/" + vip.GetString("database") + "?charset=utf8mb4&parseTime=True&loc=Local"
|
|
db, err = gorm.Open(mysql.Open(str), &gorm.Config{Logger: newLogger})
|
|
if err != nil {
|
|
log.Println("db err:", err)
|
|
}
|
|
return db, nil
|
|
}
|
|
|
|
// 获取Redis配置
|
|
func GetRedisFromConsul(vip *viper.Viper) (red *redis.Client, err error) {
|
|
red = redis.NewClient(&redis.Options{
|
|
Addr: vip.GetString("addr"),
|
|
Password: vip.GetString("password"),
|
|
DB: vip.GetInt("DB"),
|
|
PoolSize: vip.GetInt("poolSize"),
|
|
MinIdleConns: vip.GetInt("minIdleConns"),
|
|
})
|
|
//集群的配法
|
|
// clusterClients := redis.NewClusterClient(
|
|
// &redis.ClusterOptions{
|
|
// Addrs: []string{"vmware1Ip:port", "vmware2Ip:port", "vmware3Ip:port"},
|
|
// })
|
|
// fmt.Println(clusterClients)
|
|
|
|
return red, nil
|
|
|
|
// ⭐ 添加详细调试
|
|
// fmt.Println("=== GetRedisFromConsul调试信息 ===")
|
|
|
|
// // 打印所有可用的键
|
|
// fmt.Printf("所有配置键: %v\n", vip.AllKeys())
|
|
|
|
// // 逐个检查每个字段
|
|
// addr := vip.GetString("addr")
|
|
// password := vip.GetString("password")
|
|
// db := vip.GetInt("DB")
|
|
// poolSize := vip.GetInt("poolSize")
|
|
// minIdleConn := vip.GetInt("minIdleConn")
|
|
|
|
// fmt.Printf("addr: %s (类型: %T)\n", addr, addr)
|
|
// fmt.Printf("password: %s\n", password)
|
|
// fmt.Printf("DB: %d (成功读取: %v)\n", db, db != 0)
|
|
// fmt.Printf("poolSize: %d\n", poolSize)
|
|
// fmt.Printf("minIdleConn: %d\n", minIdleConn)
|
|
|
|
// // 尝试不同的字段名变体
|
|
// fmt.Println("--- 尝试不同的字段名 ---")
|
|
// fmt.Printf("GetInt(\"db\"): %d\n", vip.GetInt("db")) // 小写
|
|
// fmt.Printf("GetInt(\"Db\"): %d\n", vip.GetInt("Db")) // 混合
|
|
// fmt.Printf("GetInt(\"minIdleConns\"): %d\n", vip.GetInt("minIdleConns")) // 复数
|
|
|
|
// // 获取原始值
|
|
// if vip.IsSet("DB") {
|
|
// rawDB := vip.Get("DB")
|
|
// fmt.Printf("原始DB值: %v (类型: %T)\n", rawDB, rawDB)
|
|
// }
|
|
|
|
// // 创建Redis客户端
|
|
// red = redis.NewClient(&redis.Options{
|
|
// Addr: addr,
|
|
// Password: password,
|
|
// DB: db,
|
|
// PoolSize: poolSize,
|
|
// MinIdleConns: minIdleConn,
|
|
// })
|
|
|
|
// // 测试连接
|
|
// ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
|
|
// defer cancel()
|
|
|
|
// _, err = red.Ping(ctx).Result()
|
|
// if err != nil {
|
|
// fmt.Printf("❌ Redis连接测试失败: %v\n", err)
|
|
// // 尝试使用硬编码地址
|
|
// fmt.Println("尝试使用硬编码地址...")
|
|
// red = redis.NewClient(&redis.Options{
|
|
// Addr: "192.168.71.200:6379",
|
|
// Password: "",
|
|
// DB: 0,
|
|
// PoolSize: 30,
|
|
// MinIdleConns: 30,
|
|
// })
|
|
|
|
// _, err = red.Ping(ctx).Result()
|
|
// if err != nil {
|
|
// fmt.Printf("❌ 硬编码连接也失败: %v\n", err)
|
|
// } else {
|
|
// fmt.Println("✅ 硬编码连接成功")
|
|
// }
|
|
// } else {
|
|
// fmt.Println("✅ Redis连接成功")
|
|
// }
|
|
|
|
// return red, err
|
|
|
|
}
|
|
|
|
// 设置用户登录信息
|
|
func SetUserToken(red *redis.Client, key string, val []byte, timeTTL time.Duration) {
|
|
red.Set(context.Background(), key, val, timeTTL)
|
|
}
|
|
|
|
// 获取用户登录信息
|
|
func GetUserToken(red *redis.Client, key string) string {
|
|
res, err := red.Get(context.Background(), key).Result()
|
|
if err != nil {
|
|
log.Print("GetUserToken err", err)
|
|
}
|
|
return res
|
|
}
|