阿里配置中心 Nacos 的安装使用

之前有详细介绍过携程阿波罗的使用,本文将不再过多细节性的介绍,Nacos相较阿波罗较为简介,功能也很完善;这款工具同样是java开发,基于SpringBoot

安装

docker 一键安装,不多花1分钟在运维身上

docker run --name nacos-standalone -e MODE=standalone -e JVM_XMS=512m -e JVM_XMX=512m -e JVM_XMN=256m -p 8848:8848 -d nacos/nacos-server:latest
命令介绍

创建一个新的Docker容器,并将它命名为"nacos-standalone"。该命令中的参数有:

  • --name nacos-standalone:这是新创建的Docker容器的名称。
  • -e MODE=standalone:在容器内设置环境变量MODE的值为"standalone",这可能是用来告诉Nacos服务运行在独立模式。
  • -e JVM_XMS=512m 和 -e JVM_XMX=512m:这些是用来设置Java虚拟机(JVM)的最小和最大内存。这里的值都是"512m",意味着JVM将使用的最小内存和最大内存都是512MB。
  • -e JVM_XMN=256m:这个参数用来设置Java堆的最大大小。这里的值是"256m",意味着Java堆的最大大小是256MB。
  • -p 8848:8848:这个参数是用来映射容器的端口到主机的端口。这里是将容器的8848端口映射到主机的8848端口。
  • -d nacos/nacos-server:latest:这是Docker容器的镜像名称和标签,这里的镜像是"nacos/nacos-server",并且使用的是最新版本。

创建一个新的名为"nacos-standalone"的Docker容器,将Nacos服务运行在独立模式,并设置其Java内存参数,然后将容器的8848端口映射到主机的8848端口,最后使用"nacos/nacos-server"的最新版本的镜像来启动容器。

接下来,访问主页即可

http://10.0.50.65:8848/nacos/index.html

模型设计介绍

namespace + group + dataId 唯一确定一个配置

名词解析:

  1. namespace:与 client 绑定,一个 clinet 对应到一个 namespace,可用来隔离环境或区分租户

  2. group:分组,区分业务

  3. dataId:配置的 id

案例:

例如:一个电商网站其中有这几个模块:用户模块、商品模块、订单模块、库存模块

这几个模块都需要进行配置且它们的配置不同,这是我们为每一个模块做一个 namespace,每一个模块都需要有开发阶段的配置,和上线后的配置;
我们使用 dev, 和 pro 两个分组来进行区分,对于 dataId,不管是 dev 还是 pro 都必须填写

填写配置文件

讲下面配置文件内容,录入系统

{
    "name": "user-web",
    "host": "10.2.106.169",
    "port": 9091,
    "tags":["iceymoss", "goods", "golang", "web"],
    "user_srv":{
        "name": "user-srv",
        "host": "10.2.106.169",
        "port": 8081
    },
    "jwt":{
        "key": "dfijdfjidhfjijdfbdfdFwohPd6XmVCdnQi"
    },
    "sms":{
        "key": "mykey",
        "secret": "mysecret"
    },
    "params":{
        "sign_name": "生鲜小店",
        "code": "SMS_244610581"
    },
    "redis":{
        "host": "127.0.0.1",
        "port": 6379,
        "expir": 300
    },
    "verify":{
        "width": 5
    },
    "consul":{
        "host": "10.2.106.169",
        "port": 8500
    },
    "tracing":{
        "host": "127.0.0.1",
        "port": 6831,
        "name": "shopping"
    }
}
创建命名空间 命名空间-新建命名空间

里面有一个默认的public空间名,咱不用,自己建一个,命名空间ID不填写,会自动生成

命名空间名: mynacos/web/demo
描述: 我的第一个用于web项目的配置
创建配置 配置管理-配置列表-创建配置-发布

添加配置时,记的在表头上方选中刚刚创建的命名空间

Data ID: my-web-demo1
Group: dev
描述: 测试环境的,web项目配置文件
配置格式: JSON
配置内容: 把上面那一大串json配置文本拷贝进去

这样就完事儿,按照同样的方法,再新建一次(pro环境的)

Data ID: my-web-demo2
Group: pro
描述: 测试环境的,web项目配置文件(生产)
配置格式: JSON
配置内容: 把上面那一大串json配置文本拷贝进去,注意,把jwt里的key改成 prodprodprodprodprodprodprodprodprod 以作区分

程序使用

大多数编程语言都支持,本文采用golang示例

客户端包

go get github.com/nacos-group/nacos-sdk-go/clients
go get github.com/nacos-group/nacos-sdk-go/common/constant
go get github.com/nacos-group/nacos-sdk-go/vo

我们需要编写两个文件,1个客户端请求文件,1个是配置文件的映射结构体
.
├── config.go
└── nacos_test.go

config.go

package nacos

// UserSerConfig 映射用户配置
type UserSerConfig struct {
    Name string `mapstructure:"name" json:"name"`
    Host string `mapstructure:"host" json:"host"`
    Port int    `mapstructure:"port" json:"port"`
}

// JWTConfig 映射token配置
type JWTConfig struct {
    SigningKey string `mapstructure:"key" json:"key"`
}

// AliSmsConfig 阿里秘钥
type AliSmsConfig struct {
    Apikey    string `mapstructure:"key" json:"key"`
    ApiSecret string `mapstructure:"secret" json:"secret"`
}

// ParamsConfig 短信模板配置
type ParamsConfig struct {
    SignName     string `mapstructure:"sign_name" json:"sign_name"`
    TemplateCode string `mapstructure:"code" json:"code"`
}

// RedisConfig redis数据库配置
type RedisConfig struct {
    Host  string `mapstructure:"host" json:"host"`
    Port  int    `mapstructure:"port" json:"port"`
    Expir int    `mapstructure:"expir" json:"expir"`
}

// Verifier 手机验证长度
type Verifier struct {
    Width int `mapstructure:"width" json:"width"`
}

type ConsulConfig struct {
    Host string `mapstructure:"host" json:"host"`
    Port int    `mapstructure:"port" json:"port"`
}

// ServerConfig  映射服务配置 整合上面所有的结构体
type ServerConfig struct {
    Name        string        `mapstructure:"name" json:"name"`
    Port        int           `mapstructure:"port" json:"port"`
    UserSerInfo UserSerConfig `mapstructure:"user_srv" json:"user_srv"`
    JWTInfo     JWTConfig     `mapstructure:"jwt" json:"jwt"`
    AliSms      AliSmsConfig  `mapstructure:"sms" json:"sms"`
    Params      ParamsConfig  `mapstructure:"params" json:"params"`
    Redis       RedisConfig   `mapstructure:"redis" json:"redis"`
    Verify      Verifier      `mapstructure:"verify" json:"verify"`
    ConsulInfo  ConsulConfig  `mapstructure:"consul" json:"consul"`
}

nacos_test.go

package nacos_test

import (
    "encoding/json"
    "fmt"
    "go-zero-demo/user/api/widget/nacos"
    "testing"

    "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"
)

func TestNacos(t *testing.T) {
    // 服务端配置, nacos运行的socket
    sc := []constant.ServerConfig{
        {
            IpAddr: "10.0.50.65", // 服务端ip 咱没有用集群部署,直接填admin地址就行
            Port:   8848,         // 一个神圣的端口
        },
    }
    // 客服端配置
    cc := constant.ClientConfig{
        NamespaceId:         "c53ec492-7621-4f62-a4d5-3ca08318284a", // 刚才创建的命名空间ID
        TimeoutMs:           5000,
        NotLoadCacheAtStart: true,
        LogDir:              "log/nacos/log",
        CacheDir:            "log/nacos/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: "my-web-demo2", // Data ID
        Group:  "pro"})         // Group 名字
    if err != nil {
        panic(err)
    }
    Config := &nacos.ServerConfig{}
    // 将配置信息读取到nacos.ServerConfig{}对象中
    err = json.Unmarshal([]byte(content), &Config)
    if err != nil {
        panic(err)
    }
    fmt.Println(Config)
}

此时此刻,已大功告成,运行

wancheng@MacBook-Pro nacos % go test
&{user-web 9091 {user-srv 10.2.106.169 8081} {prodprodprodprodprodprodprodprodprod} {mykey mysecret} {生鲜小店 SMS_244610581} {127.0.0.1 6379 300} {5} {10.2.106.169 8500}}

我们把 Data ID 和 Group 名字 换成dev的,再运行一遍

wancheng@MacBook-Pro nacos % go test
&{user-web 9091 {user-srv 10.2.106.169 8081} {dfijdfjidhfjijdfbdfdFwohPd6XmVCdnQi} {mykey mysecret} {生鲜小店 SMS_244610581} {127.0.0.1 6379 300} {5} {10.2.106.169 8500}}

明显看到, jwt的key值返回了不一样的

此时的目录结构为

.
├── config.go
├── log
│   └── nacos
│       ├── cache
│       │   └── config
│       │       ├── my-web-demo1@@dev@@c53ec492-7621-4f62-a4d5-3ca08318284a
│       │       └── my-web-demo2@@pro@@c53ec492-7621-4f62-a4d5-3ca08318284a
│       └── log
│           └── nacos-sdk.log
└── nacos_test.go

多了1个log文件夹

好了,我们已最快最简洁的示例为大家做了演示,秉持着不多话1分钟浪费在运帷上的原则,我们不搞集群、不搞图片傻瓜式教学、不搞admin后台的鉴权、不搞长轮训结合viper监听等等,为了就是把时间留给代码,如用于团队生产,文档和实际代码是最重要的

官方文档 https://nacos.io/zh-cn/index.html
竞品 https://www.jianshu.com/p/fbf07c664cbc

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容