微服务之配置中心

为什么需要配置中心

  1. 添加配置项不方便,大量部署实例需要修改配置麻烦
  2. go使用viper能自动生效,不保证其他服务
  3. 开发、测试、生产的环境隔离

20230618161628

配置中心技术选型

目前主流有spring cloud config、apollo和nacos

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

  1. Apollo大而全,功能完善。nacos小而全
  2. 部署nacos简单
  3. nacos不仅仅支持配置中心和支持服务注册和发现
  4. 都支持各种语言,不过apollo是第三方支持,nacos 是官方支持
功能点 apollo nacos
开源时间 2016.5 2018.6
配置实时推送 支持(http长轮询) 支持(http长轮询)
配置回滚 支持 支持
灰度发布 支持 待支持
权限管理 支持 支持
多集群 支持 支持
监听查询 支持 支持
多语言 主流语言 主流语言(官方支持)
通信协议 http http

nacos

安装

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

基本概念

命名空间

配置集合,隔离分组

命令空间区分 微服务

不同微服务之间的,开发、测试、生产环境的区别使用

dataid

数据配置集

整合到gin

安装go-sdk

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

获取到nacos的client

package initialize

import (
"encoding/json"
"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"
"shop_api/user-web/global"
)

func InitNacos() error {
sc := []constant.ServerConfig{
{
IpAddr: global.NacosConf.Host,
Port: global.NacosConf.Port,
},
}

cc := constant.ClientConfig{
NamespaceId: "c1872978-d51c-4188-a497-4e0cd20b97d5", // 如果需要支持多namespace,我们可以场景多个client,它们有不同的NamespaceId
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": sc,
"clientConfig": cc,
})
if err != nil {
panic(err)
}

content, err := configClient.GetConfig(vo.ConfigParam{
DataId: global.NacosConf.DataID,
Group: global.NacosConf.Group})

if err != nil {
return err
}
//fmt.Println(content) //字符串 - yaml
//serverConfig := global.AppConfig{}
//想要将一个json字符串转换成struct,需要去设置这个struct的tag
err = json.Unmarshal([]byte(content), &global.AppConf)
if err != nil {
return err
}
fmt.Println(global.AppConf)
//err = configClient.ListenConfig(vo.ConfigParam{
// DataId: "user-web.json",
// Group: "dev",
// OnChange: func(namespace, group, dataId, data string) {
// fmt.Println("配置文件变化")
// fmt.Println("group:" + group + ", dataId:" + dataId + ", data:" + data)
// },
//})
//time.Sleep(3000 * time.Second)
return nil
}

yaml

host: 192.168.28.145
port: 8848
nameSpace: 93e9005f-d1ec-4988-8586-332927badab0
user: nacos
password: nacos
dataID: user-srv.yaml
group: dev