这一篇就来讲讲,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)
运行后入如下图,可以看到,已经成功获取刚才输入的配置信息: