Golang使用Consul详解

目录
  • 常用指令
  • 常用功能
  • 定义服务
  • 服务管理
  • 服务健康检查
  • go使用官方api包来定义服务\查询服务

常用指令

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 Consul内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 详解golang consul-grpc 服务注册与发现

    在微服务架构里面,每个小服务都是由很多节点组成,节点的添加删除故障希望能对下游透明,因此有必要引入一种服务的自动注册和发现机制,而 consul 提供了完整的解决方案,并且内置了对 GRPC 以及 HTTP 服务的支持 总体架构 服务调用: client 直连 server 调用服务 服务注册: 服务端将服务的信息注册到 consul 里 服务发现: 客户端从 consul 里发现服务信息,主要是服务的地址 健康检查: consul 检查服务器的健康状态 服务注册 服务端将服务信息注册到 con

  • Golang使用Consul详解

    目录 常用指令 常用功能 定义服务 服务管理 服务健康检查 go使用官方api包来定义服务\查询服务 常用指令 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 consu

  • golang time常用方法详解

    说明         在golang中,时间转换都会通过Time类型做一系列转换.主要包含,时间戳和时间字符串,时间字符串转换成另外的格式.总之所有的转换都是通过Time类型做中间转换.参考文档:https://golang.org/pkg/time/ 操作 1,获取当前时间 t1 := time.Now() // 返回的是时间Time类型 fmt.Println(t1, reflect.TypeOf(t1)) 2,获取指定时间 t4 := time.Date(2019, 9, 30, 14,

  • Makefile构建Golang项目示例详解

    目录 背景 创建项目并运行 添加 Makefile 文件 Makefile 概念 变量 使用 Makefile 自动化任务 背景 构建和测试大型项目时都会很耗时,且容易出错.开发者在开发过程中需要不断执行go build.go run .go test等相关命令.还可能需要多个命令来构建不同平台的二进制文件.在正式部署时候,我们可能还需要安装一些依赖项,或者在发布之前进行代码覆盖率测试等相关前置工作. 整个过程需要很多步骤,但我们有一种简单的方法可以解决这些复杂琐碎的步骤.使用 Make 进行自

  • GoLang BoltDB数据库详解

    说明 Bolt是一个纯粹Key/Value模型的程序.该项目的目标是为不需要完整数据库服务器(如Postgres或MySQL)的项目提供一个简单,快速,可靠的数据库. BoltDB只需要将其链接到你的应用程序代码中即可使用BoltDB提供的API来高效的存取数据.而且BoltDB支持完全可序列化的ACID事务,让应用程序可以更简单的处理复杂操作. BoltDB设计源于LMDB,具有以下特点: 使用Go语言编写 不需要服务器即可运行 支持数据结构 直接使用API存取数据,没有查询语句 支持完全可序

  • GOLang单元测试用法详解

    目录 概念 go test基本用法 go test 基础用例 测试可执行程序 外部测试包解决循环依赖 测试覆盖比例 测试基准函数 概念 单元测试 UT测试,针对程序来进行正确检测测试工作,一个优秀强壮代码 需要有完美的 UT测试用例 go test基本用法 go test 测试用例放在 *_test.go 文件中,与被测函数放到同一个目录下面go build 时候不会构建成包一部分 被测试用例函数命名 TestXXX. 第一个字母必须大写 测试函数: 检测逻辑是否正确 基准函数以BenChmar

  • 微服务之注册中心和配置中心Consul详解

    目录 概述 注册中心 注册中心选型 CAP原理 Consul介绍 Consul Raft算法 Consul 基本使用 注册服务 概述 上篇说到构建良好的架构,依托于基础设施建设(自动化测试.自动化部署.服务监控,服务发现.配置中心等等),决定成败的往往是基础设施建设,所以从搭建一个注册中心和配置中心开始我们新一阶段的启程. 注册中心 注册中心选型 你有没有思考过这样一个问题,为什么会有这么多的注册中心(etcd/ZooKeeper/Consul),选用那个最适合自己,是不是在选用的时候会眼花缭乱

  • Golang 内存模型详解(一)

    开始之前 首先,这是一篇菜B写的文章,可能会有理解错误的地方,发现错误请斧正,谢谢. 为了治疗我的懒癌早期,我一次就不写得太多了,这个系列想写很久了,每次都是开了个头就没有再写.这次争取把写完,弄成一个系列. 此 nil 不等彼 nil 先声明,这个标题有标题党的嫌疑. Go 的类型系统是比较奇葩的,nil 的含义跟其它语言有些差别,这里举个例子(可以直接进入 http://play.golang.org/p/ezFhXX0dnB 运行查看结果): 复制代码 代码如下: package main

  • golang 调用 php7详解及实例

    执行php文件 func Test_exec(t *testing.T) { engine.Initialize() ctx := &engine.Context{ Output: os.Stdout, } err := engine.RequestStartup(ctx) if err != nil { fmt.Println(err) } defer engine.RequestShutdown(ctx) err = ctx.Exec("/tmp/index.php") i

  • SpringCloud中的Consul详解

    目录 1. Consul 简介 2. 专业名词 3. Consul 的优势 4. 特性 5. Consul与Eureka的区别 6. Consul 安装 6.1 docker-compose安装 7. Quick Start 7.1 启动consul服务 7.2 创建客户端-provider 7.2.1 引入依赖坐标 7.2.2 配置application.yml 7.2.3 添加测试方法 7.3 创建客户端-comsumer 7.3.1 配置application.yml 7.3.2 添加支持

  • Golang基础教程之字符串string实例详解

    目录 1. string的定义 2.string不可变 3.使用string给另一个string赋值 4.string重新赋值 补充:字符串拼接 总结 1. string的定义 Golang中的string的定义在reflect包下的value.go中,定义如下: StringHeader 是字符串的运行时表示,其中包含了两个字段,分别是指向数据数组的指针和数组的长度. // StringHeader is the runtime representation of a string. // I

随机推荐