目錄
一 Consul介紹
Consul是HashiCorp公司推出的開源工具,用於實現分散式系統的服務發現與配置。 Consul是分散式的、高可用的、可橫向擴充套件的。
1. 註冊中心Consul基本介紹
-
Consul是一種服務網格解決方案
-
提供具有服務發現,配置和分段功能的全功能控制平面
-
Consul 附帶-個簡單的內建代理,可以開箱即用
2.註冊中心Consul關鍵功能
-
服務發現:
- 客戶端可以註冊服務,程式可以輕鬆找到它們所依賴的服務
-
執行狀況檢查:
- Consul客戶端可以提供任意數量的執行狀況檢查
-
KV 儲存:
- 應用程式可以將Consul的層級鍵/值儲存用於任何目的,包括動態配置,功能標記,協調,領導者選舉等
-
安全服務通訊:
- Consul 可以為服務生成和分發TLS證照,建立相互的TLS連線
-
多資料中心:
- Consul 支援多個資料中心
3.註冊中心Consul兩個重要協議
-
Gossip Protocol (八卦協議)
-
Raft Protocol ( 選舉協議)
對於想要學習Consul原理的,可以自行百度詳細瞭解這兩個協議。
二 Consul安裝
1.使用docker拉取映象
- 開啟終端,輸入以下命令:
docekr pull consul
等待一段時間後拉取成功
- 啟動命令:
docker run -d -p 8500:8500 consul
consul會被執行在本機的8500埠上
- 檢查是否執行
docker ps
- 視覺化介面
開啟瀏覽器,輸入http://127.0.0.1:8500
三 Config配置
- 在config目錄下新建一個config.yaml
可以把配置相關資訊先放在config.yaml裡,之後放在consul中。
- 編寫程式碼:
name: "Account"
title: "賬號功能"
mode: "dev"
port: 9580
version: "v0.0.1"
log:
level: "debug"
filename: "Account.log"
max_size: 200
max_age: 30
max_backips: 7
mysql:
host: "127.0.0.1"
port: 3306
user: "root"
password: "xxx"
dbname: "micro"
max_open_conns: 200
max_idle_conns: "50"
redis:
host: "127.0.0.1"
port: 6379
password: "xxx"
db: 4
pool_size: 100
email:
user: "xxx@qq.com"
pass: "xxx"
host: "smtp.qq.com"
port: 465
rename: "Account"
# 配置、註冊中心
consul:
host: "localhost"
port: 8500
prefix: "/micro/config"
consulRegistry: "127.0.0.1:8500"
# 鏈路追蹤
jaeger:
serviceName: "go.micro.service.account"
addr: "localhost:6831"
# 監控服務
prometheus:
host: "0.0.0.0"
port: 9089
# 限流
ratelimit:
QPS: 1000
# 微服務
micro:
name: "go.micro.service.account"
version: "latest"
address: ":9580"
- 注意,以下欄位自行修改:
- mysql.password
- redis.password
- email.user
- email.pass
四 Consul程式碼編寫
- 在micro目錄下新建一個consul.go檔案
1.設定consul配置中心
// GetConsulConfig 設定配置中心
func GetConsulConfig(host string, port int64, prefix string) (config.Config, error) {
consulSource := consul.NewSource(
//設定配置中心的地址
consul.WithAddress(host+":"+strconv.FormatInt(port, 10)),
//設定字首,不設定預設字首 /micro/config
consul.WithPrefix(prefix),
//是否移除字首,這裡是設定為true,表示可以不帶字首直接獲取對應配置
consul.StripPrefix(true),
)
//配置初始化
newConfig, err := config.NewConfig()
if err != nil {
return newConfig, err
}
//載入配置
err = newConfig.Load(consulSource)
return newConfig, err
}
2.獲取consul配置中心的資料
- 編寫結構體(巢狀結構)
type Account struct {
Name string `json:"name"`
Title string `json:"title"`
Mode string `json:"mode"`
Port int64 `json:"port"`
Version string `json:"version"`
}
type Mysql struct {
Host string `json:"host"`
User string `json:"user"`
Pwd string `json:"pwd"`
Database string `json:"database"`
Port int64 `json:"port"`
}
type Log struct {
Level string `json:"level"`
Filename string `json:"filename"`
MaxSize int64 `json:"max_size"`
MaxAge int64 `json:"max_age"`
MaxBackips int64 `json:"max_backips"`
}
type Redis struct {
Host string `json:"host"`
Port int64 `json:"port"`
Password string `json:"password"`
Db int64 `json:"db"`
PoolSize int64 `json:"pool_size"`
}
type Email struct {
User string `json:"user"`
Pass string `json:"pass"`
Host string `json:"host"`
Port int64 `json:"port"`
Rename string `json:"rename"`
}
type Consul struct {
Host string `json:"host"`
Port int64 `json:"port"`
Prefix string `json:"prefix"`
ConsulRegistry string `json:"consulRegistry"`
}
type Jaeger struct {
ServiceName string `json:"serviceName"`
Addr string `json:"addr"`
}
type Prometheus struct {
Host string `json:"host"`
Port int64 `json:"port"`
}
type Ratelimit struct {
QPS int64 `json:"QPS"`
}
type Micro struct {
Name string `json:"name"`
Version string `json:"version"`
Address string `json:"address"`
}
type ConsulConfig struct {
Account Account `json:"account"`
Mysql Mysql `json:"mysql"`
Log Log `json:"log"`
Redis Redis `json:"redis"`
Email Email `json:"email"`
Consul Consul `json:"consul"`
Jaeger Jaeger `json:"jaeger"`
Prometheus Prometheus `json:"prometheus"`
Ratelimit Ratelimit `json:"ratelimit"`
Micro Micro `json:"micro"`
}
- 獲取consul資料
var(
ConsulInfo *ConsulConfig
)
// GetAccountFromConsul 獲取 consul 的配置
func GetAccountFromConsul(config config.Config, path ...string) error {
consulData := &ConsulConfig{}
config.Get(path...).Scan(consulData)
ConsulInfo = consulData
return nil
}
3.consul視覺化介面資料編寫
- 點選Key/Value,再點選Create
- 輸入專案名稱: micro/config/account
- 選擇JSON
- 輸入以下程式碼:
{
"account":{
"name": "Account",
"title": "賬號功能",
"mode": "dev",
"port": 9580,
"version": "v0.0.1"
},
"log":{
"level": "debug",
"filename": "Account.log",
"max_size": 200,
"max_age": 30,
"max_backips": 7
},
"mysql":{
"host":"127.0.0.1",
"user":"root",
"pwd":"xxx",
"database":"micro",
"port":3306
},
"redis":{
"host": "127.0.0.1",
"port": 6379,
"password": "123456",
"db": 4,
"pool_size": 100
},
"consul":{
"host": "localhost",
"port": 8500,
"prefix": "/micro/config",
"consulRegistry": "127.0.0.1:8500"
},
"email":{
"user": "xxx@qq.com",
"pass": "xxx",
"host": "smtp.qq.com",
"port": 465,
"rename": "Account"
},
"jaeger":{
"serviceName": "go.micro.service.account",
"addr": "localhost:6831"
},
"prometheus":{
"host": "0.0.0.0",
"port": 9089
},
"ratelimit":{
"QPS": 1000
},
"micro":{
"name": "go.micro.service.account",
"version": "latest",
"address": ":9580"
}
}
- 注意JSON格式,點選Save
4. main.go程式碼編寫
// 1.配置中心
consulConfig, err := micro.GetConsulConfig("localhost", 8500, "/micro/config")
if err != nil {
fmt.Printf("Init consulConfig failed, err: %v\n", err)
}
// 2.註冊中心
consulRegistry := consul.NewRegistry(func(options *registry.Options) {
options.Addrs = []string{
"127.0.0.1:8500",
}
})
if err := micro.GetAccountFromConsul(consulConfig, "account"); err != nil {
fmt.Printf("Init consul failed, err: %v\n", err)
}
fmt.Println(micro.ConsulInfo)
- 這時候,micro中的ConsulInfo可以用來使用consul中的資料了,使用 . 取資料
五 最後
-
至此,go-micro微服務consul配置、註冊中心開發工作就正式完成。
-
接下來就開始Mysql的程式碼編寫了,希望大家關注博主和關注專欄,第一時間獲取最新內容,每篇部落格都乾貨滿滿。