nacos配置中心docker部署、配置及 goLang 集成使用

news2024/11/25 22:35:11

为什么需要配置中心

平时我们写一个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/1179330.html

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

相关文章

【面试题01】找出数组中的最长前缀

题目1&#xff1a;如图&#xff0c;finally中的输出语句会执行吗&#xff1f;&#xff08;另外自己去考虑虚拟机退出、catch中抛异常、try中抛异常、守护线程等相关问题&#xff09; 题目2&#xff1a;Byte"hello"报错吗&#xff1f;Byte7报错吗&#xff1f; 不会报…

服务器的操作系统,你选择哪些?

OpenCloudOS CentOS CentOS Stream Ubuntu Debian Windows Server

【c++】——类和对象(中)——默认成员函数(上)

【学习目标】 1. 类的6个默认成员函数 2. 构造函数 3. 析构函数 4. 拷贝构造函数 目录 一.类的6个默认成员函数 二. 构造函数 2.1 概念 2.2.特性 三.析构函数 3.1.概念 3.2 特性 四.拷贝构造函数 4.1.概念 4.2.特性 一.类的6个默认成员函数 如果一个类中什么成员…

解决 SSLError: HTTPSConnectionPool(host=‘huggingface.co‘, port=443)

看我的回答&#xff1a; https://github.com/huggingface/transformers/issues/17611#issuecomment-1794486960 能问这个问题的都是网络不太好的&#xff0c;你懂的&#xff0c;所以答案全是解决网络的。 得益于这个回答&#xff1a;#17611 (comment) 看了一下代码&#xf…

Apache Doris (五十三): Doris Join类型 - Shuffle Join

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹哥教你大数据个人主页-哔哩哔哩视频 目录 1. shuffle Join的原理

学信息系统项目管理师第4版系统36_结语

1. 尘埃落定 10月28日首考&#xff0c;到11月5日结束&#xff0c;尘埃落定&#xff0c;尘归尘、土归土了。 软考机考第一次吃螃蟹&#xff0c;几家欢喜几家愁&#xff0c;高项的选择题和案例题反馈简单&#xff0c;原书原文的考法&#xff0c;不过属于犄角旮旯那种。 中级则普…

GPT-4V:AI在教育领域的应用

OpenAI于9月25日发布了最新的GPT-4V模型&#xff0c;为ChatGPT引入了语音和图像功能&#xff0c;为用户提供更多元化的使用方式。这次更新将为用户带来更便捷、直观的交互体验&#xff0c;用户可以直接拍照上传并针对照片内容提出问题。OpenAI的最终目标是构建安全、有益的人工…

WindowsServer2019-搭建FTP服务器

这里写自定义目录标题 一、基础配置IP地址安装FTP服务检查连通性Windows10连接FTP服务 二、了解和使用FTP具体模块及其配置1、FTP IP地址和域限制2、FTP SSL设置3、FTP当前会话4、FTP防火墙5、FTP目录浏览6、FTP请求筛选7、FTP日志8、FTP身份验证9、FTP授权规则10、FTP消息11、…

数据结构(五):哈希表及面试常考的算法

一、哈希表介绍 1、定义 哈希表&#xff0c;也叫散列表&#xff0c;是根据关键码和值 (key和value) 直接进行访问的数据结构&#xff0c;通过key和value来映射到集合中的一个位置&#xff0c;这样就可以很快找到集合中的对应元素。例如&#xff0c;下列键(key)为人名&#xf…

5、Python中的变量和表达式:变量的定义、赋值和数据类型转换

文章目录 Python中的变量和表达式:变量的定义、赋值和数据类型转换变量的定义变量的赋值数据类型转换注意事项表达式总结Python中的变量和表达式:变量的定义、赋值和数据类型转换 Python是一种高级编程语言,以其简洁明了的语法和强大的功能而闻名。在Python编程中,变量和表…

docker安装达梦数据库镜像并初始化实例设置数据库大小写不敏感

全文参考文章Docker - 通过容器安装部署达梦数据库教程 以及docker安装达梦V8数据库 UTF-8及大小写敏感问题 一、安装部署达梦数据库 下载完成之后使用FileZilla上传到服务器上面 启动命令 创建dm8的容器并设置大小写不敏感运行 docker run -d -p 5236:5236 \ --restartalwa…

链式前向星模板

建稠密图可以用邻接矩阵&#xff0c;但稀疏图再用邻接矩阵就很浪费空间了&#xff0c;有可能会爆空间复杂度。 可以用邻接表来实现邻接表建图&#xff0c;两种方法&#xff1a;1.链表 2.链式前向行 只讲第二种&#xff0c;比较常用简洁 链式前向星模板 #define IOS ios::syn…

详解vue3的ref和reactive

目录 Vue3是目前前端领域最受欢迎的JavaScript框架之一&#xff0c;它的核心是响应式数据系统。因此&#xff0c;Vue3的ref和reactive成为了Vue3的核心特性之一。通过使用这两个特性&#xff0c;我们能够轻松地构建出高效、可维护的Vue3应用程序。在本文中&#xff0c;我们将详…

CoTTA:连续的测试时域自适应方法

文章信息 论文题目为《Continual Test-Time Domain Adaptation》&#xff0c;该文于2022年发表于Conference on Computer Vision and Pattern Recognition (CVPR)会议上。文章提出了一种持续的测试时域自适应方法&#xff08;CoTTA&#xff09;&#xff0c;旨在应对非稳态和不断…

本周三商店更新:多款套装下线,四款升级武器带异色皮肤返厂

本周三将迎来26.2版本更新与11商店大更新&#xff0c;版本更新可点击26.2版本更新公告进行查看&#xff0c;这里不一一赘述了&#xff0c;下面大概罗列一下商店更新&#xff0c;有皮肤下架&#xff0c;大家还能趁最后时间入手&#xff0c;最重要的是四款升级武器返厂咯。 危险玩…

shell脚本入门之【变量的定义】

&#x1f3c5;我是默&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; ​​ &#x1f31f;在这里&#xff0c;我要推荐给大家我的专栏《shell》。&#x1f3af;&#x1f3af; &#x1f680;无论你是编程小白&#xff0c;还是有一定基础的程序员&#xff0c;…

vue.js实现科室无限层选中和回显

一、效果展示&#xff1a; 展示可选层级 查看选中的值 二、实现&#xff1a; <el-form-item label"相关科室:" prop"orgId"><el-cascaderpopper-class"cascader-my":options"orgOptions":show-all-levels"false"…

文献管理软件Zotero之入门篇(1)

文章目录 0、前言1、下载安装1.1、下载安装主程序1.2、下载安装浏览器插件 2、给Zotero添加插件以实现更多快捷功能2.1、插件安装方式2.2、插件获取方式2.2.1、直接在官网插件也下载2.2.2、在Zotero中文社区插件页下载 3、总结 0、前言 一直以来想找一个文献管理帮手&#xff…

二进制代码反汇编逆向工具:IDA Pro(WinMac)v7.7 汉化版

IDA Pro是一款交互式的、可编程的、可扩展的、多处理器的、交叉Windows或Linux WinCE MacOS平台主机来分析程序。它被公认为最好的花钱可以买到的逆向工程利器&#xff0c;已经成为事实上的分析敌意代码的标准并让其自身迅速成为攻击研究领域的重要工具。 IDA Pro的特点主要包括…

海康Visionmaster-全局脚本:通过全局脚本获取通讯输 入的参数并赋值给全局变量

全局脚本根据外部通讯输入的数值赋值给全局变量&#xff0c;实现输入与全局变量之间的数值绑定。&#xff08;一般应用于定位、标定等需要外界物理值的场景)。 第一步&#xff0c;在 vm 通讯管理中设置好通讯设备&#xff0c;连接 第二步&#xff0c;根据通讯设备、接收的信息…