简介

为什么需要配置中心

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

考虑三种情况:

a . 添加配置项

1 . 你现在的用户服务有10个部署实例, 那么添加配置项你得去十个地方修改配置文件还得重新启动等;

2 . 即使Go的viper能完成修改配置文件自动生效, 那么你得考虑其他语言是否能做到这点, 其他微服务是否一定会使用viper?

b . 修改配置项

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

c . 开发,测试,生产环境如何隔离

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

配置中心选型

目前最主流的分布式配置中心主要有spring cloud config,apollo和nacos,spring cloud属于spring体系, 我们就考虑apollo(携程)和nacos(阿里),都是目前比较流行且维护活跃的2个配置中心;

a . apollo大而全, 功能完善, nacos小而全, 可以对比django和flask区别;

b . 部署nacos更加简单;

c .nacos不止支持配置中心还支持服务注册和发现;

d . 都支持各种语言, 不过apollo是第三方支持的,nacos是官方支持各种语言;

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

Nacos安装

https://nacos.io/zh-cn/docs/what-is-nacos.html

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

Nacos使用

配置

命名空间

可以隔离

新建

组 - 隔离

抛出一个问题: 你现在确实能够隔离微服务, 但是把不同微服务的开发,测试,生产如何区别;

此时就可以用组隔离了

dataid - 配置集

一个配置集就是一个配置文件,实际可以更灵活, 将db,server内容等配置分开管理;

Go集成Nacos

安装

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

Go操作Nacos

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
}
}

最新文章

  1. CentOS 静态IP设置
  2. MF-800U
  3. dev/shm time in linux
  4. 21.allegro下鼠标形状设置[原创]
  5. [教程] Windows Server 2008 R2架设SMTP服务器发送邮件教程
  6. HDU5807 Keep In Touch DP
  7. Java系列--第二篇 基于Maven的Android开发HelloAndroidWorld
  8. Linux下ifort的安装记录
  9. 前端学习:html基础学习二
  10. windows,分割路径.得出目录
  11. OAuth2.0 授权许可 之 Authorization Code
  12. 持续集成 自动化构建、测试、部署您的Coding代码
  13. java中String和StringBuffer的区别
  14. ELK日志收集
  15. CSS3知识!
  16. 利用java编写的盲注脚本
  17. ES3之closure ( 闭包 )
  18. 添加额外的源, 使得yum可以安装更多的软件
  19. UNIX高级环境编程(8)进程环境(Process Environment)- 进程的启动和退出、内存布局、环境变量列表
  20. 给用户root权限

热门文章

  1. 16.分类和static
  2. calico官网网络拓扑实现:基于eNSP与VMVare
  3. pycharm编辑器,各种设置及配置修改
  4. ubuntu查看已安装软件包信息的方法
  5. kvm总结复习
  6. ZooKeeper学习笔记三:使用ZooKeeper实现一个简单的配置中心
  7. .NET平台系列17 .NET5中的ARM64性能
  8. 华为4D成像雷达、智能驾驶平台MDC 810
  9. YOLOvi(i=1,2,3,4)系列
  10. LCD: 2D-3D匹配算法