文章目录
一、为什么需要分布式配置中心
我们现在有一个项目,使用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)
}