go微服务框架Kratos笔记(四)使用nacos作为远端配置中心

初识nacos

nacos是阿里开源的一款用于动态服务发现、配置管理和服务管理的平台。

官方介绍,Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您实现动态服务发现、服务配置管理、服务及流量管理。
Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以”服务”为中心的现代应用架构(例如微服务范式、云原生范式)的服务基础设施。
官方文档

nacos的安装

根据文档启动一个nacos
nacos快速开始
在nacos中创建一个配置

go微服务框架Kratos笔记(四)使用nacos作为远端配置中心

在kratos中使用

package config

import (
    "fmt"
    "strings"

    "github.com/fsnotify/fsnotify"

    "github.com/nacos-group/nacos-sdk-go/clients"
    "github.com/nacos-group/nacos-sdk-go/common/constant"
    "github.com/nacos-group/nacos-sdk-go/vo"
    "github.com/spf13/viper"
)

//定义nacos配置
var (
    defaultConfig *viper.Viper //远程配置中心实例
    nacosIp       string       //nacosip地址
    nacosPort     uint64       //nacos端口
    nacosDataId   string       //nacos配置的DataID
    nacosGroup    string       //nacos配置的group分组
)

// ThisConf 初始化viper,读取本地配置文件(需在本地建立配置文件)
func ThisConf() *viper.Viper {
    localConfig := viper.New()                                //新建本地配置中心实例
    localConfig.SetConfigFile("..\\..\\configs\\config.yaml") //指定本地配置文件
    //读取配置文件
    if err := localConfig.ReadInConfig(); err != nil {
        panic(fmt.Errorf("Fatal error config file: %s \n", err))
    }
    //监控配置文件变化
    localConfig.WatchConfig()
    localConfig.OnConfigChange(func(in fsnotify.Event) {
        fmt.Println("配置文件热加载。。。")
    })
    return localConfig
}

// NacosInit 注册中心客户端配置
func NacosInit() vo.NacosClientParam {
    localConfig := ThisConf()   //初始化viper
    defaultConfig = viper.New() //连接远程的配置中心实例
    defaultConfig.SetConfigType("yaml") //配置的格式
    nacosIp = localConfig.GetString("nacos.ip")
    nacosPort = localConfig.GetUint64("nacos.prot")
    nacosDataId = localConfig.GetString("nacos.dataId")
    nacosGroup = localConfig.GetString("nacos.group")
    //连接注册中心配置
    return vo.NacosClientParam{
        //客户端配置
        ClientConfig: &constant.ClientConfig{
            NamespaceId:         localConfig.GetString("nacos.namespaceId"),
            TimeoutMs:           localConfig.GetUint64("nacos.timeoutMs"),
            NotLoadCacheAtStart: localConfig.GetBool("nacos.notLoadCacheAtStart"),
            LogDir:              localConfig.GetString("nacos.logDir"),
            CacheDir:            localConfig.GetString("nacos.cacheDir"),
            RotateTime:          localConfig.GetString("nacos.rotateTime"),
            MaxAge:              localConfig.GetInt64("nacos.maxAge"),
            LogLevel:            localConfig.GetString("nacos.logLevel"),
        },
        //服务端配置
        ServerConfigs: []constant.ServerConfig{
            {IpAddr: nacosIp, Port: nacosPort},
        },
    }
}

// InitConfig 初始化nacos配置中心
func InitConfig() *viper.Viper {
    nacosClient, err := clients.NewConfigClient(NacosInit())
    if err != nil {
        panic(fmt.Errorf("nacos初始化错误: %s \n", err))
    }
    content, err := nacosClient.GetConfig(vo.ConfigParam{DataId: nacosDataId, Group: nacosGroup})
    if err != nil {
        panic(fmt.Errorf("nacos读取配置错误: %s \n", err))
    }
    err = defaultConfig.ReadConfig(strings.NewReader(content))
    if err != nil {
        panic(fmt.Errorf("Viper解析配置失败: %s \n", err))
    }
    //配置监听
    err = nacosClient.ListenConfig(vo.ConfigParam{
        DataId: nacosDataId,
        Group:  nacosGroup,
        OnChange: func(namespace, group, dataId, data string) {
            fmt.Println("config changed group:" + group + ", dataId:" + dataId + ", content:" + data)
            //使用viper解析配置
            err = defaultConfig.ReadConfig(strings.NewReader(data))
            if err != nil {
                panic(fmt.Errorf("Viper解析配置失败: %s \n", err))
            }
        },
    })
    return defaultConfig
}

// GetConfig 获取配置
func GetConfig() *viper.Viper {
    if defaultConfig == nil {
        defaultConfig = InitConfig()
    }
    return defaultConfig
}

本文中使用viper配置管理工具,未使用kratos推荐的使用proto生态方案

使用方法

在需要引用配置的地方引用GetConfig()方法

// 例
config.GetConfig().GetString("data.database.source")

如有错误请留言反馈

Original: https://www.cnblogs.com/zly-go/p/15503573.html
Author: 悠悠听风
Title: go微服务框架Kratos笔记(四)使用nacos作为远端配置中心

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/516538/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Go – 关于 protoc 工具的小疑惑

    protoc 工具可以干什么? protoc 工具可以 通过相关插件 将 .proto 文件编译成 C、 C++、 Golang、 Java、 Python、 PHP 等多种语言的…

    Go语言 2023年5月25日
    054
  • 自己实现一个Controller——标准型

    标准Controller 上一篇通过一个简单的例子,编写了一个controller-manager,以及一个极简单的controller。从而对controller的开发有个最基本…

    Go语言 2023年5月25日
    086
  • muduo源码分析之TcpServer模块

    这次我们开始 muduo源代码的实际编写,首先我们知道 muduo是 LT模式, Reactor模式,下图为 Reactor模式的流程图[来源1] 然后我们来看下 muduo的整体…

    Go语言 2023年5月25日
    049
  • Excelize 发布 2.6.1 版本,支持工作簿加密

    Excelize 是 Go 语言编写的用于操作 Office Excel 文档基础库,基于 ECMA-376,ISO/IEC 29500 国际标准。可以使用它来读取、写入由 Mic…

    Go语言 2023年5月25日
    067
  • golang低级编程:一.unsafe包

    go语言在设计上确保了一些安全的属性,限制了程序可能出错的途径。例如严格的类型转换规则。但也使得很多实现的细节无法通过go程序来访问,例如对于聚合类型(如结构体)的内存布局,或者一…

    Go语言 2023年5月25日
    046
  • go-micro集成链路跟踪的方法和中间件原理

    前几天有个同学想了解下如何在go-micro中做链路跟踪,这几天正好看到wrapper这块,wrapper这个东西在某些框架中也称为中间件,里边有个opentracing的插件,正…

    Go语言 2023年5月25日
    060
  • Golang实现set

    Golang语言本身未实现set,但是实现了map golang的map是一种无序的键值对的集合,其中键是唯一的 而set是键的不重复的集合,因此可以用map来实现set 由于ma…

    Go语言 2023年5月25日
    058
  • go语言学习笔记-初识Go语言

    Go语言是怎样诞生的? Go语言的创始人有三位,分别是图灵奖获得者、C语法联合发明人、Unix之父肯·汤普森(Ken Thompson)、Plan 9操作系统领导者、UTF-8编码…

    Go语言 2023年5月25日
    077
  • 常见的限流算法

    通过限制并发访问数或者限制一个时间窗口内允许处理的请求数量来保护系统,例如,通过限流,你可以过滤掉产生流量峰值的客户和服务。 令牌桶算法 令牌桶算法是常见的一种限流算法。假设有一个…

    Go语言 2023年5月25日
    058
  • go语言面向对象编程之类型系统

    go语言类型系统 类型系统,顾名思义是指一个语言的类型体系结构,一个典型的类型系统通常包含如下基本内容 基础类型:如byte,int,bool,float等 复合类型:如数组,指针…

    Go语言 2023年5月29日
    042
  • 这不会又是一个Go的BUG吧?

    hello,大家好呀,我是小楼。 最近我又双叒叕写了个BUG,一个线上服务死锁了,不过幸亏是个新服务,没有什么大影响。 出问题的是Go的读写锁,如果你是写Java的,不必划走,更要…

    Go语言 2023年5月25日
    074
  • 开始读 Go 源码了

    学完 Go 的基础知识已经有一段时间了,那么接下来应该学什么呢?有几个方向可以考虑,比如说 Web 开发,网络编程等。 在写项目的过程中,发现一个问题。实现功能是没问题的,但不知道…

    Go语言 2023年5月25日
    045
  • 新作:轻量级Golang IoC容器——iocgo

    习惯于Java或者C#开发的人应该对控制反转与依赖注入应该再熟悉不过了。在Java平台有鼎鼎大名的Spring框架,在C#平台有Autofac,Unity,Windsor等,我当年…

    Go语言 2023年5月25日
    075
  • 化整为零优化重用,Go lang1.18入门精炼教程,由白丁入鸿儒,go lang函数的定义和使用EP07

    函数是基于功能或者逻辑进行聚合的可复用的代码块。将一些复杂的、冗长的代码抽离封装成多个代码片段,即函数,有助于提高代码逻辑的可读性和可维护性。不同于Python,由于 Go lan…

    Go语言 2023年5月25日
    046
  • Golang项目的配置管理——Viper简易入门配置

    Golang项目的配置管理——Viper简易入门配置 What is Viper? From:https://github.com/spf13/viperViper is a co…

    Go语言 2023年5月25日
    053
  • go-micro使用Consul做服务发现的方法和原理

    go-micro v4默认使用mdns做服务发现。不过也支持采用其它的服务发现中间件,因为多年来一直使用Consul做服务发现,为了方便和其它服务集成,所以还是选择了Consul。…

    Go语言 2023年5月25日
    088
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球