这一篇就来讲讲,go-micro v3 如何进行配置consul注册中心和操作配置中心
<!--more-->
## 源码地址
* [源码地址](https://github.com/CleverBamboo/go-micro-examples)
* [爱租房](https://github.com/CleverBamboo/renting)
## 系列文章
* [微服务实战Go Micro v3 系列(一)- 基础篇](https://cleverbamboo.github.io/2021/04/27/GO/微服务实战Go-Micro-v3-系列(一)-基础篇/#more)
* [微服务实战Go Micro v3 系列(二)- HelloWorld](https://cleverbamboo.github.io/2021/04/27/GO/微服务实战Go-Micro-v3-系列(二)-HelloWorld/#more)
* [微服务实战Go-Micro v3 系列(三)- 启动HTTP服务](https://cleverbamboo.github.io/2021/04/28/GO/微服务实战Go-Micro-v3-系列(三)-启动HTTP服务/#more)
* [微服务实战Go Micro v3 系列(四)- 事件驱动(Pub/Sub)](https://cleverbamboo.github.io/2021/05/12/GO/微服务实战Go-Micro-v3-系列(四)-事件驱动-Pub-Sub/#more)
* [微服务实战Go Micro v3 系列(五)- 注册和配置中心](https://cleverbamboo.github.io/2021/06/02/GO/%E5%BE%AE%E6%9C%8D%E5%8A%A1%E5%AE%9E%E6%88%98Go-Micro-v3-%E7%B3%BB%E5%88%97%EF%BC%88%E4%BA%94%EF%BC%89-%E6%B3%A8%E5%86%8C%E5%92%8C%E9%85%8D%E7%BD%AE%E4%B8%AD%E5%BF%83/#more)
* [微服务实战Go Micro v3 系列(六)- 综合篇(爱租房项目)](https://cleverbamboo.github.io/2021/06/08/GO/%E5%BE%AE%E6%9C%8D%E5%8A%A1%E5%AE%9E%E6%88%98Go-Micro-v3-%E7%B3%BB%E5%88%97%EF%BC%88%E5%85%AD%EF%BC%89-%E7%BB%BC%E5%90%88%E7%AF%87%EF%BC%88%E7%88%B1%E7%A7%9F%E6%88%BF%E9%A1%B9%E7%9B%AE%EF%BC%89/#more)
## 前言
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界面了,如图:
![](https://z3.ax1x.com/2021/06/02/2Qfqmt.png)
## 关键代码
```go
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** 注册即可
运行后效果图如下:
![](https://z3.ax1x.com/2021/06/02/2QTBY6.png)
## 配置中心
点击 Key/Value 创建目录 micro/config,然后在config目录分别创建 mysql、redis、logger、server 四个目录,如下图所示:
![](https://z3.ax1x.com/2021/06/03/2l4HA0.png)
以其中mysql为例,输入一下信息:
```
{
"host": "192.168.0.65", // 主机地址
"user": "root", // 用户名
"pwd": "123456", // 密码
"database": "go-shop-b2b2c", // 数据库
"port": 3306 // 端口
}
```
然后在 **registerConfiguration** 创建 config 目录,并创建 config.go、mysql.go文件,分别编写其中代码
### config.go
```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
```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
在启动服务之前就可以获取配置中心的配置信息,代码如下:
```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)
```
运行后入如下图,可以看到,已经成功获取刚才输入的配置信息:
![](https://z3.ax1x.com/2021/06/03/2lTLZ9.png)
有疑问加站长微信联系(非本文作者)