微服务实战Go Micro v3 系列(五)- 注册和配置中心

celverbamboo · · 2399 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

这一篇就来讲讲,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)

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2399 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传