简单实现Viper配置管理

本文由 ChatMoney团队出品

简介

前面实现的一个简易suno-api。是使用cookie来获取suno-token发起请求的。当时并没有通过配置的方式来获取cookie,而是直接在代码中写死了cookie的值,这种做法并不好,所以现在打算把cookie值改造为一个配置,通过viper来读取。

什么是viper

Viper是一个用于Go语言的应用程序配置库,它支持多种格式的配置文件,如JSON、YAML、TOML等,并且可以轻松地从环境变量、命令行参数、远程配置源等读取配置。Viper由Spf13开发,是Cobra和Hugo等项目的一部分。

安装

要开始使用Viper,首先需要安装它。可以使用Go的包管理工具go get来安装:

go get github.com/spf13/viper

简单实现Viper配置管理

基本使用

配置定义

suno:
  cookie: "12321312312321"

简单实现Viper配置管理

配置结构体

package autoload

type Config struct {
   *Suno `mapstructure:"suno"`
}

type Suno struct {
   Cookie string `mapstructure:"cookie"`
}

简单实现Viper配置管理

全局变量

package internal

import "go-suno/config/autoload"

var (
   // BasePath 项目根目录
   BasePath string
   // Conf 全局配置
   Conf *autoload.Config
)

简单实现Viper配置管理

初始化Viper

定义viper初始化方法,读取配置文件并绑定到配置结构体

package viper

import (
   "fmt"
   "github.com/fsnotify/fsnotify"
   "github.com/spf13/viper"
   "go-suno/internal"
   "log"
   "path"
   "runtime"
)

// Init 初始化viper
func Init() {
   _, filename, _, _ := runtime.Caller(0)
   internal.BasePath = path.Dir(path.Dir(path.Dir(filename)))

   viper.SetConfigFile(internal.BasePath + "/config/config.yaml") // 指定配置文件路径
   err := viper.ReadInConfig()                     // 读取配置信息
   if err != nil {                                 // 读取配置信息失败
      log.Fatal("viper.ReadInConfig() failed,err:" + err.Error())
   }

   // 把读取到的配置信息反序列化到Conf 变量中
   if err := viper.Unmarshal(&internal.Conf); err != nil {
      log.Fatal("viper.Unmarshal failed, err:" + err.Error())
   }

   // 监控配置文件变化
   viper.WatchConfig()
   viper.OnConfigChange(func(in fsnotify.Event) {
      fmt.Println("配置文件修改了")
      if err := viper.Unmarshal(&internal.Conf); err != nil {
         fmt.Printf("viper.Unmarshal failed, err:%v\n", err)
      }
   })
}

简单实现Viper配置管理

测试效果

main入口调用viper初始化方法,创建测试配置接口

package main

import (
   "github.com/gin-gonic/gin"
   "go-suno/internal"
   "go-suno/pkg/viper"
   "net/http"
)

func main() {
   r := gin.Default()
   // 配置加载
   viper.Init()
   // 使用中间件
   internal.RateLimitMiddleware(r, 1, 100)
   // 创建一个路由组,可以为其添加中间件
   handler := new(internal.Handler)
   v1 := r.Group("/api")
   {
      v1.POST("/gen", handler.GenMusic)
      v1.GET("/feed", handler.GetFeed)

      // 测试
      v1.GET("/config", func(c *gin.Context) {
         c.JSON(http.StatusOK, gin.H{
            "data":  internal.Conf.Suno.Cookie,
         })
      })
   }
   _ = r.Run()
}

简单实现Viper配置管理

设置配置文件

f0bfd24f-cf9b-451c-aeb2-aa2e86c652e9

启动项目

go run main.go

简单实现Viper配置管理

访问测试接口

687bbd9c-52d9-4eee-9c0f-0697617c64ef

完整代码

https://gitee.com/mofung1/go-suno

关于我们

本文由ChatMoney团队出品,ChatMoney专注于AI应用落地与变现,我们提供全套、持续更新的AI源码系统与可执行的变现方案,致力于帮助更多人利用AI来变现,欢迎进入ChatMoney获取更多AI变现方案!

ChatMoney的头像ChatMoney
上一篇 2024年 6月 5日 下午4:56
下一篇 2024年 6月 7日 下午3:51

相关推荐

  • 网页文件加载失败如何重试

    本文由 ChatMoney团队出品 在我们开发网站应用时,我们可能会遇到脚本加载失败的情况,导致脚本加载失败的原因有很多,比如用户的网络问题、终端设备问题、用户浏览器版本等诸多因素。 解决方案 在 JavaScript 中,我们可以创建一个监听来监听脚本加载失败的情况,然后针对加载失败的脚本进行重新加载。 重新加载的方案,一般是通过更换域名来解决。我们给每个…

    2024年 7月 16日
    112
  • PHP数据结构之栈

    本文由 ChatMoney团队出品 栈(Stack)是一种后进先出(Last In First Out, LIFO)的数据结构,它只允许在一端(称为栈顶)进行插入和删除操作。栈的应用非常广泛,例如在编程语言的函数调用中,每次函数调用都会将一个新的帧压入栈中,当函数返回时,该帧会被弹出。此外,栈还常用于解决某些算法问题,如括号匹配、深度优先搜索等。 栈的基本概…

    2024年 7月 8日
    410
  • 简单实现限流中间件

      本文由 ChatMoney团队出品 引言 在现代Web应用开发中,限流是一个重要的概念,它能够保护服务器免受流量攻击,确保服务的稳定性和可用性。Go语言以其高性能和并发处理能力在后端服务开发中广受欢迎。Gin是一个使用Go语言编写的Web框架,以其简洁和高效著称。在Gin框架中,通过中间件实现限流功能是一种常见的做法。 限流中间件的作用 限流中…

    2024年 6月 5日
    242
  • 面向对象设计基本原则

    本文由 ChatMoney团队出品 引言 在软件开发过程中,随着系统复杂度的增加和业务变更,程序员面临诸多挑战,如耦合性、内聚性、可维护性、可扩展性和可重用性。设计模式能有效地解决这些问题。设计模式蕴含了面向对象的精髓,掌握面向对象设计和分析是掌握设计模式的基础。它能帮助我们优化代码结构,提高代码的可维护性、可扩展性和可读性。 设计模式遵循一定的原则,这些原…

    2024年 8月 5日
    198
  • GPT 模型原理介绍以及应用

    本文由 ChatMoney团队出品 引言 随着人工智能技术的飞速发展,自然语言处理(NLP)领域也取得了显著的进步。其中,GPT(Generative Pre-trained Transformer)模型作为OpenAI的杰出成果,以其卓越的文本生成能力和广泛的应用前景,吸引了全球范围内的关注。本文将深入解析GPT模型的原理,帮助读者更好地理解这一技术的核心…

    2024年 6月 14日
    165

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信