微服务实战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)

运行后入如下图,可以看到,已经成功获取刚才输入的配置信息:

posted @ 2021-06-30 08:28  聪明的竹子_Alfred  阅读(1290)  评论(0编辑  收藏  举报