之前有详细介绍过携程阿波罗的使用,本文将不再过多细节性的介绍,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 唯一确定一个配置
名词解析:
namespace:与 client 绑定,一个 clinet 对应到一个 namespace,可用来隔离环境或区分租户
group:分组,区分业务
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