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-websocket 搭建一对一,一对多的聊天室] 第二篇:websocket间的通信

    源码地址https://gitee.com/bin-0821/chat-room-demo-go-websocket 关于websocket,上一篇文章讲述了如何通过websock…

    Go语言 2023年5月25日
    068
  • sqlx操作MySQL实战及其ORM原理

    sqlx是Golang中的一个知名三方库,其为Go标准库database/sql提供了一组扩展支持。使用它可以方便的在数据行与Golang的结构体、映射和切片之间进行转换,从这个角…

    Go语言 2023年5月25日
    063
  • Go语言之反射

    一、反射的基本概念 (一)什么是反射 反射可以再运行时动态获取变量的各种信息,比如变量的类型、值等 如果时结构体变量,还可以获取到结构体本身的各种信息,比如结构体的字段、方法 通过…

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

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

    Go语言 2023年5月25日
    079
  • Golang开源流媒体服务器(RTMP/RTSP/HLS/FLV等协议)

    一. lal 简介 lal是开源直播流媒体网络传输项目,主要由三部分组成: lalserver:流媒体转发服务器。类似于 nginx-rtmp-module等服务,但支持更多的协议…

    Go语言 2023年5月25日
    060
  • Go语言重新开始,Go Modules 的前世今生与基本使用

    2020 年腾讯内部的一份开发者报告显示,Go 语言已经成为腾讯内部第二大后端开发语言,在腾讯每天有大量的 Go 开发者在做业务和平台开发,大量的团队和项目使用也暴露出一些问题,随…

    Go语言 2023年5月29日
    045
  • 如何在 Go 中将 []byte 转换为 io.Reader?

    原文链接: 如何在 Go 中将 []byte 转换为 io.Reader? 在 stackoverflow 上看到一个问题,题主进行了一个网络请求,接口返回的是 []byte。如果…

    Go语言 2023年5月25日
    065
  • go tool – 快速生成CHANGELOG.md

    在git项目中,通过添加CHANGELOG.md可以展示项目的版本更新记录,方便用户查看项目的重大bug修复或不兼容版本信息。 安装: 打开项目目录运行 或者通过命令行指定项目目录…

    Go语言 2023年5月25日
    058
  • Kubernetes容器编排探索与实践v1.22.1-上半部分

    概述 本人博客网站 IT小神; www.itxiaoshen.com Kubernetes官网地址 https://kubernetes.ioKubernetes GitHub源码…

    Go语言 2023年5月25日
    081
  • 【golang】分布式缓存 – 一致性哈希算法

    之前也了解到过一致性哈希算法,但是没有用go实现过,刚好最近看GeeCache,动手实现下一致性哈希算法 正文: 我们先来想下一致性哈希算法的数据结构含有哪些内容: 1.map 用…

    Go语言 2023年5月25日
    054
  • muduo源码分析之回调模块

    这次我们主要来说说 muduo库中大量使用的回调机制。 muduo主要使用的是利用 Callback的方式来实现回调,首先我们在自己的 EchoServer构造函数中有这样几行代码…

    Go语言 2023年5月25日
    035
  • HTTP 尝试获取 Client IP

    HTTP 中获取 Client IP 相关策略需求, 在当下网络环境中多数只能提供建议作用. 更多的是 通过其它唯一标识来挖掘更多潜在价值. 本文主要就一个内容, 如何最大可能尝试…

    Go语言 2023年5月25日
    051
  • croncli 定时器命令(golang)

    定时器是执行任务时的常用功能,配置系统的定时任务太麻烦,所以就想用golang简单实现一个定时器命令。 定时器的参数包括: $ croncli -h 定时器命令 Usage: cr…

    Go语言 2023年5月25日
    050
  • B树-查找

    B树系列文章 1. B树-介绍 2. B树-查找 3. B树-插入 4. B树-删除 查找 假设有一棵3阶B树,如下图所示。 下面说明在该B树中查找 52的过程 首先,从根结点出发…

    Go语言 2023年5月25日
    058
  • 【golang】 关于for range中只存储最后一个元素的问题

    前言: 今天用for range写了个demo,发现无论怎么运行,最后的结果是一直是最后一个。自己思考过后,又和其他伙伴商量了下,最终算是解决了自己的疑惑。 正文: 下面我们来看个…

    Go语言 2023年5月25日
    049
  • Golang:将日志以Json格式输出到Kafka

    工程实践中,我们往往还需要对日志进行采集,将日志归集到一起,然后用于各种处理分析,比如生产环境上的错误分析、异常告警等等。在日志消息系统领域,Kafka久负盛名,这篇文章就以将日志…

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