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

news2024/11/23 8:55:42

配置中心

为什么需要配置中心

平时我们写一个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)
}

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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/489206.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

和Ai一起学习CMake(一)

和Ai一起学习CMake 现在人工智能爆火&#xff0c;ChatGPT、new bing等层出不穷。我们借助Ai来学习一下CMake。下面是我与Ai的问答&#xff0c;这个学习主要是通过Ai来学习&#xff0c;但是防止Ai乱说话&#xff0c;我会结合自身的知识和实际操作给出相应的补充。 我的环境如下…

玄子Share - Tomcat 9 安装配置教程(含安装包)

玄子Share - Tomcat 9 安装配置教程&#xff08;含安装包&#xff09; 下载 下载链接 官网 https://tomcat.apache.org/ 下载教程 进入 Tomcat 官网&#xff0c;点击左侧导航栏&#xff0c;选择需要的版本下载。这里按照课程要求选择tomcat 9的版本 Mirrors&#xff1a;选…

为什么越来越多的企业开始选择云计算?

一、前言 随着数字化时代的到来&#xff0c;企业对于数据的需求越来越大&#xff0c;而传统的数据存储方式已经无法满足企业的需求。云计算作为一种新兴的技术&#xff0c;可以为企业提供更加灵活、高效、安全的数据存储和处理方式&#xff0c;因此越来越多的企业开始选择云计算…

element ui el-calendar日历组件使用总结

el-calendar日历组件使用总结 1. 需求说明2. 基础实现3. 只展示当月数据4. 动态切换日历里的数据实现5. 顺便把快捷方式隐藏了&#xff0c;不让用户选择上一个月下一个月 1. 需求说明 按月显示&#xff0c;每次只显示一个月的日期&#xff0c;其余隐藏 日历组件的显示时间随着…

数值分析-牛顿插值公式

目录 一、引言 二、牛顿插值公式的基本概念 1.插值问题 2.插值多项式 3.牛顿插值公式 三、牛顿插值公式的推导过程 四、牛顿插值公式的应用 1.图像处理 2.信号处理 五、牛顿插值公式的优缺点 1. 优点 2. 缺点 六、总结 一、引言 在数值分析中&#xff0c;插值是一…

干掉复杂的Java工具类,Hutool 工具库确实香~

Hutool 大家已经比较熟悉了&#xff0c;这是一个超全的 Java 工具库&#xff0c;深受国内开发者的喜爱。 我之前其实是不太喜欢使用这种功能太多的工具类的&#xff0c;也比较担心稳定性和安全性&#xff0c;后面慢慢接受了就感觉其实也还好。而且&#xff0c;我们还可以按需只…

如何优雅地停掉线程?

很久很久以前&#xff0c;在一个名为“Springboot”的村庄中&#xff0c;住着一群热爱编程的程序员。他们喜欢探索新技术、优化自己的代码&#xff0c;为了打造更好的软件而不断努力着。 在这个村庄中&#xff0c;有一个名叫小明的程序员&#xff0c;他是村庄中最优秀的程序员…

等概率随机函数设计技巧

文章目录 1. 关于Math.random()函数2. 用1 ~ 5的随机函数加工出1 ~ 7的随机函数3. LeetCode 470. 用 Rand7() 实现 Rand10()4. 把不等概率随机函数变成等概率随机函数5. 用a ~ b的随机函数加工出c ~ d的随机函数 1. 关于Math.random()函数 Java 中 Math.random() 函数是等概率…

微服务和领域驱动

一、微服务 1.1 什么是微服务 微服务就是一些协同工作的小而自治的服务。 关键词&#xff1a; 小而自治 -- 小 “小”这个概念&#xff0c;一方面体现在微服务的内聚性上。 内聚性也可以称之为单一职责原则&#xff1a;“把因相同原因而变化的东西聚合到一起&#xff0c;…

python能成为编程届的网红么?

Python本身就是编程语言届的网红&#xff0c;Python&#xff0c;年龄可能比很多读者都要大&#xff0c;但是它在更新快速的编程界却一直表现出色&#xff0c;甚至有人把它比作是编程界的《葵花宝典》&#xff0c;只是Python的速成之法相较《葵花宝典》有过之而无不及。 但是能…

短视频矩阵系统.代码实时分享

短视频矩阵系统核心技术研发是为满足现代社交网络时代用户对视频分享和观看的需求而推出的一项技术。它旨在提供高质量的视频传输、智能推荐算法、实时互动等功能。短视频矩阵系统设计上考虑了多个关键技术&#xff0c;包括多媒体编解码技术、网络通讯技术、机器学习算法等。通…

[pgrx开发postgresql数据库扩展]附.更新开发环境安装脚本

pgrx更新到0.83之后&#xff0c;我本来还没感觉&#xff0c;但是我五一放假一来&#xff0c;发现我的WSL环境居然就挂了…… 果然是非稳定版本就是不靠谱了…… 所以我干脆搞了个虚拟机&#xff0c;重新安装了一套&#xff0c;还别说&#xff0c;更新到了0.83之后&#xff0c;安…

(十一)地理数据库创建——创建新的地理数据库

地理数据库创建——创建新的地理数据库 目录 地理数据库创建——创建新的地理数据库 1.地理数据库概述2.地理数据库建立一般过程2.1地理数据库设计2.2地理数据库建立2.2.1从头开始建立一个新的地理数据库2.2.2移植已经存在数据到地理数据库2.2.3用CASE工具建立地理数据库 2.3建…

学习HCIP的day.04

目录 七、关于OSPF的不规则区域问题 1、通过隧道链路&#xff08;Tunnel&#xff09; 2、OSPF的虚链路配置 3、多进程双向重发布 八、OSPF的数据库表 九、OSPF优化 1、汇总 2、特殊区域 --- 用于减少各个非骨干区域的LSA数量 七、关于OSPF的不规则区域问题 分为两种情…

【MySQL实战2 作业解析】

这里写自定义目录标题 作业回顾作业步骤完成方法恢复数据库设置查询日志的开关删除退市股票以及新股的无效交易日的数据删除个股数据表查询merged_table这张表里3开头的股票中每个月成交量最大的股票下载日志文件&#xff0c;备份数据库 作业回顾 作业内容发布在社区里&#x…

输入捕获模式测频率、PWMI模式测频率占空比

一、知识点 TIM输入捕获模式&#xff1a; 1、输入捕获模式测频率占空比 信号源&#xff1a;产生一个频率和占空比可调的波形 无信号发生器的情况&#xff1a;先用PWM模块&#xff0c;在PA0端口输出一个频率和占空比可调的波形&#xff0c;把PA0和PA6连在一起&#xff0c;PA6为输…

Ubuntu 安装 Mysql

主要内容 本文主要是实现在虚拟机 Ubuntu 18.04 成功安装 MySQL 5.7&#xff0c;并实现远程访问功能&#xff0c;以 windows 下客户端访问虚拟机上的 mysql 数据库。 1. 切换至 root 用户 &#xff0c;shell 终端指令均执行在 root 用户下 sudo su 2. 安装并设置 mysql 安…

DOM操作-获取元素的方式

DOM—文档对象模型 ●DOM&#xff08;Document Object Model&#xff09;&#xff1a; 文档对象模型 ●其实就是操作 html 中的标签的一些能力 ●或者说是一整套操作文档流的属性和方法的集合 ●我们可以操作哪些内容 ○获取一个元素 ○移除一个元素 ○创建一个元素 ○向页面里…

Unity防破解方案解析

Unity作为游戏开发市场第一大游戏引擎占有者&#xff0c;已经全面覆盖到各个游戏平台&#xff0c;在全球范围内超过50% 的手机游戏、PC 游戏和主机游戏都使用 Unity 创作而成。 同时&#xff0c;Unity也是中国游戏公司的首选开发引擎&#xff0c;《原神》《王者荣耀》《英雄联盟…

【MySQL入门指南】4种插入数据的方法

文章目录 MySQL的增删查改① - 增1.发生冲突则失败1.1 基本语法1.2 单行数据全列插入1.3 多行数据 指定列插入 2.发生冲突则更新2.1 基本语法2.2 插入否则更新 3.发生冲突则替换3.1 基本语法3.2插入否则替换 4.插入查询结果 MySQL的增删查改① - 增 -- 创建一张学生表 CREATE…