(6)go-micro微服務consul配置、註冊中心

qi66發表於2023-01-10

一 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

image.png

三 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
    image.png
  • 輸入專案名稱: micro/config/account
  • 選擇JSON
    image.png
  • 輸入以下程式碼:
{
"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的程式碼編寫了,希望大家關注博主和關注專欄,第一時間獲取最新內容,每篇部落格都乾貨滿滿。

歡迎大家加入 夏沫の夢的學習交流群 進行學習交流經驗,點選 夏沫の夢學習交流

相關文章