go使用consul实现服务发现及配置共享实现详解
作者:dz45693 发布时间:2024-04-23 09:48:01
标签:go,consul,服务发现,配置共享
使用consul四大特性
1. 服务发现:利用服务注册,服务发现功能来实现服务治理。
2. 健康检查:利用consul注册的检查检查函数或脚本来判断服务是否健康,若服务不存在则从注册中心移除该服务,减少故障服务请求。
3. k/v数据存储:存储kv数据,可以作为服务配置中心来使用。
4. 多数据中心:可以建立多个consul集群通过inter网络进行互联,进一步保证数据可用性。
通过docker安装consul
docker pull consul:latest
//运行单机
docker run -d --restart=always --name consul -d -p 8500:8500 consul
/*
8500 http 端口,用于 http 接口和 web ui
8300 server rpc 端口,同一数据中心 consul server 之间通过该端口通信
8301 serf lan 端口,同一数据中心 consul client 通过该端口通信
8302 serf wan 端口,不同数据中心 consul server 通过该端口通信
8600 dns 端口,用于服务发现
-bbostrap-expect 2: 集群至少两台服务器,才能选举集群leader
-ui:运行 web 控制台
-bind: 监听网口,0.0.0.0 表示所有网口,如果不指定默认未127.0.0.1,则无法和容器通信
-client : 限制某些网口可以访问
*/
//集群
docker run --name consul1 -d -p 8500:8500 -p 8300:8300 -p 8301:8301 -p 8302:8302 -p 8600:8600 consul:latest agent -server -bootstrap-expect 2 -ui -bind=0.0.0.0 -client=0.0.0.0
docker run --name consul2 -d -p 8501:8500 consul agent -server -ui -bind=0.0.0.0 -client=0.0.0.0 -join 172.17.0.2
docker run --name consul2 -d -p 8502:8500 consul agent -server -ui -bind=0.0.0.0 -client=0.0.0.0 -join 172.17.0.2
实现代码
以下代码实现一个服务注册,服务发现,配置共享的功能:
package main
import (
"net"
"github.com/gin-gonic/gin"
"fmt"
"log"
"net/http"
consulapi "github.com/hashicorp/consul/api"
)
const (
consulAddress = "192.168.100.19:8500"
serviceId = "111"
)
func main() {
r := gin.Default()
// consul健康检查回调函数
r.GET("/", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "ok",
})
})
go http.ListenAndServe(":8081", r)
// 注册服务到consul
ConsulRegister()
// 从consul中发现服务
ConsulFindServer()
ConsulCheckHeath()
ConsulKVTest()
// 取消consul注册的服务
//ConsulDeRegister()
var str string
fmt.Scan(&str)
}
// 注册服务到consul
func ConsulRegister() {
// 创建连接consul服务配置
config := consulapi.DefaultConfig()
config.Address = consulAddress
client, err := consulapi.NewClient(config)
if err != nil {
log.Fatal("consul client error : ", err)
}
// 创建注册到consul的服务到
registration := new(consulapi.AgentServiceRegistration)
registration.ID = serviceId // 服务节点的名称
registration.Name = "go-consul-test" // 服务名称
registration.Port = 8081 // 服务端口
registration.Tags = []string{"go-consul-test"} // tag,可以为空
registration.Address = "192.168.3.42" // 服务 IP 要确保consul可以访问这个ip
// 增加consul健康检查回调函数
check := new(consulapi.AgentServiceCheck)
check.HTTP = fmt.Sprintf("http://%s:%d", registration.Address, registration.Port)
check.Timeout = "5s"
check.Interval = "5s" // 健康检查间隔
check.DeregisterCriticalServiceAfter = "30s" // 故障检查失败30s后 consul自动将注册服务删除
registration.Check = check
// 注册服务到consul
err = client.Agent().ServiceRegister(registration)
if err == nil {
fmt.Println("ConsulRegister done")
}
}
// 取消consul注册的服务
func ConsulDeRegister() {
// 创建连接consul服务配置
config := consulapi.DefaultConfig()
config.Address = consulAddress
client, err := consulapi.NewClient(config)
if err != nil {
log.Fatal("consul client error : ", err)
}
client.Agent().ServiceDeregister(serviceId)
}
// 从consul中发现服务
func ConsulFindServer() {
// 创建连接consul服务配置
config := consulapi.DefaultConfig()
config.Address = consulAddress
client, err := consulapi.NewClient(config)
if err != nil {
log.Fatal("consul client error : ", err)
}
// 获取所有service
services, _ := client.Agent().Services()
for _, value := range services {
fmt.Println("address:", value.Address)
fmt.Println("port:", value.Port)
}
fmt.Println("=================================")
// 获取指定service
service, _, err := client.Agent().Service(serviceId, nil)
if err == nil {
fmt.Println("address:", service.Address)
fmt.Println("port:", service.Port)
}
if err == nil {
fmt.Println("ConsulFindServer done")
}
}
func ConsulCheckHeath() {
// 创建连接consul服务配置
config := consulapi.DefaultConfig()
config.Address = consulAddress
client, err := consulapi.NewClient(config)
if err != nil {
log.Fatal("consul client error : ", err)
}
// 健康检查
a, b, _ := client.Agent().AgentHealthServiceByID(serviceId)
fmt.Println("val1:", a)
fmt.Println("val2:", b)
fmt.Println("ConsulCheckHeath done")
}
func ConsulKVTest() {
// 创建连接consul服务配置
config := consulapi.DefaultConfig()
config.Address = consulAddress
client, err := consulapi.NewClient(config)
if err != nil {
log.Fatal("consul client error : ", err)
}
// KV, put值
values := "test"
key := "go-consul-test"
client.KV().Put(&consulapi.KVPair{Key: key, Flags: 0, Value: []byte(values)}, nil)
// KV get值
data, _, _ := client.KV().Get(key, nil)
fmt.Println("data:", string(data.Value))
// KV list
datas, _, _ := client.KV().List("go", nil)
for _, value := range datas {
fmt.Println("val:", value)
}
keys, _, _ := client.KV().Keys("go", "", nil)
fmt.Println("key:", keys)
fmt.Println("ConsulKVTest done")
}
func localIP() string {
addrs, err := net.InterfaceAddrs()
if err != nil {
return ""
}
for _, address := range addrs {
if ipnet, ok := address.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
if ipnet.IP.To4() != nil {
return ipnet.IP.String()
}
}
}
return ""
}
运行结果
来源:https://www.cnblogs.com/majiang/p/14290357.html


猜你喜欢
- 一、提要 随着 python 的普及,越来越多的功能可用于 python 编码。使用此功能可以用更少的行和更清晰的
- mysql版本号是5.7.28,表A有390W条记录,使用InnoDB引擎,其中varchar类型字段mac已建立索引,索引方法为B-tre
- 恭喜您,您中奖了,你的中奖码是(请牢记,领奖需要):XXXXXXXXXXX然后用户输入XXXXXXXXXXX,简单验证后就可以领奖了。你使用
- 通过界面设计上是能手工操作的,无法达到我批量修改几千台服务器。 因为此了一个脚本来批量执行。 环境:redgate + mssql 2008
- 本文实例为大家分享了pygame贪吃蛇游戏的具体代码,供大家参考,具体内容如下1.准备工作我们已经初始化了一个400*400的界面,为方便看
- 1. 引言序列化是将对象转换为可以在以后保存和检索介质中的过程。比如,将对象的当前状态保存到文件中。对于一些复杂的项目,序列化是所有开发人员
- 目录简介快速使用格式时区cli总结参考简介不管什么时候,处理时间总是让人头疼的一件事情。因为时间格式太多样化了,再加上时区,夏令时,闰秒这些
- 1. 系统盘清理说明win7 80G的系统盘,随着使用时间的增加,空间越来越小,只剩不到2G,随计划清理系统盘数据1. maven 下载的j
- defer用于资源的释放,会在函数返回之前进行调用。如果有多个defer表达式,调用顺序类似于栈,越后面的defer表达式越先被调用。def
- 本文实例讲述了JavaScript使用math.js进行精确计算操作。分享给大家供大家参考,具体如下:javascript进行浮点运算会有尾
- 有一次去超市换货,本能的找到服务中心,服务中心说这个业务在超市旁边一个房间里,由于忘记带小票,那个小房间的人让我去另外一个小房间调电脑里的记
- 前言之前一直认为UTF-8是万能的字符集问题解决方案,直到最近遇到这个问题。最近在做新浪微博的爬虫, 在存库的时候发现只要保持emoji表情
- PlaywrightPlaywright 是微软公司开源的一款 UI 自动化测试工具,它的第一个版本 v0.10.0 发布于 2020 年
- QQ通过返回不同的图片,来表示在线或离线,图标也随之变换,既然图片不同,那么,返回的HTTP头信息中的Content-Length 也一定不
- 一、Python不同版本的类Python2.2之前是没有共同的祖先的,之后引入Object类,它是所有类的共同祖先类ObjectPython
- echarts legend点击事件首先,明确本篇文章的重点,主要有三个:1. 给legend添加点击事件2. 禁用legend点击事件的默
- 起因很单纯,就是给我1年级小豆包的女儿标注三国和西游章节的汉语拼音,我女儿每天
- 一、Python 的 IDE —— PyCharm1.1 集成开发环境(IDE)集成开发环境(IDE,Integrated Developm
- 基于微信开放的个人号接口python库itchat,实现对微信好友的获取,并对省份、性别、微信签名做数据分析。效果:直接上代码,建三个空文本
- CSS圆角的现实一直是大家所热衷的话题,我们进行CSS布局一直强调语义,强调文档的结构。圆角作为页面的外面表现,应该分离到CSS文件中,可以