微服務實戰Go Micro v3 系列(五)- 注冊和配置中心


這一篇就來講講,go-micro v3 如何進行配置consul注冊中心和操作配置中心

源碼地址

系列文章

前言

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)

運行后入如下圖,可以看到,已經成功獲取剛才輸入的配置信息:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM