网络编程
位置:首页>> 网络编程>> Go语言>> 详解go-micro微服务consul配置及注册中心

详解go-micro微服务consul配置及注册中心

作者:夏沫的梦  发布时间:2024-04-23 09:48:20 

标签:go,micro,consul,配置,注册

一 Consul介绍

Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置。 Consul是分布式的、高可用的、可横向扩展的。

1. 注册中心Consul基本介绍

  • Consul是一种服务网格解决方案

  • 提供具有服务发现,配置和分段功能的全功能控制平面

  • Consul 附带-个简单的内置代理,可以开箱即用

2.注册中心Consul关键功能

服务发现:

  • 客户端可以注册服务,程序可以轻松找到它们所依赖的服务

运行状况检查:

  • Consul客户端可以提供任意数量的运行状况检查

KV 存储:

  • 应用程序可以将Consul的层级键/值存储用于任何目的,包括动态配置,功能标记,协调,领导者选举等

安全服务通信:

  • Consul 可以为服务生成和分发TLS证书,建立相互的TLS连接

多数据中心:

  • Consul 支持多个数据中心

3.注册中心Consul两个重要协议

  • Gossip Protocol (八卦协议)

  • Raft Protocol ( 选举协议)

对于想要学习Consul原理的,可以自行百度详细了解这两个协议。

二 Consul安装

1.使用docker拉取镜像

  • 打开终端,输入以下命令:

docekr pull consul

等待一段时间后拉取成功

  • 启动命令:

docker run -d -p 8500:8500 consul

consul会被运行在本机的8500端口上

  • 检查是否运行

docker ps
  • 可视化界面

打开浏览器,输入http://127.0.0.1:8500

详解go-micro微服务consul配置及注册中心

三 Config配置

  • 在config目录下新建一个config.yaml

可以把配置相关信息先放在config.yaml里,之后放在consul中。

  • 编写代码:

name: "Account"
title: "账号功能"
mode: "dev"
port: 9580
version: "v0.0.1"
log:
 level: "debug"
 filename: "Account.log"
 max_size: 200
 max_age: 30
 max_backips: 7
mysql:
 host: "127.0.0.1"
 port: 3306
 user: "root"
 password: "xxx"
 dbname: "micro"
 max_open_conns: 200
 max_idle_conns: "50"
redis:
 host: "127.0.0.1"
 port: 6379
 password: "xxx"
 db: 4
 pool_size: 100
email:
 user: "xxx@qq.com"
 pass: "xxx"
 host: "smtp.qq.com"
 port: 465
 rename: "Account"
# 配置、注册中心
consul:
 host: "localhost"
 port: 8500
 prefix: "/micro/config"
 consulRegistry: "127.0.0.1:8500"
# 链路追踪
jaeger:
 serviceName: "go.micro.service.account"
 addr: "localhost:6831"
# 监控服务
prometheus:
 host: "0.0.0.0"
 port: 9089
# 限流
ratelimit:
 QPS: 1000
# 微服务
micro:
 name: "go.micro.service.account"
 version: "latest"
 address: ":9580"
  • 注意,以下字段自行修改:

    • mysql.password

    • redis.password

    • email.user

    • email.pass

四 Consul代码编写

  • 在micro目录下新建一个consul.go文件

1.设置consul配置中心

// GetConsulConfig 设置配置中心
func GetConsulConfig(host string, port int64, prefix string) (config.Config, error) {
  consulSource := consul.NewSource(
     //设置配置中心的地址
     consul.WithAddress(host+":"+strconv.FormatInt(port, 10)),
     //设置前缀,不设置默认前缀 /micro/config
     consul.WithPrefix(prefix),
     //是否移除前缀,这里是设置为true,表示可以不带前缀直接获取对应配置
     consul.StripPrefix(true),
  )
  //配置初始化
  newConfig, err := config.NewConfig()
  if err != nil {
     return newConfig, err
  }
  //加载配置
  err = newConfig.Load(consulSource)
  return newConfig, err
}

2.获取consul配置中心的数据

  • 编写结构体(嵌套结构)

type Account struct {
  Name    string `json:"name"`
  Title   string `json:"title"`
  Mode    string `json:"mode"`
  Port    int64  `json:"port"`
  Version string `json:"version"`
}
type Mysql struct {
  Host     string `json:"host"`
  User     string `json:"user"`
  Pwd      string `json:"pwd"`
  Database string `json:"database"`
  Port     int64  `json:"port"`
}
type Log struct {
  Level string `json:"level"`
  Filename string `json:"filename"`
  MaxSize int64 `json:"max_size"`
  MaxAge int64 `json:"max_age"`
  MaxBackips int64 `json:"max_backips"`
}
type Redis struct {
  Host string `json:"host"`
  Port int64 `json:"port"`
  Password string `json:"password"`
  Db int64 `json:"db"`
  PoolSize int64 `json:"pool_size"`
}
type Email struct {
  User string `json:"user"`
  Pass string `json:"pass"`
  Host string `json:"host"`
  Port int64 `json:"port"`
  Rename string `json:"rename"`
}
type Consul struct {
  Host string `json:"host"`
  Port int64 `json:"port"`
  Prefix string `json:"prefix"`
  ConsulRegistry string `json:"consulRegistry"`
}
type Jaeger struct {
  ServiceName string `json:"serviceName"`
  Addr string `json:"addr"`
}
type Prometheus struct {
  Host string `json:"host"`
  Port int64 `json:"port"`
}
type Ratelimit struct {
  QPS int64 `json:"QPS"`
}
type Micro struct {
  Name string `json:"name"`
  Version string `json:"version"`
  Address string `json:"address"`
}
type ConsulConfig struct {
  Account Account `json:"account"`
  Mysql Mysql `json:"mysql"`
  Log Log `json:"log"`
  Redis Redis `json:"redis"`
  Email Email `json:"email"`
  Consul Consul `json:"consul"`
  Jaeger Jaeger `json:"jaeger"`
  Prometheus Prometheus `json:"prometheus"`
  Ratelimit Ratelimit `json:"ratelimit"`
  Micro Micro `json:"micro"`
}
  • 获取consul数据

var(
  ConsulInfo *ConsulConfig
)
// GetAccountFromConsul 获取 consul 的配置
func GetAccountFromConsul(config config.Config, path ...string) error {
  consulData := &ConsulConfig{}
  config.Get(path...).Scan(consulData)
  ConsulInfo = consulData
  return nil
}

3.consul可视化界面数据编写

点击Key/Value,再点击Create

详解go-micro微服务consul配置及注册中心

  • 输入项目名称: micro/config/account

选择JSON

详解go-micro微服务consul配置及注册中心

  • 输入以下代码:

{
"account":{
"name": "Account",
"title": "账号功能",
"mode": "dev",
"port": 9580,
"version": "v0.0.1"
},
"log":{
"level": "debug",
"filename": "Account.log",
"max_size": 200,
"max_age": 30,
"max_backips": 7
},
"mysql":{
"host":"127.0.0.1",
"user":"root",
"pwd":"xxx",
"database":"micro",
"port":3306
},
"redis":{
"host": "127.0.0.1",
"port": 6379,
"password": "123456",
"db": 4,
"pool_size": 100
},
"consul":{
"host": "localhost",
"port": 8500,
"prefix": "/micro/config",
"consulRegistry": "127.0.0.1:8500"
},
"email":{
"user": "xxx@qq.com",
"pass": "xxx",
"host": "smtp.qq.com",
"port": 465,
"rename": "Account"
},
"jaeger":{
"serviceName": "go.micro.service.account",
"addr": "localhost:6831"
},
"prometheus":{
"host": "0.0.0.0",
"port": 9089
},
"ratelimit":{
"QPS": 1000
},
"micro":{
"name": "go.micro.service.account",
"version": "latest",
"address": ":9580"
}
}
  • 注意JSON格式,点击Save

4. main.go代码编写

// 1.配置中心
consulConfig, err := micro.GetConsulConfig("localhost", 8500, "/micro/config")
if err != nil {
  fmt.Printf("Init consulConfig failed, err: %v\n", err)
}
// 2.注册中心
consulRegistry := consul.NewRegistry(func(options *registry.Options) {
  options.Addrs = []string{
     "127.0.0.1:8500",
  }
})
if err := micro.GetAccountFromConsul(consulConfig, "account"); err != nil {
  fmt.Printf("Init consul failed, err: %v\n", err)
}
fmt.Println(micro.ConsulInfo)
  • 这时候,micro中的ConsulInfo可以用来使用consul中的数据了,使用 . 取数据

五 最后

  • 至此,go-micro微服务consul配置、注册中心开发工作就正式完成。

  • 接下来就开始Mysql的代码编写了,希望大家关注博主和关注专栏,第一时间获取最新内容,每篇博客都干货满满。

来源:https://juejin.cn/post/7186844220643098661

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com