Go微服务: go-micro集成consul的注册中心和配置中心

微服务与注册中心的关系图

  • 这个图很好说明了微服务之间的关系,以及consul注册中心的重要性

环境准备


1 )consul 集群

  • 假设consul 集群已经搭建,已有5台server和2台client
  • 这里2台client被nginx做负载均衡,假设最终本地的访问地址是: http://localhost:8500
  • 如何做 consul 环境搭建,请在我的博客列表中搜索关键字: “consul”

2 )consul 中设置mysql的配置文件

  • 假设目前只有一个数据中心,如果有多个,则配置多个即可
  • 在consul的ui界面上的 Key / Value 菜单中配置,点击 Create 按钮
  • Key or folder 中 填入:micro/config/mysql
  • Value 中填入下面的json文件
    {"host": "127.0.0.1","port": 3307,"user": "root","pwd": "123456_mysql","database": "micro"
    }
    
  • 以上只是举例一种简单的mysql的配置,到生产环境,则进行生产的配置
  • 以此我们就完成了 consul 的搭建和配置 (搭建部分这里省略)

go-micro 代码集成


1 )结构介绍

  • 在当前项目中,假设目前当前模块仓库是 gitee.com/go-micro-services/category
  • 从命名中我们知道,当前这个仓库会同步到远程,不做赘述
  • common 目录作为通用的工具函数目录
  • domain 目录中分别定义了三个目录:model, repository, service
    • model 是定义的实体类,数据模型
    • repository 是基本数据库操作类,编写与数据库的映射关系
    • service 是基于repository封装的业务类
  • handler 目录暴露出来的服务
    • 在 proto 里面生成的服务,必须在 handler 中有所体现

2 )common 核心代码参考 common/config.go

package commonimport ("encoding/json""log""github.com/hashicorp/consul/api"
)// 定义一个map,key是字符串,value是api客户端或nil
var consulClients = make(map[string]*api.Client)// 获取配置中心客户端
func getConsulClient(address string) (*api.Client, error) {// 1. 从map中获取客户端client := consulClients[address]// 2. 如果存在,则直接返回if client != nil {return client, nil}// 3. 如果不存在,则新建config := api.DefaultConfig()config.Address = addressclient, err := api.NewClient(config)if err == nil {consulClients[address] = client // 没有错误进行挂载}// 4. 返回return client, err
}// 设置配置中心
func getConsulConfig(Address string, path string) (*api.KVPair, error) {// 1. 获取 Consul客户端client, clientErr := getConsulClient(Address)if clientErr != nil {log.Fatal(clientErr)}// 2. 创建KV客户端kv := client.KV()// 3. 基于path读取pairpair, _, getErr := kv.Get(path, nil)return pair, getErr
}func GetConsulMysqlConfig(address string, path string) (MysqlConfig, error) {// 1. 获取 pairpair, consulErr := getConsulConfig(address, path)if consulErr != nil {log.Fatal(consulErr)}// 2. 解析JSON字符串为 MysqlConfig 结构体var mysqlConfig MysqlConfigerr := json.Unmarshal(pair.Value, &mysqlConfig)return mysqlConfig, err
}
  • 可以看到,在上述代码中使用一个map来缓存客户端的创建过程
  • 以便后期可能调用其他可能的consul服务进行了扩展,提升一个性能
  • 同时,这里也有个mysql的配置封装

3 )main.go 核心代码

package mainimport ("fmt""log""strconv""github.com/go-micro/plugins/v4/registry/consul""go-micro.dev/v4""go-micro.dev/v4/registry""gitee.com/go-micro-services/category/common""gitee.com/go-micro-services/category/domain/repository""gitee.com/go-micro-services/category/domain/service""gitee.com/go-micro-services/category/handler"pbcategory "gitee.com/go-micro-services/category/proto/category""github.com/jinzhu/gorm"_ "github.com/jinzhu/gorm/dialects/mysql"
)var (serviceName = "go.micro.service.category"version     = "latest"host        = "127.0.0.1"port        = 8500address     = host + ":" + strconv.Itoa(port)configPath  = "/micro/config/mysql"
)func main() {// 1. 注册中心consulReg := consul.NewRegistry(registry.Addrs(address),)// 2. 创建服务srv := micro.NewService()srv.Init(micro.Name(serviceName),micro.Version(version),micro.Registry(consulReg),)// 3. 从配置中心获取mysql配置并创建处理mysqlConfig, consulConfigErr := common.GetConsulMysqlConfig(address, configPath)if consulConfigErr != nil {log.Fatal(consulConfigErr)}mysqlUrl := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local", mysqlConfig.User, mysqlConfig.Pwd, mysqlConfig.Host, mysqlConfig.Port, mysqlConfig.Database)db, dbErr := gorm.Open("mysql", mysqlUrl)if dbErr != nil {log.Fatal(dbErr)}defer db.Close()db.SingularTable(false) // true 则 表就是单数// 数据库表初始化,只执行一次, 如果本来就设计好了,则无需下面2行// rp := repository.NewCategoryRepository(db)// rp.InitTable()// 4. 创建服务实例categoryDataService := service.NewCategoryDataService(repository.NewCategoryRepository(db))// 5. 注册 handlerif handlerErr := pbcategory.RegisterCategoryHandler(srv.Server(), &handler.Category{CategoryDataService: categoryDataService}); handlerErr != nil {log.Fatal(handlerErr)}// 6. 运行服务if runErr := srv.Run(); runErr != nil {log.Fatal(runErr)}
}
  • 以上展示了服务集成的所有步骤,从 consul 配置中心中获取配置信息
  • 之后基于这些数据连接mysql, 进行数据和服务的初始化
  • 这里代码一目了然,不再一一进行解释

4 )其他说明

  • 这里不对其他模块的代码做一一说明,我们的目的是在go-micro中集成完成 consul
  • 这里 category 这个代码仓库是一个微服务,也就是说,每个微服务都需要注册到consul, 以便对微服务进行有效的管理
  • 同时,后期网关在调用微服务的时候,网关服务也要注册到consul中
  • 其他不是本文核心代码不做举例

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/618904.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

五、Jenkins、Docker、SpringClound持续集成

Jenkins、Docker、SpringClound持续集成 一、部署介绍1.部署图2.微服务项目结构3.项目启动顺序 二、微服务项目在Windows运行1.配置java、maven环境2.初始化数据库表/数据2.1 tensquare_gathering服务表2.2 tensquare_gathering服务表 3.启动微服务4.微服务接口测试4.1 获取用户…

回归预测 | Matlab基于RIME-SVR霜冰算法优化支持向量机的数据多输入单输出回归预测

回归预测 | Matlab基于RIME-SVR霜冰算法优化支持向量机的数据多输入单输出回归预测 目录 回归预测 | Matlab基于RIME-SVR霜冰算法优化支持向量机的数据多输入单输出回归预测预测效果基本描述程序设计参考资料 预测效果 基本描述 1.Matlab基于RIME-SVR霜冰算法优化支持向量机的数…

Qt 窗⼝

Qt 窗⼝ 菜单栏创建菜单栏在菜单栏中添加菜单创建菜单项在菜单项之间添加分割线综合⽰例 ⼯具栏创建⼯具栏设置停靠位置设置浮动属性设置移动属性综合⽰例状态栏状态栏的创建在状态栏中显⽰实时消息在状态栏中显⽰永久消息 浮动窗⼝浮动窗⼝的创建设置停靠的位置 对话框对话框介…

数据结构与算法——20.B-树

这篇文章我们来讲解一下数据结构中非常重要的B-树。 目录 1.B树的相关介绍 1.1、B树的介绍 1.2、B树的特点 2.B树的节点类 3.小结 1.B树的相关介绍 1.1、B树的介绍 在介绍B树之前,我们回顾一下我们学的树。 首先是二叉树,这个不用多说&#xff…

Unity类银河恶魔城学习记录12-14 p136 Merge Skill Tree with Sword skill源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili CharacterStats.cs using System.Collections; using System.Collections.…

【linux深入剖析】深入理解软硬链接 | 动静态库的制作以及使用

🍁你好,我是 RO-BERRY 📗 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 🎄感谢你的陪伴与支持 ,故事既有了开头,就要画上一个完美的句号,让我们一起加油 目录 1.理解软硬链接1.1 操作观…

基于机器学习的人脸发型推荐算法研究与应用实现

1.摘要 本文主要研究内容是开发一种发型推荐系统,旨在识别用户的面部形状,并根据此形状推荐最适合的发型。首先,收集具有各种面部形状的用户照片,并标记它们的脸型,如长形、圆形、椭圆形、心形或方形。接着构建一个面部…

ASP.NET公交车管理系统的实现与设计

摘 要 随着经济的日益增长,信息化时代已经到来,生活中各种信息趋向数字化、清晰化。公交车作为现代城市生活中一种重要的交通工具,其数量增多,车型也不再单一,雇用的司机增多,这样使得公交车公司的车辆信…

HTML重要标签重点及属性(表格表单列表)——之转生在异世界学前端

表格标签 table是用于定义表格的标签 tr是用于定义表格的行 td是用来定义表格的列,th是表头一般只有一个表头会加粗 表格属性border是设置边框值为1;1是有边框, align设置居中对齐方式center,left,right cellpadding设置文字…

ELFK日志分析系统之搭建ELF+Filebeaat+Zookeeper+Kafka

引言 结合前面所学 http://ELK日志分析系统 一、为什么要做日志分析平台 随着业务量的增长,每天业务服务器将会产生上亿条的日志,单个日志文件达几个GB,这时我们发现用Linux自带工具,cat grep awk 分析越来越力不从心了&#…

pixhawk控制板的ArduPilot固件编译

0. 环境 - ubuntu18(依赖python2和pip,建议直接ubuntu18不用最新的) - pixhawk 2.4.8 - pixhawk 4 1. 获取源码 # 安装git sudo apt install git # 获取源码 cd ~/work git clone --recurse-submodules https://github.com/ArduPilot/a…

分布式ID的方案和架构

超过并发,超高性能分布式ID生成系统的要求 在复杂的超高并发、分布式系统中,往往需要对大量的数据和消息进行唯一标识如在高并发、分布式的金融、支付、餐饮、酒店、电影等产品的系统中,数据日渐增长,对数据分库分表后需要有一个唯…