【Consul】构建高效的服务治理体系:基于Golang实现Consul服务的注册、注销、修改、监控注册的服务变化、实时同步服务信息机制

【Consul】基于Go实现Consul服务的注册、注销、修改、监控注册的服务变化、实时同步服务信息机制


大家好 我是寸铁👊
总结了一篇【Consul】基于Go实现Consul服务的注册、注销、修改、监控注册的服务变化、实时同步服务信息机制✨
这应该是目前全网最全的使用golang手搓Consul服务信息机制✨
喜欢的小伙伴可以点点关注 💝

在这里插入图片描述


前言

consul常常被用来作服务注册与服务发现,而它的watch机制则可被用来监控一些数据的更新,包括:nodes, KV pairs, health checks等。另外,在监控到数据变化后,还可以调用外部处理程序,此处理程序可以是任何可执行文件或HTTP调用,具体说明可见官网。


介绍

consul中的watch可以监听servicek-vcheckevent等事件的变化,实时获取最新的数据。
consul支持以下watch类型:

key 监听一个consul kv中的key
keyprefix 监听consul kv中的key的前缀
services 监听有效服务的变化
nodes 监听节点的变化
service 监听服务的变化
checks 监听check的变化
event 监听自定义事件的变化

从以上可以看出consul提供非常丰富的监听类型,通过这些类型我们可以实时观测到consul整个集群中的变化,从而实现一些特别的需求,比如:服务告警,配置实时更新等功能。


启动与后台展示

Windows启动命令如下:

consul agent -dev

在这里插入图片描述


后台运行结果展示如下:

在这里插入图片描述


UI界面展示

在这里插入图片描述

在这里插入图片描述

Consul服务

AgentService结构体字段具体信息

1.Kind:服务类型,是一个自定义类型 ServiceKind。
2.ID:服务的唯一标识符。(一个ID只能对应一个服务)
3.Service:服务的名称(一个服务可以创建多个ID)
4.Tags:服务的标签,以字符串数组形式存储。
5.Meta:服务的元数据,以键值对的形式存储。
6.Port:服务的端口号。
7.Address:服务的地址。
8.SocketPath:服务的套接字路径,可选的,以字符串形式存储。
9.TaggedAddresses:带标签的地址,以键值对的形式存储,键是标签,值是 ServiceAddress 类型。
10.Weights:服务的权重,类型为 AgentWeights。
11.EnableTagOverride:是否启用标签覆盖。
12.CreateIndex:创建索引,无符号整数类型,用于 JSON 序列化时忽略。
13.ModifyIndex:修改索引,无符号整数类型,用于 JSON 序列化时忽略。
14.ContentHash:内容哈希,字符串类型,用于 JSON 序列化时忽略。
15.Proxy:代理配置,类型为 AgentServiceConnectProxyConfig,可选的。
16.Connect:连接信息,类型为 AgentServiceConnect,可选的。
17.PeerName:对等名称,字符串类型,可选的。
18.Namespace:命名空间,字符串类型,用于 JSON 序列化时忽略。
19.Partition:分区,字符串类型,用于 JSON 序列化时忽略。
20.Datacenter:数据中心,字符串类型,用于 JSON 序列化时忽略。
21.Locality:地点信息,类型为 Locality,用于 JSON 序列化时忽略。    


打印的结果如下:

服务的类型Kind:
服务的ID:  him-service-1
服务的名字Service:  him-service
服务的标签Tags:  [tag1 tag2]
服务的元数据Meta:  map[]
服务的端口Port:  8082
服务的地址Address:  127.0.0.4
服务的套接字路径SocketPath:
服务的带标签的地址TaggedAddresses:  map[lan_ipv4:{
   
   127.0.0.4 8082} wan_ipv4:{
   
   127.0.0.4 8082}]
服务的权重Weights:  {
   
   1 1}
服务是否启用标签覆盖EnableTagOverride:  false
服务创建的索引CreateIndex:  5235
服务修改的索引ModifyIndex:  5235
服务内容哈希ContentHash:
服务代理配置Proxy:  &{
   
   []    0   <nil> map[] [] {
   
   } {
   
   false []} <nil>}
服务连接信息Connect:  &{
   
   false <nil>}
服务对等名称PeerName:
服务的命名空间Namespace:
服务的数据中心Datacenter:
服务的分区Partition:
服务的地点信息Locality:  <nil>

同下:

在这里插入图片描述


注册Consul服务

package main

import (
	"fmt"
	"github.com/hashicorp/consul/api"
)

func main() {
   
   
	//写api的配置信息
	config := api.DefaultConfig()
	//注册到consul上的地址
	config.Address = "127.0.0.1:8500" // Consul 服务器地址

	//将config注册到客户端,由客户端实现
	client, err := api.NewClient(config)
	if err != nil {
   
   
		panic(err)
	}

	// 创建一个新的服务条目
	registration := new(api.AgentServiceRegistration)
	registration.ID = "my-service-3"
	registration.Name = "my-service"
	registration.Port = 8083
	registration.Address = "127.0.0.1"
	registration.Tags = []string{
   
   "tag1", "tag2"}

	reg := &api.AgentServiceRegistration{
   
   
		Name:    registration.Name,    // 服务名称
		ID:      registration.ID,      // 服务 ID,必须唯一
		Address: registration.Address, //服务的地址
		Port:    registration.Port,    // 服务端口 服务所在的监听端口
		Tags:    registration.Tags,    // 可选:服务标签
	}

	// 将服务注册到 Consul
	err = client.Agent().ServiceRegister(reg)
	if err != nil {
   
   
		panic(err)
	}
	fmt.Println("Service registered successfully")

}


注销Consul服务

package main

import (
	"fmt"
	"log"

	"github.com/hashicorp/consul/api"
)

func main() {
   
   
	// 创建Consul客户端
	config := api.DefaultConfig()
	client, err := api.NewClient(config)
	if err != nil {
   
   
		log.Fatal(err)
	}

	// 创建注销的服务ID
	serviceID := "my-service-2"

	// 注销服务
	agent := client.Agent()
	if err := agent.ServiceDeregister(serviceID); err != nil {
   
   
		log.Fatal(err)
	}
	fmt.Println("Service deregistered successfully")
}


实时同步更新Consul服务的信息

package main

import (
	"fmt"
	"github.com/hashicorp/consul/api"
	"time"
)

type Service struct {
   
   
	Name    string
	ID      string
	Address string
	Port    int
	Tags    []string
}

var serviceMap = map[string][]map
评论 42
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寸 铁

感谢您的支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值