php入門到就業線上直播課:進入學習
Apipost = Postman + Swagger + Mock + Jmeter 超好用的API偵錯工具:
什麼是設定中心
用來統一管理專案中所有設定的系統。 雖然聽起來很簡單,但也不要小瞧了這個模組。 如果一箇中型網際網路專案,不採用設定中心的模式,一大堆的各類設定項,各種不定時的修改需求,一定會讓開發同學非常頭疼且管理十分混亂。
設定中心的服務流程如下: 使用者在設定中心更新設定資訊。 服務 A 和服務 B 及時得到設定更新通知,從設定中心獲取設定。 總得來說,設定中心就是一種統一管理各種應用設定的基礎服務元件。
在系統架構中,設定中心是整個微服務基礎架構體系中的一個元件,它的功能看上去並不起眼,無非就是設定的管理和存取,但它是整個微服務架構中不可或缺的一環。
nacos 是什麼
Nacos
Nacos 是 Naming and Configuration Service 的縮寫,從名字上能看出它重點關注的兩個領域是 Naming 即註冊中心和Configuration 設定中心。
業務上的設定,功能開關,服務治理上對弱依賴的降級,甚至資料庫的密碼等,都可能用到動態設定中心。 在沒有專門的設定中心元件時,我們使用寫死、或組態檔、或資料庫、快取等方式來解決問題。 寫死修改設定時需要重新編譯打包,組態檔需要重新啟動應用,資料庫受限於效能,快取喪失了及時性。
Nacos 的設定模型
namespace + group + dataId 唯一確定一個設定
namespace:與 client 繫結,一個 clinet 對應到一個 namespace,可用來隔離環境或區分租戶
group:分組,區分業務
dataId:設定的 id
來看一下是如何在實際場景使用的
例如:一個電商網站其中有這幾個模組:使用者模組、商品模組、訂單模組、庫存模組
這幾個模組都需要進行設定且它們的設定不同,這是我們為每一個模組做一個 namespace, 每一個模組都需要有
開發階段的設定,和上線後的設定,使用我們使用 dev, 和 pro 兩個分組來進行區分,對於 dataId,不管是 dev 還是
pro 都必須填寫。
Nacos 的安裝
這裡我們直接使用 docker 進行安裝
Nacos 的安裝 (docker)
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
登入後複製
存取:192.168.1.103:8848/nacos/index.html 使用者名稱 / 密碼:nacos/nacos
設定開機啟動:
docker container update --restart=always xxx
登入後複製
用 nacos 做設定
nacos 成功啟動後存取:192.168.1.103:8848/nacos/index.html
可以建立 namespace, 我們新建一個使用者模組 user , 建立成功後可以看到有對應的 id, 例如:7ae18f62-e2b9-48bd-bff2-a49e7443f5bc
然後我們在 user 名稱空間下新建一個組態檔,並填寫對應的名稱 (dataId) 和分組,這裡我們新建一個 josn 的組態檔:
{
"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"
}
}
登入後複製
這樣整個組態檔就設定完成了
讀取 nacos 中組態檔
拉取依賴
我們使用 go 來讀取組態檔,使用需要拉取 nacos 的 sdk:
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
登入後複製
讀取設定
在讀取設定之前我們先編寫一個用來做設定對映的結構體
目錄結構:
nacos_test
├── config
│ └── config.go
└── main.go
登入後複製
編寫 config 時需要注意的是我們需要保持 tag 名和組態檔中的名稱一致
package config
//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"`
}
登入後複製
下面進行組態檔讀取:
package main
import (
"StudyGin/nacos/config"
"encoding/json"
"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"
)
func main() {
//伺服器端設定, nacos執行的socket
sc := []constant.ServerConfig{
{
IpAddr: "10.2.81.102",
Port: 8848,
},
}
//客服端設定
cc := constant.ClientConfig{
NamespaceId: "7ae18f62-e2b9-48bd-bff2-a49e7443f5bc", // 如果需要支援多namespace,我們可以場景多個client,它們有不同的NamespaceId
TimeoutMs: 5000,
NotLoadCacheAtStart: true,
LogDir: "tmp/nacos/log",
CacheDir: "tmp/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: "user-web.json",
Group: "dev"})
if err != nil {
panic(err)
}
Config := &config.ServerConfig{}
//將設定資訊讀取到config.ServerConfig{}物件中
err = json.Unmarshal([]byte(content), &Config)
if err != nil {
panic(err)
}
fmt.Println(Config)
}
登入後複製
輸出:
&{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.1600}}
登入後複製
當然設定中心和 viper 都提供實時監控設定
可以這樣寫:
//監聽設定變化
err = configClient.ListenConfig(vo.ConfigParam{
DataId: "user-web",
Group: "DEV",
OnChange: func(namespace, group, dataId, data string) {
fmt.Println("組態檔變化")
fmt.Println("group:" + group + ", dataId:" + dataId + ", data:" + data)
},
})
time.Sleep(3000 * time.Second)
登入後複製
以上就是一文詳解設定中心nacos的安裝使用方法的詳細內容,更多請關注TW511.COM其它相關文章!