這一篇就來講講,go-micro v3 如何進行配置consul注冊中心和操作配置中心
源碼地址
系列文章
- 微服務實戰Go Micro v3 系列(一)- 基礎篇
- 微服務實戰Go Micro v3 系列(二)- HelloWorld
- 微服務實戰Go-Micro v3 系列(三)- 啟動HTTP服務
- 微服務實戰Go Micro v3 系列(四)- 事件驅動(Pub/Sub)
- 微服務實戰Go Micro v3 系列(五)- 注冊和配置中心
- 微服務實戰Go Micro v3 系列(六)- 綜合篇(愛租房項目)
前言
go-micro框架為服務注冊發現提供了標准的接口Registry。只要實現這個接口就可以定制自己的服務注冊和發現。不過官方已經為主流注冊中心提供了官方的接口實現,大多數時候我們不需要從頭寫起。
代碼倉庫
Docker 安裝 Consul
這里使用 consul 演示,因為consul自帶UI界面,方便操作
docker pull consul # 默認拉取latest
運行單機版consul
docker run -d -p 8500:8500 --restart=always --name=consul consul:latest agent -server -bootstrap -ui -node=1 -client='0.0.0.0'
參數解釋如下:
-
agent: 表示啟動 Agent 進程。
-
server:表示啟動 Consul Server 模式
-
client:表示啟動 Consul Client 模式。
-
bootstrap:表示這個節點是 Server-Leader ,每個數據中心只能運行一台服務器。技術角度上講 Leader 是通過 Raft 算法選舉的,但是集群第一次啟動時需要一個引導 Leader,在引導群集后,建議不要使用此標志。
-
ui:表示啟動 Web UI 管理器,默認開放端口 8500,所以上面使用 Docker 命令把 8500 端口對外開放。
-
node:節點的名稱,集群中必須是唯一的,默認是該節點的主機名。
-
client:consul服務偵聽地址,這個地址提供HTTP、DNS、RPC等服務,默認是127.0.0.1所以不對外提供服務,如果你要對外提供服務改成0.0.0.0
-
join:表示加入到某一個集群中去。 如:-json=192.168.0.11。
運行成功后,訪問 http://localhost:8500
就可以到consul自帶的UI界面了,如圖:
關鍵代碼
package main
import (
"github.com/asim/go-micro/plugins/registry/consul/v3"
"github.com/asim/go-micro/v3"
"github.com/asim/go-micro/v3/logger"
"github.com/asim/go-micro/v3/registry"
"go-micro-examples/registerConfiguration/handler"
pb "go-micro-examples/registerConfiguration/proto"
)
func main() {
// Register consul
reg := consul.NewRegistry(func(options *registry.Options) {
options.Addrs =[]string{"127.0.0.1:8500"}
})
// Create service
srv := micro.NewService(
micro.Name("go.micro.srv.registerconfiguration"),
micro.Version("latest"),
// 注冊consul中心
micro.Registry(reg),
)
// Register handler
if err := pb.RegisterRegisterConfigurationHandler(srv.Server(), new(handler.RegisterConfiguration)); err != nil {
logger.Fatal(err)
}
// Run service
if err := srv.Run(); err != nil {
logger.Fatal(err)
}
}
go-micro v3 提供 plugins,只需要引入並創建實例之后,使用 micro.Registry 注冊即可
運行后效果圖如下:
配置中心
點擊 Key/Value 創建目錄 micro/config,然后在config目錄分別創建 mysql、redis、logger、server 四個目錄,如下圖所示:
以其中mysql為例,輸入一下信息:
{
"host": "192.168.0.65", // 主機地址
"user": "root", // 用戶名
"pwd": "123456", // 密碼
"database": "go-shop-b2b2c", // 數據庫
"port": 3306 // 端口
}
然后在 registerConfiguration 創建 config 目錄,並創建 config.go、mysql.go文件,分別編寫其中代碼
config.go
package config
import (
"github.com/asim/go-micro/plugins/config/source/consul/v3"
"github.com/asim/go-micro/v3/config"
"strconv"
)
const (
Host = "192.168.0.65"
Port = 8500
Prefix = "/micro/config"
)
// GetConsulConfig 設置配置中心
func GetConsulConfig() (config.Config, error) {
//添加配置中心
//配置中心使用consul key/value 模式
consulSource := consul.NewSource(
//設置配置中心地址
consul.WithAddress(Host+":"+strconv.FormatInt(Port, 10)),
//設置前綴,不設置默認為 /micro/config
consul.WithPrefix(Prefix),
//是否移除前綴,這里設置為true 表示可以不帶前綴直接獲取對應配置
consul.StripPrefix(true),
)
//配置初始化
conf, err := config.NewConfig()
if err != nil {
return conf, err
}
//加載配置
err = conf.Load(consulSource)
return conf, err
}
mysql.go
package config
import "github.com/asim/go-micro/v3/config"
// MysqlConfig 創建結構體
type MysqlConfig struct {
Host string `json:"host"`
User string `json:"user"`
Pwd string `json:"pwd"`
Database string `json:"database"`
Port int64 `json:"port"`
}
// GetMysqlFromConsul 獲取mysql的配置
func GetMysqlFromConsul(config config.Config, path ...string) (*MysqlConfig, error) {
mysqlConfig := &MysqlConfig{}
//獲取配置
err := config.Get(path...).Scan(mysqlConfig)
if err != nil {
return nil, err
}
return mysqlConfig, nil
}
main.go
在啟動服務之前就可以獲取配置中心的配置信息,代碼如下:
// 配置中心
consulConfig, err := config.GetConsulConfig("127.0.0.1", 8500, "/micro/config")
if err != nil {
logger.Fatal(err)
}
// Mysql配置信息
mysqlInfo, err := config.GetMysqlFromConsul(consulConfig, "mysql")
if err != nil {
logger.Fatal(err)
}
logger.Info("Mysql配置信息:", mysqlInfo)
運行后入如下圖,可以看到,已經成功獲取剛才輸入的配置信息: