本文由 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

基本使用

配置定义

suno:
cookie: "12321312312321"

配置结构体

package autoload

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

全局变量

package internal

import "go-suno/config/autoload"

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

初始化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)
}
})
}

测试效果

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()
}

设置配置文件

启动项目

go run main.go

访问测试接口

完整代码

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

关于我们

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

简单实现Viper配置管理的更多相关文章

  1. viper配置管理

    安装 go get github.com/spf13/viper viper支持的功能 1.可以设置默认值 2.可以加载多种格式的配置文件,如JSON,TOML,YAML,HCL和Java属性配置文件 ...

  2. MVC、MVCS、MVVM、MVP、VIPER等这么多架构模式哪一个好呢?

    在项目开启阶段,其中一个很重要的环节就是选架构. 那么面对目前已知的这么多架构模式我们该怎么选择呢?这确实是个很让人头疼的问题!   下面我就在这里梳理一下目前常见的一些架构模式. 先逐个对它们的分析 ...

  3. golangHTML标签提取器soup

    什么是soup 类似python中beatifulsoup,用于提取html标签提取,多用于爬虫.它可以很好的处理不规范标记并生成剖析树(parse tree). 它提供简单又常用的导航,搜索以及修改 ...

  4. golang常用库:cli命令行/应用程序生成工具-cobra使用

    golang常用库:cli命令行/应用程序生成工具-cobra使用 一.Cobra 介绍 我前面有一篇文章介绍了配置文件解析库 Viper 的使用,这篇介绍 Cobra 的使用,你猜的没错,这 2 个 ...

  5. devops工具-Ansible基础

    一.Ansible介绍 简介     Ansible使用Python语言开发,是一个配置管理型工具,与之类似的工具还有Puppet.SaltStack.chef等,默认通过SSH协议进行远程命令执行或 ...

  6. golang 杂思

    正文 这里给大家总结一些 Go player 开发小技巧. 欢迎批评和交流, 望大家喜欢. 1. 配置管理 推荐一种简单粗暴的配置管理方式 [配置 映射 内部结构]. 例如有个配置文件 config. ...

  7. Zookeeper入门看这篇就够了!!

    Zookeeper是什么 官方文档上这么解释zookeeper,它是一个分布式服务框架,是Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名 ...

  8. [转帖]Zookeeper入门看这篇就够了

    Zookeeper入门看这篇就够了 https://my.oschina.net/u/3796575/blog/1845035 Zookeeper是什么 官方文档上这么解释zookeeper,它是一个 ...

  9. zookeeper入门(1)---基本概念

    转载 : https://blog.csdn.net/java_66666/article/details/81015302 一. zookeeper概念 它是一个分布式服务框架,是Apache Ha ...

  10. Zookeeper入门(一)

      Zookeeper是分布式服务治理中间件   一.Zookeeper的简介   官方文档上这么解释zookeeper,它是一个分布式服务框架,是Apache Hadoop 的一个子项目,它主要是用 ...

随机推荐

  1. 阿里云何万青:南坡VS北坡,阿里云高性能计算行业实践

    ​简介:北坡模式:借助于云上大计算性能突破来提供HPC服务,切入的重点更加聚焦于云服务. 随着数字化转型的深入,行业应用对算力提出更高要求.为满足不同行业灵活的业务形态与计算需求,以云计算技术为服务模 ...

  2. [FAQ] Quasar BEX Bridge 通信方式 this.$q.bex 未定义的问题

      Bridge 是一个基于 Promise 的事件系统,在BEX的所有部分之间共享,允许在你的Quasar App中监听事件,从其它部分发出它们. 你可以使用 $q.bex 从你的 Quasar A ...

  3. [Go] gorm 返回指定模型数据的处理方式

    重新 var 声明一个变量,类型为包含指定字段的结构体. 查询的时候,还是使用原始模型类型的变量. example: // For return data var retMember struct { ...

  4. [FAQ] Member "address" not found or not visible after argument-dependent lookup in address payable.

    顾名思义,address 属性不存在,请检查调用方. 比如:msg.sender.address 会有此提示,在 Solidity Contract 中,msg.sender.balance 是存在的 ...

  5. C++里也有菱形运算符?

    最近在翻<c++函数式编程>的时候看到有一小节在说c++14新增了"菱形运算符".我寻思c++里好像没什么运算符叫这名字啊,而且c++14新增的功能很少,我也不记得有添 ...

  6. 算法~利用zset实现滑动窗口限流

    滑动窗口限流 滑动窗口限流是一种常用的限流算法,通过维护一个固定大小的窗口,在单位时间内允许通过的请求次数不超过设定的阈值.具体来说,滑动窗口限流算法通常包括以下几个步骤: 初始化:设置窗口大小.请求 ...

  7. 异构数据源同步之表结构同步 → 通过 jdbc 实现,没那么简单

    开心一刻 今天坐沙发上看电视,旁边的老婆拿着手机贴了过来 老婆:老公,这次出门旅游,机票我准备买了哈 我:嗯 老婆:你.我.你爸妈.我爸妈,一共六张票 老婆:这上面还有意外保险,要不要买? 我:都特么 ...

  8. python 操作xls

    目录 写入文件 demo01 demo02 写入文件 demo01 # 读取:xlrd # 写入:xlwt # 修改(追加写入):xlutils import xlrd import xlwt fro ...

  9. elasticsearch 6.2.4和elasticsearch-head环境搭建 使用docker-compose方式

    elasticsearch 6.2.4和elasticsearch-head测试环境搭建 使用docker-compose方式 一 背景说明 对于新手来说搭建一个elasticsearch的测试环境稍 ...

  10. 鸿蒙HarmonyOS实战-ArkUI事件(单一手势)

    一.单一手势 应用程序的手势操作是指在移动设备上使用手指或手势进行与应用程序交互的方式.手势操作可以包括点击.滑动.双击.捏合等动作,用于实现不同的功能和操作. HarmonyOS中常见的手势操作及其 ...