配置中心之Nacos簡介,使用及Go簡單集成

簡介

爲何須要配置中心

​ 咱們如今有一個項目, 使用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

Nacos安裝

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

Nacos使用

配置

命名空間

能夠隔離django

新建json

組 - 隔離

拋出一個問題: 你如今確實可以隔離微服務, 可是把不一樣微服務的開發,測試,生產如何區別;
此時就能夠用組隔離了flask

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
  }
}
相關文章
相關標籤/搜索