当前位置:首页 > 文章列表 > Golang > Go教程 > Golang使用Consul详解

Golang使用Consul详解

来源:脚本之家 2023-01-19 09:16:49 0浏览 收藏

IT行业相对于一般传统行业,发展更新速度更快,一旦停止了学习,很快就会被行业所淘汰。所以我们需要踏踏实实的不断学习,精进自己的技术,尤其是初学者。今天golang学习网给大家整理了《Golang使用Consul详解》,聊聊服务、Consul,我们一起来看看吧!

常用指令

agent指令

  • -bind=0.0.0.0 指定consul所在机器的ip地址
  • -http-port 指定web接口服务端口
  • -client 指定哪些机器可以访问consul, 0.0.0.0表示所有机器
  • -data-dir=path 指定服务数据文件存储位置
  • -dev 开发者模式,直接以默认模式启动consul
  • -node=hostname 服务发现的名字
  • -rejoin consul启动的时候,加入到的consul集群
  • -server 以服务方式开启server, 允许其他的consul连接到开启的consul上,不加则以客户端方式开启
  • -ui 可以谁用web页面来查看服务发现的详情
  • -config-dir 配置文件地址, 如果是文件夹会将所有文件合并,里面可以配置自己所在节点提供的服务
  • -bootstrap-expect 在一个集群中期望提供的server节点数目,当该值提供时, consul一直等到达到指定的server数目才会参加选举,推举自己为leader。这个可以避免不一致和脑裂现象

启动

consul agent -server -bootstrap-expect 1 -ui -rejoin -http-port=8080 -bind="127.0.0.1" -data-dir C:\Windows\tmp

members

查看集群中有多少成员

info

查看当前系欸但信息

leave

优雅关闭consul

reload

重新加载配置文件

常用功能

Consul最重要的的功能就是定义服务, 服务管理和健康检查

定义服务

要定义一个服务, 有两种方式:

  • 通过写配置文件, 让Consul读取
  • 通过接口向Consul服务进行注册

一般我们采用第二种方式, 但我们可以通过第一种方式的书写规则来了解服务定义的一些选项

我们可以通过启动时指定-config-dir来指定配置文件所在位置, 配置文件时json格式, 有多个会合并在一起

例子:

{
    "service": {
        "name": "redis", // 在consul面板上显示的服务名
        "id": "redis", // 服务id, 一般通过服务id对服务进行管理, 若不指定则会使用name作为id
        "address": "127.0.0.1", // 服务地址
        "port": 80, // 服务运行的端口
        "tags": [
            "primary"
        ], // 服务的标签, 可以作为服务的额外信息
        //   服务健康检查, 后面介绍
        "checks": [
            {
                "args": [
                    "/bin/check_redis",
                    "-p",
                    "7000"
                ],
                "interval": "30s",
                "timeout" : "60s"
            }
        ]
    }
}

服务管理

所谓服务管理就是指服务发现\服务注册\服务注销

consul服务端均提供了相应的http\dns等方式的接口可以方便地操作,

一般我们用go是用官方提供的一个api库进行操作, 对这些http的接口就不再过多赘述, 可以查阅官方文档

Consul API

服务健康检查

健康检查是为了避免服务突然宕机而调用方不知道的情况发生, 原理就是隔一段时间通信一次

consul提供了 tcp\ssl\ttl\udp\script\http等多种方式来进行健康检查,可以在服务注册时指定健康检查的方式

consul根据interval变量来决定多少时间间隔来通讯

根据timeout变量来决定发送请求后多久未收到回应算作失败

这里我们介绍三种, http|tcp|script方式

http方式

{
  "check": {
    "id": "api",
    "name": "HTTP API on port 5000",
    "http": "https://localhost:5000/health",   //调用接口
    "method": "POST",             
    "header": { "Content-Type": ["application/json"] },
    "body": "{\"method\":\"health\"}",
    "interval": "10s",   //
    "timeout": "1s"
  }
}

tcp方式

{
  "check": {
    "id": "ssh",
    "name": "SSH TCP on port 22",
    "tcp": "localhost:22",
    "interval": "10s",
    "timeout": "1s"
  }
}

script脚本方式

脚本方式略有不同,原理是通过调用脚本,查看脚本的返回值来判断健康检查是否通过

脚本退出代码为 0 : 通过健康检查

1 : 警告 其他: 健康检查失败

{
  "check": {
    "id": "mem-util",
    "name": "Memory utilization",
    "args": ["/usr/local/bin/check_mem.py", "-limit", "256MB"],  // 会被拼成 /usr/local/bin/check_mem.py -limit 256MB 来进行调用
    "interval": "10s",
    "timeout": "1s"
  }
}

grpc方式

检查grpc整个server状态

{
  "check": {
    "id": "mem-util",
    "name": "Service health status",
    "grpc": "127.0.0.1:12345",
    "grpc_use_tls": true,      //是否使用tls, 默认不使用
    "interval": "10s"
  }
}

只检查服务器上的某一个服务

{
  "check": {
    "id": "mem-util",
    "name": "Service health status",
    "grpc": "127.0.0.1:12345/my_service",
    "grpc_use_tls": true,
    "interval": "10s"
  }
}

go使用官方api包来定义服务\查询服务

console的github官网提供了一个go包操作consul服务端的实现, 我们可以使用这个包来实现服务发现

那么编写一个使用consul注册服务的服务端程序的核心逻辑是这样:

  • 创建consul客户端
  • 使用创建的consul客户端连接相应的consul agent
  • 向consul注册服务
  • 运行服务
  • 运行完毕后向consul注销服务

示例代码:

package main
import (
	"log"
	"net"

	"github.com/hashicorp/consul/api"
)
func main() {
	// 使用默认配置创建consul客户端
	consulClient, err := api.NewClient(api.DefaultConfig())
	if err != nil {
		log.Fatal(err)
	}
	// 注册服务
	// consulClient.Agent()先获取当前机器上的consul agent节点
	consulClient.Agent().ServiceRegister(&api.AgentServiceRegistration{
		ID:      "MyService",
		Name:    "My Service",
		Address: "127.0.0.1",
		Port:    5050,
		Check: &api.AgentServiceCheck{
			CheckID:  "MyService",
			TCP:      "127.0.0.1:5050",
			Interval: "10s",
			Timeout:  "1s",
		},
	})
	// 运行完成后注销服务
	defer consulClient.Agent().ServiceDeregister("MyService")
	l, err := net.Listen("tcp", ":5050")
	if err != nil {
		log.Fatal(err)
	}
	for {
		conn, err := l.Accept()
		if err != nil {
			log.Fatal(err)
		}
		go func() {
			log.Printf("Ip: %s connected", conn.RemoteAddr().String())
		}()
	}
} 

我们通过tcp每10秒进行健康检查, 输出窗口每10秒就会输出有新连接到来, 这是consul做的

$ go run .
2022/06/09 20:17:51 Ip: 127.0.0.1:53011 connected
2022/06/09 20:18:01 Ip: 127.0.0.1:53038 connected
2022/06/09 20:18:11 Ip: 127.0.0.1:53045 connected 

那么服务的请求端(客户端)需要通过consul来获取服务的地址和端口,则需要这么几步:

  • 创建consul客户端
  • 使用创建的consul客户端连接相应的consul agent
  • 向consul请求相应服务id的注册信息
  • 如果获取到了相应的注册信息, 就通过地址和端口请求服务

代码示例:

package main
import (
	"fmt"
	"log"
	"github.com/hashicorp/consul/api"
)
func main() {
	consulClient, err := api.NewClient(api.DefaultConfig())
	if err != nil {
		log.Fatal(err)
	}
	service, _, err := consulClient.Agent().Service("MyService", nil)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("Got Service: ip-%s, port-%d", service.Address, service.Port)
}

保证服务端运行的情况运行客户端:

$ go run .
Got Service: ip-127.0.0.1, port-5050

Consul使用Raft算法保证集群一致性

好了,本文到此结束,带大家了解了《Golang使用Consul详解》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

版本声明
本文转载于:脚本之家 如有侵犯,请联系study_golang@163.com删除
Go标准库http与fasthttp服务端性能对比场景分析Go标准库http与fasthttp服务端性能对比场景分析
上一篇
Go标准库http与fasthttp服务端性能对比场景分析
Golang超全面讲解并发
下一篇
Golang超全面讲解并发
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    542次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    508次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    497次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    484次学习
查看更多
AI推荐
  • 笔灵AI生成答辩PPT:高效制作学术与职场PPT的利器
    笔灵AI生成答辩PPT
    探索笔灵AI生成答辩PPT的强大功能,快速制作高质量答辩PPT。精准内容提取、多样模板匹配、数据可视化、配套自述稿生成,让您的学术和职场展示更加专业与高效。
    14次使用
  • 知网AIGC检测服务系统:精准识别学术文本中的AI生成内容
    知网AIGC检测服务系统
    知网AIGC检测服务系统,专注于检测学术文本中的疑似AI生成内容。依托知网海量高质量文献资源,结合先进的“知识增强AIGC检测技术”,系统能够从语言模式和语义逻辑两方面精准识别AI生成内容,适用于学术研究、教育和企业领域,确保文本的真实性和原创性。
    22次使用
  • AIGC检测服务:AIbiye助力确保论文原创性
    AIGC检测-Aibiye
    AIbiye官网推出的AIGC检测服务,专注于检测ChatGPT、Gemini、Claude等AIGC工具生成的文本,帮助用户确保论文的原创性和学术规范。支持txt和doc(x)格式,检测范围为论文正文,提供高准确性和便捷的用户体验。
    30次使用
  • 易笔AI论文平台:快速生成高质量学术论文的利器
    易笔AI论文
    易笔AI论文平台提供自动写作、格式校对、查重检测等功能,支持多种学术领域的论文生成。价格优惠,界面友好,操作简便,适用于学术研究者、学生及论文辅导机构。
    40次使用
  • 笔启AI论文写作平台:多类型论文生成与多语言支持
    笔启AI论文写作平台
    笔启AI论文写作平台提供多类型论文生成服务,支持多语言写作,满足学术研究者、学生和职场人士的需求。平台采用AI 4.0版本,确保论文质量和原创性,并提供查重保障和隐私保护。
    35次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码