zoukankan      html  css  js  c++  java
  • 配置中心之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想要构建的生态野心更大, 不过收费意图明显;

    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
      }
    }
    
  • 相关阅读:
    Docker安装
    Mysql 安全登陆工具 mysql_config_editor
    位图索引对于DML操作的影响
    删除Oracle Online Redo 测试
    16 Managing Undo
    Linux 不杀进程的情况下,如何释放磁盘资源
    SFTP 服务搭建
    8. DBNEWID 工具(使用nid命令修改db name及dbid)
    Null 值对索引排序的影响案例一则
    opensshd 源码升级
  • 原文地址:https://www.cnblogs.com/you-men/p/14968116.html
Copyright © 2011-2022 走看看