开发者

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

开发者 https://www.devze.com 2023-01-11 10:48 出处:网络 作者: 夏沫的梦
目录一 Consul介绍1. 注册中心Consul基本介绍2.注册中心Consul关键功能3.注册中心Consul两个重要协议二 Consul安装1.使用docker拉取镜像三 Config配置四 Consul代码编写1.设置consul配置中心2.获取consul配置中心的数
目录
  • 一 Consul介绍
    • 1. 注册中心Consul基本介绍
    • 2.注册中心Consul关键功能
    • 3.注册中心Consul两个重要协议
  • 二 Consul安装
    • 1.使用docker拉取镜像
  • 三 Config配置
    • 四 Consul代码编写
      • 1.设置consul配置中心
      • 2.获取consul配置中心的数据
      • 3.consul可视化界面数据编写
      • 4. main.go代码编写
    • 五 最后

      一 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端口上

      • 检查是否运行
      dockerjs ps
      
      • 可视化界面

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

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

      三 Config配置

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

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

      • 编写代码:
      name: "Account"
      title: "账号功能"
      mpythonode: "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      stri开发者_开发培训ng `json:"pwd"`
         Database string `json:"database"`
         Port     int64  `json:"por编程客栈t"`
      }
      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"php, err)
      }
      fmt.Println(micro.ConsulInfo)
      
      • 这时候,micro中的ConsulInfo可以用来使用consul中的数据了,使用 . 取数据

      五 最后

      • 至此,go-micro微服务consul配置、注册中心开发工作就正式完成。
      • 接下来就开始Mysql的代码编写了,希望大家关注博主和关注专栏,第一时间获取最新内容,每篇博客都干货满满。

      以上就是详解go-micro微服务consul配置及注册中心的详细内容,更多关于go micro consul配置注册的资料请关注我们其它相关文章!

      0

      精彩评论

      暂无评论...
      验证码 换一张
      取 消

      关注公众号