0


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

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

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

为确保配置最终一致性,通常采用版本控制机制(如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\n新值:%s\n", 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\nenable=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\n", 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://${mysql_host}:${mysql_port}/${nacos_database}?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=${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单机版实例。对于生产环境下的部署,建议参考官方提供的集群部署指南以提高系统的可用性和稳定性。


本文转载自: https://blog.csdn.net/xingxuechao/article/details/143147558
版权归原作者 阿里-于怀 所有, 如有侵权,请联系我们删除。

“开源的go语言统一配置中心 - nacos + nacos go sdk”的评论:

还没有评论