平时我们写一个demo的时候,或者说一个单体的应用,都会有一个配置文件,不管是 json文件或者yaml文件,里面包含了redis,mysql,es等信息,如果我们修改了配置文件,往往我们需要重启,为了避免重启,后来引入了viper,可以实现热更新。但并不是所有的项目都支持viper。 如果是一个分布式系统,肯定是有很多服务模块做支撑的,而且服务是可伸缩的,可能有几十台服务,也可能有几百台服务。如果每个服务模块下面都有自己的配置文件,那么如果mysql更新了端口号,运维人员就得一个一个文件的改。而且还可能不小心出错了。
所以综上,对于服务的配置,大概有这么三个痛点
为了解决上面的问题,配置中心应运而生。那么什么是配置中心呢?
目前最主流的分布式配置中心主要是有spring cloud config apollo和nacos,spring cloud属于java的spring体系,我们就考虑apollo和nacos。apollo与nacos 都为目前比较流行且维护活跃的2个配置中心。apollo是协程开源,nacos是阿里开源
- docker run -d --name nacos -p 8848:8848 --privileged=true -e JVM_XMS=256m -e JVM_XMX=256m -e MODE=standalone nacos/nacos-server:latest
-
http://127.0.0.1:8848/nacos/
- $ curl -X GET 'http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=user-dev&group=dev&tenant=311387f1-790b-4045-8787-571addb6c9fd'
- database:
- driver: mysql
- host: 192.168.2.251
- port: 13309
- username: test
- dbname: cnk_user
- password: user
-
- $ curl -X POST 'http://127.0.0.1:8848/nacos/v1/cs/configs' -d 'dataId=user-dev&group=dev&tenant=311387f1-790b-4045-8787-571addb6c9fd&content=test'
- true
在这里插入图片描述
- package main
-
- import (
- "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"
- )
-
- func main() {
- ch:=make(chan int)
- ch<-1
- }
-
- func init() {
- sc := []constant.ServerConfig{{
- IpAddr: "127.0.0.1",
- Port: 8848,
- }}
-
- cc := constant.ClientConfig{
- NamespaceId: "311387f1-790b-4045-8787-571addb6c9fd", // 如果需要支持多namespace,我们可以场景多个client,它们有不同的NamespaceId。当namespace是public时,此处填空字符串。
- TimeoutMs: 5000,
- NotLoadCacheAtStart: true,
- LogDir: "log",
- CacheDir: "cache",
- LogLevel: "debug",
- }
-
- configClient, err := clients.CreateConfigClient(map[string]interface{}{
- "serverConfigs": sc,
- "clientConfig": cc,
- })
- if err != nil {
- fmt.Println(err.Error())
- }
-
- content, err := configClient.GetConfig(vo.ConfigParam{
- DataId: "user-dev",
- Group: "dev",
- })
-
- if err != nil {
- fmt.Println(err.Error())
- }
- fmt.Println(content) //字符串 - yaml
- err = configClient.ListenConfig(vo.ConfigParam{
- DataId: "user-dev",
- Group: "dev",
- OnChange: func(namespace, group, dataId, data string) {
- fmt.Println("配置文件发生了变化...")
- fmt.Println("group:" + group + ", dataId:" + dataId + ", data:" + data)
- },
- })
- }
-
- $ curl -X POST 'http://127.0.0.1:8848/nacos/v1/cs/configs' -d 'dataId=user-dev&group=dev&tenant=311387f1-790b-4045-8787-571addb6c9fd&content=test1111'
- true
- package main
-
- import (
- "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"
- "gopkg.in/yaml.v2"
- )
-
- func main() {
- ch := make(chan int)
- ch <- 1
- }
-
- type DatabaseNew struct {
- Driver string `yaml:"driver"`
- Host string `yaml:"host"`
- Port int `yaml:"port"`
- Username string `yaml:"username"`
- Dbname string `yaml:"dbname"`
- Password string `yaml:"password"`
- }
- type ConfigNew struct {
- Database DatabaseNew//数据库的配置
- }
-
- var GlobalConfig ConfigNew
-
- func init() {
- sc := []constant.ServerConfig{{
- IpAddr: "127.0.0.1",
- Port: 8848,
- }}
-
- cc := constant.ClientConfig{
- NamespaceId: "311387f1-790b-4045-8787-571addb6c9fd", // 如果需要支持多namespace,我们可以场景多个client,它们有不同的NamespaceId。当namespace是public时,此处填空字符串。
- TimeoutMs: 5000,
- NotLoadCacheAtStart: true,
- LogDir: "log",
- CacheDir: "cache",
- LogLevel: "debug",
- }
-
- configClient, err := clients.CreateConfigClient(map[string]interface{}{
- "serverConfigs": sc,
- "clientConfig": cc,
- })
- if err != nil {
- fmt.Println(err.Error())
- }
-
- content, err := configClient.GetConfig(vo.ConfigParam{
- DataId: "user",
- Group: "prod",
- })
- SetConfig(content)
-
- if err != nil {
- fmt.Println(err.Error())
- }
- err = configClient.ListenConfig(vo.ConfigParam{
- DataId: "user",
- Group: "prod",
- OnChange: func(namespace, group, dataId, data string) {
- fmt.Println("配置文件发生了变化...")
- fmt.Println("group:" + group + ", dataId:" + dataId + ", data:" + data)
- SetConfig(data)
- },
- })
- }
-
- func SetConfig(content string) {
- fmt.Println(content)
- err := yaml.Unmarshal([]byte(content), &GlobalConfig)
- if err != nil {
- fmt.Println(err)
- }
- fmt.Printf("%+v", GlobalConfig)
- }
-
我们通过控制台面板修改配置