(6)go-micro微服务consul配置、注册中心

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: (6)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


59.png


三 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


60.png


  • 输入项目名称: micro/config/account
  • 选择JSON
  • 61.png
  • 输入以下代码:
{
"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的代码编写了,希望大家关注博主和关注专栏,第一时间获取最新内容,每篇博客都干货满满。
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
4天前
|
存储 负载均衡 NoSQL
微服务架构中的服务发现与注册中心
【6月更文挑战第23天】随着微服务架构的日益流行,服务发现和注册中心作为其核心组件,确保了服务的高可用性和伸缩性。本文将深入探讨服务发现机制的重要性、注册中心的工作原理以及它们在现代分布式系统中的应用,同时通过一个实际案例来展示如何在微服务环境中实现高效的服务管理。
|
3天前
|
Go
go配置镜像(阿里云、七牛)
go配置镜像(阿里云、七牛)
10 1
|
8天前
|
设计模式 负载均衡 API
微服务架构中的服务发现与注册中心
【6月更文挑战第19天】在微服务架构的海洋中,服务发现和注册中心扮演着灯塔的角色,指引着服务间的通信。本文将深入探讨服务发现的机制、注册中心的实现,以及它们如何协同工作以维护一个健康、动态的服务网络。我们将通过比喻和实例,揭示这一复杂系统背后的简洁之美。
13 3
|
21天前
|
设计模式 负载均衡 API
深入理解微服务架构中的服务发现与注册机制
在微服务架构的海洋中,服务发现和注册机制如同星辰导航,指引着服务的互联。本文将揭开服务发现与注册的神秘面纱,探讨它们如何在动态变化的云环境中确保服务间的高效通信。我们将从基本概念出发,逐步深入到实现原理,最后探讨如何在实际项目中应用这些机制以提升系统的可扩展性、可靠性和敏捷性。
|
1天前
|
Java Nacos 微服务
Spring Cloud微服务在Windows本地开发时禁用Nacos注册中心注册
Spring Cloud微服务在Windows本地开发时禁用Nacos注册中心注册
10 0
|
1天前
|
Go
Go环境配置
【6月更文挑战第11天】
9 0
|
1月前
|
缓存 微服务
01.【微服务架构】服务注册与发现:AP和CP,你选哪个? -- 客户端容错
【5月更文挑战第12天】客户端容错机制确保在服务端或注册中心故障时仍能正确发送请求。当服务端崩溃,由于延迟,客户端一段时间内仍会尝试发送请求。客户端应实施 failover 策略,即检测到调用失败后,切换到其他节点重试,并将故障节点从列表移除。延时通常等于服务端与注册中心心跳间隔加通知时间。若网络问题导致客户端无法访问服务端,客户端应发送心跳以检测服务端状态,成功则恢复,连续失败则视为崩溃。若客户端无法连接注册中心,它应使用本地缓存并考虑退出。
26 1
01.【微服务架构】服务注册与发现:AP和CP,你选哪个? -- 客户端容错
|
1月前
|
缓存 微服务
01.【微服务架构】服务注册与发现:AP和CP,你选哪个?-- 服务注册与发现模型
【5月更文挑战第1天】本文探讨了服务注册与发现的关键作用,在微服务架构中,这一概念常出现在面试中。文章深入讲解基础模型,包括服务端注册、心跳维持、客户端缓存及服务端下线流程,并强调了高可用性的重要性,涉及服务端崩溃检测、客户端容错和注册中心选型。通过分析客户端、注册中心和服务端之间的交互,提出如何应对潜在故障的策略,以构建稳定的微服务架构。
43 3
01.【微服务架构】服务注册与发现:AP和CP,你选哪个?-- 服务注册与发现模型
|
1月前
|
缓存 负载均衡 中间件
微服务架构下的服务发现与注册机制
【5月更文挑战第23天】在微服务架构的动态环境中,服务实例可能会频繁地上下线。为了维护系统的高可用性和伸缩性,服务发现与注册机制成为了一个关键因素。本文将探讨服务发现与注册的重要性,分析不同的实现策略,并展示如何利用这些机制来优化后端服务的交互流程。通过深入解析服务发现的多种模式及其对系统设计的影响,我们将提供一个清晰的指导,帮助开发者构建更加健壮和灵活的微服务系统。
|
1月前
|
JSON API Go
Go-Zero从0到1实现微服务项目开发(二)
继续更新GoZero微服务实战系列文章:上一篇被GoZero作者万总点赞了,本文将继续使用 Go-zero 提供的工具和组件,从零开始逐步构建一个基本的微服务项目。手把手带你完成:项目初始化+需求分析+表结构设计+api+rpc+goctl+apifox调试+细节处理。带你实现一个完整微服务的开发。

热门文章

最新文章