配置中心之Nacos简介,使用及Go简单应用

简介

为什么需要配置中心

我们现在有一个项目, 使用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想要构建的生态野心更大, 不过收费意图明显;

功能点

apollo

nacos

开源时间

2016.5

2018.6

配置实时回滚

支持(http长轮训)

支持(http长轮训)

配置回滚

支持

支持

灰度发布

支持

待支持

权限管理

支持

支持

多集群

支持

支持

监听查询

支持

支持

多语言

支持

支持

通信协议

http

http

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
  }
}
本站文章资源均来源自网络,除非特别声明,否则均不代表站方观点,并仅供查阅,不作为任何参考依据!
如有侵权请及时跟我们联系,本站将及时删除!
如遇版权问题,请查看 本站版权声明
THE END
分享
二维码
海报
配置中心之Nacos简介,使用及Go简单应用
我们现在有一个项目, 使用Gin进行开发的, 配置文件我们知道是一个config.yaml的文件, 也知道这个配置文件在项目启动时会被加载到内存中使用;
<<上一篇
下一篇>>