go继承nacos配置中心并读取配置信息

2023-05-16

配置中心

为什么需要配置中心

平时我们写一个demo的时候,或者说一个单体的应用,都会有一个配置文件,不管是 json文件或者yaml文件,里面包含了redis,mysql,es等信息,如果我们修改了配置文件,往往我们需要重启,为了避免重启,后来引入了viper,可以实现热更新。但并不是所有的项目都支持viper。
如果是一个分布式系统,肯定是有很多服务模块做支撑的,而且服务是可伸缩的,可能有几十台服务,也可能有几百台服务。如果每个服务模块下面都有自己的配置文件,那么如果mysql更新了端口号,运维人员就得一个一个文件的改。而且还可能不小心出错了。
在这里插入图片描述
所以综上,对于服务的配置,大概有这么三个痛点

  • 修改配置项后需要重启服务,对于生产环境来说,这是不能接受的。
  • 运维人员需要到各个项目下修改配置文件。效率低,不安全。
  • 一般公司中都有开发环境、测试环境、预生产环境以及生产环境。不同环境下的配置如何隔离?

为了解决上面的问题,配置中心应运而生。那么什么是配置中心呢?

配置中心

  • 配置统一管理
    配置项的修改编辑统一在配置中心页面进行,还包括统一的配置版本管理、环境隔离、灰度发布以及热发布,在不重启应用的情况下使得修改的配置可以生效起作用。
  • 权限统一控制
    主要控制其配置的读取权限以及修改权限,通过统一的权限管理提升运维效率。
  • 操作统一审计
    记录用户操作修改配置的历史信息,这样在出现问题的时候可以进行复盘回查,同时进行操作审计。

配置中心的选型

目前最主流的分布式配置中心主要是有spring cloud config apollo和nacos,spring cloud属于java的spring体系,我们就考虑apollo和nacos。apollo与nacos 都为目前比较流行且维护活跃的2个配置中心。apollo是协程开源,nacos是阿里开源

  • apollo大而全,功能完善。nacos小而全,可以对比成diango和flask的区别
  • 部署nacos更加简单。
  • nacos不止支持配置中心还支持服务注册和发现。
  • 都支持各种语言,不过apollo是第三方支持的,nacos是官方支持各种语言,所以我们也选用nacos作为配置中心
    在这里插入图片描述

Nacos

  • 安装
    为了方便,我们直接使用docker开启Nacos服务
docker run -d --name nacos -p 8848:8848   --privileged=true -e JVM_XMS=256m -e JVM_XMX=256m -e MODE=standalone nacos/nacos-server:latest

  • -d 后台启动
  • –name 为容器指定名称
  • -p指定端口号
  • –privileged=true : 扩大容器内的权限,将容器内的权限变为root权限
  • -e JVM_XMS=256m : 为jvm启动时分配的内存
  • -e JVM_XMX=256m : 为jvm运行过程中分配的最大内存
  • -e MODE=standalone : 使用 standalone模式(单机模式),MODE值有cluster(集群)模式/standalone模式两种,MODE必须大写
控制台
  • 启动后访问http://127.0.0.1:8848/nacos/
    在这里插入图片描述

组 配置集 命名空间

我们新建一个配置看一下

在这里插入图片描述
在这里插入图片描述

命名空间

  • 我们可以通过命名空间区分不同的微服务
    在这里插入图片描述
    在这里插入图片描述

  • 我们通过命名空间可以实现服务的隔离,但是我们怎么把开发、测试和生成环境的配置也隔离起来呢。这就用到了组

dataid

  • 一般来说,一个配置文件,对应一个dataid,单并不是说dataid必须是唯一的,我们只要保证Namespace+Group+DataId组合是唯一的即可

通过api访问nacos

相关参考

  • nacos作为配置中心,我们最长用的就是下面几个功能
    在这里插入图片描述
    在这里插入图片描述
  • 此处我们举一个例子,获取user的dev的配置文件,其中dataId对应的就是dataId,group是分组,tenant是命名空间的id
$   curl -X GET 'http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=user-dev&group=dev&tenant=311387f1-790b-4045-8787-571addb6c9fd'
database:
  driver: mysql
  host: 192.168.2.251
  port: 13309
  username: test
  dbname: cnk_user
  password: user

  • 更新文件
 $   curl -X POST 'http://127.0.0.1:8848/nacos/v1/cs/configs' -d 'dataId=user-dev&group=dev&tenant=311387f1-790b-4045-8787-571addb6c9fd&content=test'
true

在这里插入图片描述

在Go中的集成

  • 我们在go中怎么使用呢?我们看一下简单的代码
package main

import (
	"fmt"
	"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"
)

func main() {
	ch:=make(chan int)
	ch<-1
}

func init() {
	sc := []constant.ServerConfig{{
		IpAddr: "127.0.0.1",
		Port:   8848,
	}}

	cc := constant.ClientConfig{
		NamespaceId:         "311387f1-790b-4045-8787-571addb6c9fd", // 如果需要支持多namespace,我们可以场景多个client,它们有不同的NamespaceId。当namespace是public时,此处填空字符串。
		TimeoutMs:           5000,
		NotLoadCacheAtStart: true,
		LogDir:              "log",
		CacheDir:            "cache",
		LogLevel:            "debug",
	}

	configClient, err := clients.CreateConfigClient(map[string]interface{}{
		"serverConfigs": sc,
		"clientConfig":  cc,
	})
	if err != nil {
		fmt.Println(err.Error())
	}

	content, err := configClient.GetConfig(vo.ConfigParam{
		DataId: "user-dev",
		Group:  "dev",
	})

	if err != nil {
		fmt.Println(err.Error())
	}
	fmt.Println(content) //字符串 - yaml
	err = configClient.ListenConfig(vo.ConfigParam{
		DataId: "user-dev",
		Group:  "dev",
		OnChange: func(namespace, group, dataId, data string) {
			fmt.Println("配置文件发生了变化...")
			fmt.Println("group:" + group + ", dataId:" + dataId + ", data:" + data)
		},
	})
}

  • 我们通过api去修改配置文件
$ curl -X POST 'http://127.0.0.1:8848/nacos/v1/cs/configs' -d 'dataId=user-dev&group=dev&tenant=311387f1-790b-4045-8787-571addb6c9fd&content=test1111'
true
  • 看到修改的文件已经被监控到了
    在这里插入图片描述
  • 那么我们怎么解析和修改yaml文件呢?比如我们现在有这样一个配置
    在这里插入图片描述
  • 我们先把它解析成一个结构体,再进行解析
package main

import (
	"fmt"
	"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"
	"gopkg.in/yaml.v2"
)

func main() {
	ch := make(chan int)
	ch <- 1
}

type DatabaseNew struct {
	Driver   string `yaml:"driver"`
	Host     string `yaml:"host"`
	Port     int    `yaml:"port"`
	Username string `yaml:"username"`
	Dbname   string `yaml:"dbname"`
	Password string `yaml:"password"`
}
type ConfigNew struct {
	Database DatabaseNew//数据库的配置
}

var GlobalConfig ConfigNew

func init() {
	sc := []constant.ServerConfig{{
		IpAddr: "127.0.0.1",
		Port:   8848,
	}}

	cc := constant.ClientConfig{
		NamespaceId:         "311387f1-790b-4045-8787-571addb6c9fd", // 如果需要支持多namespace,我们可以场景多个client,它们有不同的NamespaceId。当namespace是public时,此处填空字符串。
		TimeoutMs:           5000,
		NotLoadCacheAtStart: true,
		LogDir:              "log",
		CacheDir:            "cache",
		LogLevel:            "debug",
	}

	configClient, err := clients.CreateConfigClient(map[string]interface{}{
		"serverConfigs": sc,
		"clientConfig":  cc,
	})
	if err != nil {
		fmt.Println(err.Error())
	}

	content, err := configClient.GetConfig(vo.ConfigParam{
		DataId: "user",
		Group:  "prod",
	})
	SetConfig(content)

	if err != nil {
		fmt.Println(err.Error())
	}
	err = configClient.ListenConfig(vo.ConfigParam{
		DataId: "user",
		Group:  "prod",
		OnChange: func(namespace, group, dataId, data string) {
			fmt.Println("配置文件发生了变化...")
			fmt.Println("group:" + group + ", dataId:" + dataId + ", data:" + data)
			SetConfig(data)
		},
	})
}

func SetConfig(content string) {
	fmt.Println(content)
	err := yaml.Unmarshal([]byte(content), &GlobalConfig)
	if err != nil {
		fmt.Println(err)
	}
	fmt.Printf("%+v", GlobalConfig)
}

我们通过控制台面板修改配置
在这里插入图片描述

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

go继承nacos配置中心并读取配置信息 的相关文章

  • Nacos在derby模式下如何更改密码?

    1 下载管理工具 下载官方管理工具 Apache Derby 10 14 2 0 Release 下载完成后 xff0c 上传至服务器 xff0c 并解压 xff0c 就可以使用 ij 这个客户端连接工具了 2 连接derby 注意 xff
  • 使用nacos配置教程

    1 xff0c 访问nacos网页 默认nacos网页为 uat环境地址 进入网页 默认账号 nacos 密码 nacos 2 xff0c 配置管理 1 xff0c 页面概述 进来页面如下 xff0c 我已经建立了三个命名空间 xff0c
  • nacos怎么开启账号密码登录

    Nacos 默认是不启用账号密码登录的 但你可以通过修改配置来启用账号密码登录以增强安全性 以下是在 Nacos 中启用账号密码登录的步骤 打开 Nacos 配置文件 nacos conf application properties 在文
  • window下,nacos的启动问题。

    1 jdk一定是需要64位的 2 启动方式 startup m standalone 在目录下单机启动 或者修改bin目录下的startup文件 3 配置数据库 建表语句在conf文件下nacos mysql 在application文件中
  • Nacos + Prometheus + Grafana 搭建走起~

    小伙伴们好呀 这两天在本地搭建了这个 Nacos Prometheus Grafana 主要是为了这个 nacos 填坑 然后顺便搭下这个监控中心 哈哈 文章内容比较琐碎 看完你可以了解到 怎么选择 nacos 版本 可能会踩到的坑 没错
  • k8s上安装nacos

    k8s上安装nacos 1 helm安装 wget https get helm sh helm v3 3 4 linux amd64 tar gz tart zxvf helm v3 3 4 linux amd64 tar gz mv l
  • Nacos介绍与安装启动

    什么是 Nacos 概览 欢迎来到 Nacos 的世界 Nacos 致力于帮助您发现 配置和管理微服务 Nacos 提供了一组简单易用的特性集 帮助您快速实现动态服务发现 服务配置 服务元数据及流量管理 Nacos 帮助您更敏捷和容易地构建
  • nacos登录 提示权限认证失败 没有命名空间的访问权限

    前言 环境 centos7 9 nacos 2 2 2 问题描述 最近在部署nacos 2 2 2版本的时候 这是目前2023年4月份最新版本 发现按照start out日志给出的登录地址 http 192 168 158 128 8848
  • Nacos踩坑记录之The IPv4 address(“nacos.xxxx.local“) is incorrect

    版本 spring cloud alibaba 2021 1 项目构建工具 gradle nacos server 2 0 3 1 问题 昨天早上上班来了之后 运营的同事着急的过来说生产环境登不上了 我赶紧打开日志看了之后 就发现了这样的报
  • nacos--基础--1.3--理论--架构

    nacos 基础 1 3 理论 架构 1 基本架构及概念 1 1 服务 Service 是指一个或一组软件功能 例如特定信息的检索或一组操作的执行 其目的是不同的客户端可以为不同的目的重用 例如通过跨进程的网络调用 Nacos 支持主流的服
  • Nacos 快速上手

    Nacos 快速上手 文章目录 Nacos 快速上手 准备工作 部署 Spring Boot 集成 配置说明 Spring Cloud Nacos Dubbo Nacos 公共 API 包 服务提供者 服务消费者 问题 微服务现在越来火 有
  • 【Nacos在derby模式下密码忘记】使用derby的ij工具重置密码/修改密码

    问题描述 nacos部署未用mysql 直接运行 使用了默认的derby数据库 这时候不一小心修改的密码给忘记了 无法登录 当时是部署在centos上的一个演示环境 没有采用mysql数据库 如果生产上 建议使用mysql 解决方案 1 下
  • SpringCloud-Alibaba整合Nacos+Seata+Mybatis-Plus

    SpringCloud Alibaba整合Nacos Seata Mybatis Plus Seata Example 项目说明 准备工作 配置数据库 创建 undo log 表 创建 示例中 业务所需要的数据库表 启动 Seata Ser
  • Nacos使用详解

    一 部署nacos 1 方式一 一般的windows和linux部署 需要的nacos server 1 4 1文件 https download csdn net download yueyue763184 87822434 spm 10
  • Nacos 中下线服务时报错:The Raft Group [naming_instance_metadata] did not find the Leader node;解决

    问题描述 因为某些特殊原因需要把nacos迁移到另一个版本的nacos 我迁的是nacos2 0 2版本 迁移完成后 Nacos注册中心有一个微服务有多台实例的时候 点击一个实例下线操作 报错 caused errCode 500 errM
  • nacos动态更新配置RefreshScope注解后取值为null

    首先排除版本问题 如果在controller类上面直接加 RefreshScope注解 会导致name值为null count值也为null Slf4j RestController RequestMapping api RefreshSc
  • 启动nacos时出现“nacos is starting with cluster”问题

    使用startup cmd命令启动是以集群方式启动nacos 可以看见命令行中有 nacos is starting with cluster 我们可以以单机方式启动nacos 执行以下命令 startup cmd m standalone
  • Nacos快速入门(一):Nacos初探

    1 简介 Nacos官网 https nacos io zh cn index html 1 1 概览 Nacos 致力于帮助您发现 配置和管理微服务 Nacos 提供了一组简单易用的特性集 帮助您快速实现动态服务发现 服务配置 服务元数据
  • Nacos 1.4.1注册中心源码深度解析-服务下线

    服务下线比较简单 入口在com alibaba nacos naming controllers InstanceController deregister gt serviceManager removeInstance gt remov
  • nacos配置导出

    1 查看nacos数据库 mysql u root p use nacos show tables 其中config info就是存放nacos配置的表 导出该表中的数据就是导出nacos中的配置项 mysqldump u root p s

随机推荐

  • 关于SSDP协议的基础知识

    SSDP就是简单服务发现协议 xff08 SimpleServiceDiscoveryProtocol xff09 是一种应用层协议 xff0c 它是构成通用即插即用 也就是UPnP xff0c UPnP是各种各样的智能设备 无线设备和个人
  • 堆的相关概念、简单实现、基础用法

    堆的相关概念 简单实现 基础用法 堆用数组简单实现堆及其基本操作 xff08 C 43 43 xff09 堆的基本用法 xff08 C 43 43 xff09 纪念 想对学过的数据结构和算法分析知识进行一点总结 xff0c 接下来使用的编程
  • 在linux上安装微信

    如何在linux上安装微信呢 xff1f 腾讯只在windows和mac上推出了官方版微信 xff0c 所以只能寻找其他途径 题主今天在ubuntu上安装了微信以后 xff0c 发现其实就是网页端微信 xff0c 而且奇怪的是不管是在ubu
  • 更改计算机上的远程桌面的侦听端口

    适用于 xff1a Windows 10 Windows 8 1 Windows 8 Windows Server 2019 Windows Server 2016 Windows Server 2012 R2 Windows Server
  • iOS UISlider用法及自定义滑块

    一 学习Slider的时候 xff0c 发现在设置滑块的轨道图片时总看到一个方法叫做 UIImage leftTrack 61 UIImage imageNamed 64 34 34 resizableImageWithCapInsets
  • 搭建靶场

    在终端输入 xff1a ifconfig查看ip地址 xff0c 接着输入netdiscover r xxx xxx xxx 1 24 可能出现在vmware上的kali搜索不到virbox上的靶机 xff0c 这是因为二者不在同一网段 x
  • 矩阵链乘法(最优解)————算法导论(C语言实现)

    这两天算法课刚学了这个 xff0c 于是就想着用C语言自己撸出来 首先是寻找最优解的过程 xff0c 对于下标从i到j的矩阵链 xff0c 我们将其分成两部分i到k和k 43 1到j xff0c 遍历i到j之间的每一个k xff0c 找到最
  • Win10小喇叭显示红叉,显示未找到输出设备的解决方式

    最近遇到一个问题 xff0c 重装win10系统之后 xff0c 新系统右下角的小喇叭一直显示红叉 xff0c 右击显示 扬声器安装程序unknown xff0c 查了网上很多的教程 xff0c 不是通过驱动精灵 鲁大师重新安装声卡驱动 x
  • Vscode——调整左侧菜单字体大小

    不知道键盘按啥了 xff0c vscode开发工具上左侧目录字体特别小 xff0c 看着真的太难受了 调整左侧菜单字体大小 1 按ctrl 43 shift 43 p 2 点击打开设置 3 在settings json文件中加入 windo
  • 关于web安全问题解决方案

    启用了不安全的HTTP方法 xff08 禁用put delete调用方式 xff0c 尽量只使用post方式 内网可以用get xff09 危害 xff1a 这些方法表示可能在服务器上使用了 WebDAV 由于dav方法允许客户端操纵服务器
  • ubuntu换源

    以阿里的源为例 首先去这个网页 xff0c 找到你对应版本的源https developer aliyun com mirror ubuntu spm 61 a2c6h 13651102 0 0 3e221b118WiEjq ustc xf
  • 升级powershell7

    升级powershell7 搜索软件包 winget search powershell 升级 winget span class token function install span Microsoft PowerShell 应该在路径
  • 最全的百度网盘搜索引擎

    1 易查搜索 xff08 https so acurd com xff09 推荐指数 43 资源聚合做的比较好的一个网站 xff0c 也是最常用的一个网站 xff0c 据up主说有脚本会定时检测每个搜索引擎 xff0c 不通的或者服务器挂的
  • 使用ffmpeg对视频指定时间点加入指定音频和gif动图 实现水印旋转

    为了丰富文章 xff0c 本文也会演示一些动画效果 xff0c 如跑马灯效果 xff0c 淡入淡出等效果 在上一篇文章中 xff0c 我们使用了把gif图片转化为mov透明底的视频 xff0c 使用ffmpeg画中画的滤镜效果 xff0c
  • 解决在本地不能访问es服务器的问题

    背景 我们有一台服务器 xff0c 40 163服务器 xff0c 大家的代码都是在这一台机器上面执行 xff0c 使用idea自带的ftp功能 xff0c 在163服务器 xff0c 我们可以访问mysql redis es等服务 xff
  • mac安装graphviz的一些曲折经历(同样使用其他情况)

    我之前是Ubuntu用户 xff0c 后来用了macOS xff0c 但是发现macOS的包管理工具不好用 xff0c 偶尔会有些软件安装不上 xff0c 网上查呢也不一定查到结果前台我调试golang的代码 xff0c 想要下载graph
  • 秒杀要不要用锁?五种方案的代码实践和超卖演示

    https www jianshu com p a2bd89e0d24b 工欲善其事必先利其器 xff0c 我们先来装一下相关工具 jmeter 我是在mac演示的 xff0c 所以我先安装一下brew ruby e span class
  • golang入门微服务

    什么是微服务 微服务 xff0c 又称微服务架构 xff0c 是一种架构风格 xff0c 它将应用程序构建为以业务领域为模型的小型自治服务集合 就像我们要写一本书 xff0c 一共有三个章节 xff0c 为了敏捷开发 xff0c 我们让三个
  • 什么是内存?什么是内存逃逸?怎么做内存逃逸分析

    内存 平时我们在电脑上听歌 xff0c 聊天 xff0c 或者启动某个程序 xff0c 那么这个启动过程 xff0c 其实就是把程序从硬盘读入到内存中去 就像安卓手机 xff0c 内存不够了很卡 xff0c 杀掉几个软件 xff0c 内存就
  • go继承nacos配置中心并读取配置信息

    配置中心 为什么需要配置中心 平时我们写一个demo的时候 xff0c 或者说一个单体的应用 xff0c 都会有一个配置文件 xff0c 不管是 json文件或者yaml文件 xff0c 里面包含了redis mysql es等信息 xff