开源的go语言统一配置中心 - nacos + nacos go sdk

news2025/1/5 5:05:09

配置文件实时更新机制的场景需求

配置文件热更新主要应用于需要在不停机的情况下动态调整系统行为的场景,例如修改服务参数、切换数据源等。其原理在于通过一个中心化的管理平台来存储和分发最新的配置信息。当配置文件发生变化时,该平台会主动或被动地通知所有相关应用实例。应用实例接收到变更通知后,将从平台拉取最新的配置内容并立即生效,从而实现热更新。

为确保配置最终一致性,通常采用版本控制机制(如MD5校验)来保证客户端与服务器之间配置的一致性。此外,还会定期执行全量同步操作,以防止因网络故障等原因导致的部分节点数据不同步问题。通过这些机制,可以有效保障即使在网络不稳定或者发生其他异常情况下,各应用实例仍能获取到一致且最新的配置文件。

Nacos:云原生应用的动态配置管理与服务发现平台

Nacos 是阿里巴巴开源的一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。它提供了一系列核心优势,包括服务发现与健康检查、动态配置服务以及动态DNS服务等。在Go语言的应用中,通过Nacos提供的SDK或API,开发者能够方便地实现配置文件的热更新,无需重启服务即可生效新的配置,这极大地提高了系统的灵活性和可用性。此外,Nacos支持多环境隔离,并且具备强大的生态兼容能力,可以无缝集成到Spring Cloud、Dubbo等主流框架中,为微服务架构下的项目提供了强有力的支持。无论是对于开发效率还是运维便捷性来说,Nacos都是一个不可或缺的选择。

Nacos配置订阅示例详解

基于Nacos订阅配置更新并处理的例子(Go语言版,配置文件名为config.properties):

首先,根据我了解的信息中提供的信息了解到,Nacos的服务或配置订阅机制是独立的。这意味着,当多个服务监听相同的配置时,任何该配置的变化都会被推送给所有订阅者,而不会因为某个服务已经收到了通知就不给其他服务推送了。这为构建可靠的应用程序提供了便利,确保了不同组件能够及时获取到最新的配置信息。

下面将给出一个完整的使用Go语言实现的示样的步骤,用于演示如何从Nacos订阅config.properties配置,并在配置更新时做出相应处理。这里假设您已经安装好了Go环境以及必要的依赖库。

1. 安装nacos-go-sdk

首先,你需要安装nacos-go-sdk,这是一个用于与Nacos服务器交互的Go语言客户端库。你可以通过运行以下命令来安装它:

go get -u github.com/nacos-group/nacos-sdk-go
2. 创建主程序文件

接下来,创建你的Go应用入口点文件,比如命名为main.go。在这个文件里,你将初始化Nacos客户端、订阅特定配置,并定义配置变更时的回调函数。

main.go 内容
package main

import (
    "fmt"
    "os"
    "time"

    "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() {
    // Nacos服务器地址
    serverConfigs := []constant.ServerConfig{
        *constant.NewServerConfig("localhost", 8848),
    }

    // 客户端配置
    clientConfig := constant.ClientConfig{
        NamespaceId:         "public", // 命名空间ID
        TimeoutMs:           5000,
        NotLoadCacheAtStart: true,
        LogDir:              "/tmp/nacos/log",
        CacheDir:            "/tmp/nacos/cache",
        RotateTime:          "1h",
        MaxAge:              3,
        LogLevel:            "debug",
    }

    // 创建配置客户端
    configClient, err := clients.CreateConfigClient(map[string]interface{}{
        "serverConfigs": serverConfigs,
        "clientConfig":  clientConfig,
    })
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }

    dataId := "config.properties"  // 配置文件名
    group := "DEFAULT_GROUP"       // 默认组

    // 监听配置变化
    err = configClient.ListenConfig(vo.ConfigParam{
        DataId: dataId,
        Group:  group,
        OnChange: func(namespace, group, dataId, data string) {
            fmt.Printf("配置发生更改:%s
新值:%s
", dataId, data)
            // 在这里添加对新配置数据进行处理的逻辑
        },
    })
    if err != nil {
        fmt.Println(err)
        return
    }

    // 让主进程保持活跃状态
    select {}
}

这段代码展示了如何设置一个基本的Nacos配置监听器。一旦config.properties文件的内容发生变化,OnChange回调函数就会被执行,并打印出新的配置内容。您可以在此处扩展更多的业务逻辑来处理配置更新后的具体操作。

小结:
  • 通过上述步骤,我们创建了一个简单的Go应用程序,它能够连接到本地运行的Nacos实例。

  • 应用程序订阅了一个名为config.properties的配置项,属于默认分组DEFAULT_GROUP

  • 当这个配置项的内容发生变化时,将会触发预先定义好的回调函数,在本例中仅仅是简单地打印出变更信息。在实际应用场景中,可以利用这个机会更新内存中的配置参数或者重启相关服务等操作。

  • 最后,为了让程序持续运行以便接收来自Nacos的通知,我们使用了select {}语句阻止主goroutine退出。在真实环境中,可能需要采用更优雅的方式来管理应用生命周期。

Nacos发布配置实例详解

1. 整体思路

在使用Nacos作为配置中心时,开发者需要能够通过程序实现配置的动态更新与管理。对于Go语言客户端而言,这涉及到如何初始化连接到Nacos服务、发布新配置、监听配置变更以及删除不再需要的配置等操作。根据我了解的信息中提供的信息,我们可以得知完成这些任务所需的基本方法和参数设置。

2. 具体步骤

基于上述需求,下面将提供一个完整的Go语言示例来展示如何进行配置的发布及后续处理。本示例将包括创建ClientConfig对象、建立与Nacos服务器的连接、发布新的配置文件config.properties、监听该配置的变化事件,并最后演示如何取消监听并移除配置。

  • 第一步:安装依赖
    确保已经安装了Nacos Go SDK。如果尚未安装,请运行:

    go get github.com/nacos-group/nacos-sdk-go/v2

  • 第二步:定义客户端配置

    package main

    import (
    “fmt”
    “github.com/nacos-group/nacos-sdk-go/v2/clients”
    “github.com/nacos-group/nacos-sdk-go/v2/common/constant”
    “github.com/nacos-group/nacos-sdk-go/v2/vo”
    )

    func main() {
    // 客户端配置
    clientConfig := constant.ClientConfig{
    TimeoutMs: 5000,
    NotLoadCacheAtStart: true,
    LogDir: “/tmp/nacos/log”,
    CacheDir: “/tmp/nacos/cache”,
    LogLevel: “debug”,
    Username: “nacos”, // 如果启用了鉴权,填写用户名
    Password: “nacos”, // 如果启用了鉴权,填写密码
    }

    // Nacos服务器地址列表
    serverConfigs := []constant.ServerConfig{
        *constant.NewServerConfig("console.nacos.io", 80, constant.WithScheme("http")),
    }
    
    // 创建配置客户端
    configClient, err := clients.NewConfigClient(
        vo.NacosClientParam{
            ClientConfig:  &clientConfig,
            ServerConfigs: serverConfigs,
        },
    )
    if err != nil {
        panic(err)
    }
    
    // 发布配置
    publishConfig(configClient)
    
    // 监听配置变化
    listenForChanges(configClient)
    
    // 取消监听(可选)
    cancelListening(configClient)
    
    // 删除配置(可选)
    deleteConfig(configClient)
    

    }

  • 第三步:编写辅助函数

    // 发布配置
    func publishConfig(client clients.IConfigClient) {
    _, err := client.PublishConfig(vo.ConfigParam{
    DataId: “config.properties”,
    Group: “DEFAULT_GROUP”,
    Content: “version=1.0.0
    enable=true”,
    })
    if err != nil {
    fmt.Println(“Failed to publish config:”, err)
    return
    }
    fmt.Println(“Config published successfully.”)
    }

    // 监听配置变化
    func listenForChanges(client clients.IConfigClient) {
    err := client.ListenConfig(vo.ConfigParam{
    DataId: “config.properties”,
    Group: “DEFAULT_GROUP”,
    OnChange: func(namespace, group, dataId, data string) {
    fmt.Printf("Config changed: %s, new content: %s
    ", dataId, data)
    },
    })
    if err != nil {
    fmt.Println(“Failed to start listening for changes:”, err)
    } else {
    fmt.Println(“Started listening for changes on ‘config.properties’.”)
    }
    }

    // 取消监听
    func cancelListening(client clients.IConfigClient) {
    err := client.CancelListenConfig(vo.ConfigParam{
    DataId: “config.properties”,
    Group: “DEFAULT_GROUP”,
    })
    if err != nil {
    fmt.Println(“Failed to cancel listening:”, err)
    } else {
    fmt.Println(“Cancelled listening for changes on ‘config.properties’.”)
    }
    }

    // 删除配置
    func deleteConfig(client clients.IConfigClient) {
    _, err := client.DeleteConfig(vo.ConfigParam{
    DataId: “config.properties”,
    Group: “DEFAULT_GROUP”,
    })
    if err != nil {
    fmt.Println(“Failed to delete config:”, err)
    } else {
    fmt.Println(“Deleted ‘config.properties’ configuration.”)
    }
    }

3. 小结

以上代码首先通过设置必要的配置项如超时时间、日志目录等创建了一个ClientConfig实例,并指定了Nacos服务的位置。之后,利用这个配置信息创建了一个配置客户端。接着,通过调用PublishConfig函数上传了一个名为config.properties的新配置文件至指定组。为了实时获取配置的更新,我们使用了ListenConfig功能注册了一个回调函数,在每次配置内容发生变化时都会被触发执行。最后,展示了如何取消对特定配置文件更改的监听以及如何从Nacos中彻底删除该配置。

Nacos server的单机版快速部署

1. 环境准备

首先确保你的环境满足以下要求:

  • Java环境:Nacos依赖Java运行时环境,推荐使用JDK 8+。

  • 内存与CPU:根据官方文档,至少需要2GB内存和2核CPU。

2. 下载Nacos

访问Nacos官方网站或直接从Github发布页下载最新的稳定版本。选择nacos-server-x.x.x.zip文件下载并解压缩到你希望安装的位置。

3. 配置Nacos

对于一个简单的单机模式部署,你可以选择使用默认配置,这将使Nacos使用内置的Derby数据库进行存储。如果你想要更灵活的配置,比如使用外部MySQL作为数据源,可以按照下面步骤操作:

使用内置Derby数据库
  • 解压后的目录中,进入conf文件夹找到application.properties,确认其内容为默认配置(即没有修改数据库相关的设置)。

  • 默认情况下,不需要对这个文件做任何修改,因为Nacos会自动使用内置的Derby数据库。

使用外部MySQL数据库
  1. 安装MySQL数据库,并确保版本不低于5.6.5。

  2. 执行提供的SQL脚本初始化数据库结构,该脚本可以在Nacos GitHub仓库找到。

  3. 修改conf/application.properties中的数据库连接信息,包括数据库URL、用户名及密码等字段。示例配置如下:

    spring.sql.init.platform=mysql

    db.num=1
    db.url.0=jdbc:mysql:// m y s q l h o s t : {mysql_host}: mysqlhost:{mysql_port}/KaTeX parse error: Expected 'EOF', got '&' at position 40: …erEncoding=utf8&̲connectTimeout=…{mysql_user}
    db.password=${mysql_password}

${...}替换为你实际使用的值。

4. 启动Nacos

打开命令行工具,切换至Nacos解压后的根目录,执行如下命令来启动Nacos服务:

sh bin/startup.sh -m standalone

在Windows系统下,应该使用cmd.exe /c startup.cmd -m standalone

5. 访问Nacos控制台

成功启动后,可以通过浏览器访问http://localhost:8848/nacos,默认登录账号密码均为nacos。此时你已经完成了一个基础的Nacos单节点部署。

通过上述步骤,您就能够迅速搭建起一个可用于开发测试环境的Nacos单机版实例。对于生产环境下的部署,建议参考官方提供的集群部署指南以提高系统的可用性和稳定性。

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

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

相关文章

对45家“AI+安全”产品/方案的分析

一. 关键洞察 “AI+安全”创新非常活跃,一片百家争鸣之势,赛道选择上,以事件分诊Incident Triage、 安全辅助Security Copilots、自动化Automation三者为主为主,这充分反映了当前安全运营的主要需求,在产品理念选择上以 AI 和 自动化为主,这确实又切合上了在关键…

GESP202412 三级【数字替换】题解(AC)

》》》点我查看「视频」详解》》》 [GESP202412 三级] 数字替换 题目描述 小杨有一个包含 n n n 个数字的序列 A A A,即 A [ a 1 , a 2 , … , a n ] A[a_1,a_2,\ldots,a_n] A[a1​,a2​,…,an​],他想将其中大于 k k k 的数字都替换为序列的最大…

springboot集成websokcet+H5开发聊天原型(二)

本文没有写完~~~~ 聊天相关数据结构&#xff1a; 我们初步设计了如下几个数据结构。 //存放 sessionId 与 userId 的map private Map<String,String> sessionId_userId new HashMap<>(); // 用于存储用户与群组的关联关系&#xff0c;键为用户ID&#xff0c;值…

List接口(源码阅读)

文章目录 1.List接口常用方法1.代码2.结果 2.ArrayList底层机制1.结论2.ArrayList底层源码1.代码2.debug添加第一个元素1.进入2.elementData数组存储ArrayList的数据3.初始化为空数组4.首先确保使用size1来计算最小容量5.如果elementData为空&#xff0c;最小容量就是106.modCo…

Python爬虫(一)- Requests 安装与基本使用教程

文章目录 前言一、简介及安装1. 简介2. 安装 Requests2.1 安装2.2 检查安装是否成功 二、使用 Requests 发送 HTTP 请求1. 发送 GET 请求2. 发送 POST 请求3. 发送 PUT 请求4. 发送 DELETE 请求5. 发送 HEAD 请求6. 发送 OPTIONS 请求 三、传递参数1. GET 请求传递 URL 参数1.1…

风力涡轮机缺陷检测数据集,86.6%准确识别率,11921张图片,支持yolo,PASICAL VOC XML,COCO JSON格式的标注

风力涡轮机缺陷检测数据集&#xff0c;86.6&#xff05;准确识别率&#xff0c;11921张图片&#xff0c;支持yolo&#xff0c;PASICAL VOC XML&#xff0c;COCO JSON格式的标注 数据集下载 yolov11&#xff1a; https://download.csdn.net/download/pbymw8iwm/90206849 yolov…

简易屏幕共享工具-基于WebSocket

前面写了两个简单的屏幕共享工具&#xff0c;不过那只是为了验证通过截屏的方式是否可行&#xff0c;因为通常手动截屏的频率很低&#xff0c;而对于视频来说它的帧率要求就很高了&#xff0c;至少要一秒30帧率左右。所以&#xff0c;经过实际的截屏工具验证&#xff0c;我了解…

python-leetcode-多数元素

169. 多数元素 - 力扣&#xff08;LeetCode&#xff09; class Solution:def majorityElement(self, nums: List[int]) -> int:candidate Nonecount 0for num in nums:if count 0: # 更新候选元素candidate numcount (1 if num candidate else -1)return candidate

js按日期按数量进行倒序排序,然后再新增一个字段,给这个字段赋值 10 到1

效果如下图&#xff1a; 实现思路&#xff1a; 汇总数据&#xff1a;使用 reduce 方法遍历原始数据数组&#xff0c;将相同日期的数据进行合并&#xff0c;并计算每个日期的总和。创建日期映射&#xff1a;创建一个映射 dateMap&#xff0c;存储每个日期的对象列表。排序并添加…

MM-2024 | 智能体遇山开路,遇水架桥! ObVLN:突破障碍,受阻环境中的视觉语言导航

作者&#xff1a;Haodong Hong, Sen Wang, Zi Huang 单位&#xff1a;昆士兰大学 论文链接&#xff1a;Navigating Beyond Instructions: Vision-and-Language Navigation in Obstructed Environments (https://dl.acm.org/doi/pdf/10.1145/3664647.3681640) 代码链接&#…

1Panel自建RustDesk服务器方案实现Windows远程macOS

文章目录 缘起RustDesk 基本信息实现原理中继服务器的配置建议 中继服务器自建指南准备服务器安装1Panel安装和配置 RustDesk 中继服务防火墙配置和安全组配置查看key下载&安装&配置客户端设置永久密码测试连接 macOS安装客户端提示finder写入失败hbbs和hbbr说明**hbbs…

Tube Qualify弯管测量系统在汽车管路三维检测中的应用

从使用量上来说&#xff0c;汽车行业是使用弯管零件数量最大的单一行业。在汽车的燃油&#xff0c;空调&#xff0c;排气&#xff0c;转向&#xff0c;制动等系统中都少不了管路。汽车管件形状复杂&#xff0c;且由于安装空间限制&#xff0c;汽车管件拥有不同弯曲半径&#xf…

Excel文件恢复教程:快速找回丢失数据!

Excel文件恢复位置在哪里&#xff1f; Excel是微软开发的电子表格软件&#xff0c;它为处理数据和组织工作提供了便捷。虽然数据丢失的问题在数字时代已经司空见惯&#xff0c;但对于某些用户来说&#xff0c;恢复未保存/删除/丢失的Excel文件可能会很困难&#xff0c;更不用说…

R语言入门笔记:第一节,快速了解R语言——文件与基础操作

关于 R 语言的简单介绍 上一期 R 语言入门笔记里面我简单介绍了 R 语言的安装和使用方法&#xff0c;以及各项避免踩坑的注意事项。我想把这个系列的笔记持续写下去。 这份笔记只是我的 R 语言入门学习笔记&#xff0c;而不是一套 R 语言教程。换句话说&#xff1a;这份笔记不…

16、【ubuntu】【gitlab】【补充】服务器断电后,重启服务器,gitlab无法访问

背景 接wiki 【服务器断电后&#xff0c;重启服务器&#xff0c;gitlab无法访问】https://blog.csdn.net/nobigdeal00/article/details/144280761 最近不小心把服务器重启&#xff0c;每次重启后&#xff0c;都会出现gitlab无法访问 分析 查看系统正在运行的任务 adminpcad…

汇编环境搭建

学习视频 将MASM所在目录 指定为C盘

两种分类代码:独热编码与标签编码

目录 一、说明 二、理解分类数据 2.1 分类数据的类型&#xff1a;名义数据与序数数据 2.2 为什么需要编码 三、什么是独热编码&#xff1f; 3.1 工作原理&#xff1a;独热编码背后的机制 3.2 应用&#xff1a;独热编码的优势 四、什么是标签编码&#xff1f; 4.1 工作原理&…

二、SQL语言,《数据库系统概念》,原书第7版

文章目录 一、概览SQL语言1.1 SQL 语言概述1.1.1 SQL语言的提出和发展1.1.2 SQL 语言的功能概述 1.2 利用SQL语言建立数据库1.2.1 示例1.2.2 SQL-DDL1.2.2.1 CREATE DATABASE1.2.2.2 CREATE TABLE 1.2.3 SQL-DML1.2.3.1 INSERT INTO 1.3 用SQL 语言进行简单查询1.3.1 单表查询 …

异常与中断(下)

文章目录 一、中断的硬件框架1.1 中断路径上的3个部件1.2 STM32F103的GPIO中断1.2.1 GPIO控制器1.2.2 EXTI1.2.3 NVIC1.2.4 CPU1. PRIMASK2. FAULTMASK3. BASEPRI 1.3 STM32MP157的GPIO中断1.3.1 GPIO控制器1.3.2 EXTI1. 设置EXTImux2. 设置Event Trigger3. 设置Masking4. 查看…

「Mac畅玩鸿蒙与硬件48」UI互动应用篇25 - 简易购物车功能实现

本篇教程将带你实现一个简易购物车功能。通过使用接口定义商品结构&#xff0c;我们将创建一个动态购物车&#xff0c;支持商品的添加、移除以及实时总价计算。 关键词 UI互动应用接口定义购物车功能动态计算商品管理列表操作 一、功能说明 简易购物车功能包含以下交互&#…