咱们如今有一个项目, 使用Gin进行开发的, 配置文件咱们知道是一个config.yaml的文件, 也知道这个配置文件在项目启动时会被加载到内存中使用;html
考虑三种状况:
a . 添加配置项
1 . 你如今的用户服务有10个部署实例, 那么添加配置项你得去十个地方修改配置文件还得从新启动等;
2 . 即便Go的viper能完成修改配置文件自动生效, 那么你得考虑其余语言是否能作到这点, 其余微服务是否必定会使用viper?git
b . 修改配置项
大量的服务可能会使用同一个配置,好比我要更新jwt的secret,这么多实例怎么办?github
c . 开发,测试,生产环境如何隔离
前面虽然已经介绍了viper,可是依然同样的问题,那么多服务如何统一这种考虑因素;web
目前最主流的分布式配置中心主要有spring cloud config,apollo和nacos,spring cloud属于spring体系, 咱们就考虑apollo(携程)和nacos(阿里),都是目前比较流行且维护活跃的2个配置中心;
a . apollo大而全, 功能完善, nacos小而全, 能够对比django和flask区别;
b . 部署nacos更加简单;
c .nacos不止支持配置中心还支持服务注册和发现;
d . 都支持各类语言, 不过apollo是第三方支持的,nacos是官方支持各类语言;redis
nacos很活跃, 不过看的出来nacos想要构建的生态野心更大, 不过收费意图明显;spring
https://nacos.io/zh-cn/docs/what-is-nacos.htmldocker
docker run --name nacos-standalone -e MODE=standalone -e JVM_XMS=512m -e JVM_MAX=512m -e JVM_XMN=256m -p 8848:8848 -d nacos/nacos-server:latest
能够隔离django
新建json
抛出一个问题: 你如今确实可以隔离微服务, 可是把不一样微服务的开发,测试,生产如何区别;
此时就能够用组隔离了flask
一个配置集就是一个配置文件,实际能够更灵活, 将db,server内容等配置分开管理;
go get -u github.com/nacos-group/nacos-sdk-go
https://github.com/nacos-group/nacos-sdk-go/blob/master/README_CN.md
Example1
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" "time" ) func main() { sc := []constant.ServerConfig{{ IpAddr: "192.168.0.4", Port: 8848, }} cc := constant.ClientConfig{ NamespaceId: "e6295280-8bc8-424e-b9c6-2eb61da8a189", // 若是须要支持多namespace,咱们能够场景多个client,它们有不一样的NamespaceId。当namespace是public时,此处填空字符串。 TimeoutMs: 5000, NotLoadCacheAtStart: true, LogDir: "log", CacheDir: "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: "user-web.yaml", Group: "dev", }) if err != nil { panic(err) } fmt.Println(content) //字符串 - yaml err = configClient.ListenConfig(vo.ConfigParam{ DataId: "user-web.yaml", Group: "dev", OnChange: func(namespace, group, dataId, data string) { fmt.Println("配置文件发生了变化...") fmt.Println("group:" + group + ", dataId:" + dataId + ", data:" + data) }, }) time.Sleep(300 * time.Second) }
配置映射为struct
go内置json,能够不用引入第三方Yaml,能够用如下网站转换下:
http://json2yaml.com/convert-yaml-to-json
{ "name": "user-web", "port": 9001, "user_srv": { "host": "192.168.0.84", "port": 50051, "name": "user_srv" }, "redis": { "host": "47.94.149.143", "password": "wunai.18", "port": 6379, "db": 0, "expire": 3000 }, "jwt": { "key": "!42&%MFFezZmB8a^RhUiGa$l5g2z65HZ" }, "ali_sms": { "key": "LTAI4GAdvAHSnQGAuiu2vicL", "secrect": "ZfneNg1Sa6bEpbVHlP16nCTmT9dInh" }, "consul": { "host": "192.168.0.4", "port": 8500 } }