【配置中心】Nacos——基于「python」「golang」实现


一、为什么需要分布式配置中心

我们现在有一个项目,使用gin进行开发的,配置文件的话我们知道是一个叫做config.yaml的文件。我们也知道这个配置文件会在项目启动的时候被加载到内存中进行使用的。

考虑两种情况:

  • 你现在的用户服务有10个部署实例,那么添加配置项你得去十个地方修改配置文件还得重新启动等。
  • 即使go的viper能完成修改配置文件自动生效,那么你得考虑其他语言是否也能做到这点,其他的服务是否也一定会使用viper?

添加配置项
修改配置项

  • 大量的服务可能会使用同一个配置,比如我要更好jwt的secrect,这么多实例怎么办?

开发、测试、生产环境如何隔离

  • 前面虽然已经介绍了viper,但是依然一样的问题,这么多服务如何统一这种考虑因素?

在这里插入图片描述


二、分布式配置中心选型

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

apollo是协程开源,nacos是阿里开源

  • apollo大而全,功能完善。nacos小而全,可以对比成django和flask的区别
  • 部署nacos更加简单。
  • nacos不止支持配置中心还支持服务注册和发现。
  • 都支持各种语言,不过apollo是第三方支持的,nacos是官方支持各种语言

两者都很活跃,不过看得出来nacos想要构建的生态野心更大,不过收费意图明显。

在这里插入图片描述


三、nacos的安装

nacos中文官网:https://nacos.io/zh-cn/docs/quick-start.html

1. 安装nacos

docker run --name nacos-standalone -e MODE=standalone -e JVM_XMS=512m -e JVM_XMX=512m -e JVM_XMN=256m -p 8848:8848 -d nacos/nacos-server:latest

2. 访问

http://IP:8848/nacos/nacos/index.html
用户名密码:nacos/nacos


四、nacos的组、配置集、命名空间

1. 命令空间

可以隔离配置集,将某些配置集放到某一个命名空间之下。命名空间我们一般用来区分微服务

在这里插入图片描述

2. 组

抛出一个问题:你现在确实能够隔离微服务,但是不同的微服务的开发、测试、生产环境如何区别,组可以用来区别区别开发、测试、生产环境

在这里插入图片描述

3. dataid - 配置集

一个配置集就是一个配置文件,实际上可以更灵活

在这里插入图片描述


五、python操作nacos配置

github库:https://github.com/nacos-group/nacos-sdk-python

import nacos

SERVER_ADDRESSES = "192.168.10.130:8848"
# 这里是namespace的id
NAMESPACE = "-944c-******-944c-******-944c-******"
# 建立连接  
client = nacos.NacosClient(SERVER_ADDRESSES, namespace=NAMESPACE, username="nacos", password="nacos")

data_id = "user-srv.json"
group = "dev"
print(type(client.get_config(data_id, group)))  # 返回的是字符串
import json
# 获取配置集并序列化成json
json_data = json.loads(client.get_config(data_id, group))
print(json_data)


def test_cb(args):
    print("配置文件产生变化")
    print(args)


if __name__ == '__main__':
	#实时监听配置文件
    client.add_config_watcher(data_id, group, test_cb)#这个必须放在main里面完成
    import time

    time.sleep(3000)

六、golang操作nacos配置

github库:https://github.com/nacos-group/nacos-sdk-go

package main

import (
	"encoding/json"
	"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"

	"awesomeProject3/config"
)

func main() {
	
	sc := []constant.ServerConfig{
		*constant.NewServerConfig("192.168.10.130", 8848, constant.WithContextPath("/nacos")),
	}
	//设置namespace的id    日志目录
	cc := *constant.NewClientConfig(
		constant.WithNamespaceId("-944c-******-944c-******"),
		constant.WithTimeoutMs(5000),
		constant.WithNotLoadCacheAtStart(true),
		constant.WithLogDir("tmp/nacos/log"),
		constant.WithCacheDir("tmp/nacos/cache"),
		constant.WithLogLevel("debug"),
	)
	//建立连接
	client, err := clients.NewConfigClient(
		vo.NacosClientParam{
			ClientConfig:  &cc,
			ServerConfigs: sc,
		},
	)
	if err != nil {
		fmt.Printf("PublishConfig err:%+v \n", err)
	}
	//获取配置集
	content, err := client.GetConfig(vo.ConfigParam{
		DataId: "user-web.json",
		Group:  "dev",
	})
	//fmt.Println(content)
	//这里是自己实例化的struct
	serverConfig := config.ServerConfig{}
	//想要将一个字符串转换成struct需要去设置这个struct的tag
	json.Unmarshal([]byte(content), &serverConfig)
	fmt.Println(serverConfig)
}

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jzin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值