consul 简易上手指南

简介: consul 是一个用来做服务发现的框架,具有分布式、高可用以及可横向扩展的特性

consul 是一个用来做服务发现的框架,具有分布式、高可用以及可横向扩展的特性

什么是服务发现?为什么要实现服务发现?

举个常见的例子:

假设有一台 client 想要实现不同的业务,就需要调用接口去访问后端的server

那这样 client 就需要知道后端 server 的网络配置,通常是将 server 的网络配置写到 client 配置文件中

image-20230131145253274.png

这样就会出现几个问题:

  1. 后面如果新增后端 server,就需要将新配置写进 client 本地上,导致后期配置文件越来越多,不便于维护
  2. 一旦后端某一服务的网络配置发生变化,需要修改 client 的配置
  3. 一旦后端某一服务出现故障,需要人工剔除配置项

为此,我们需要引入一个中间件来给 client 和 server 之间解耦,client 不需要关心后端 server 的配置,当需要实现某一业务的时候,只需要去服务发现中间件上面去获取到对应 server 的网络配置即可
image-20230131145723938.png
初识 consul

Consul 是 HashiCorp 公司推出的开源工具,由 go 语言开发,部署起来非常容易,只需要极少的可执行程序和配置文件,非常轻量,用于实现分布式系统的服务发现与配置的解决方案

常用的服务发现框架有:zookeeper、 etcd、Consul

consul 的一些特性:

  • 服务发现

    • Consul 提供了通过 DNS 或者 HTTP 接口的方式来注册服务和发现服务
    • 一些外部的服务通过 Consul 找到它所依赖的服务
  • 健康检查

    • Consul 的 Client 可以提供任意数量的健康检查,既可以与业务相关联(是否返回200 状态码)也可以与本地节点相关联(cpu 使用率等)
  • KV 存储

    • Consul 提供了简单的http接口,可以实现动态配置、功能标记、领袖选举等功能
  • 安全服务通信

    • 可以为服务生成和分发 TLS 证书,以便建立 TLS 连接
  • 多数据中心

    • consul 集群由多个 server 和 client 组成,所有的服务都可以注册到这些节点上

简单部署

consul 安装

#添加repo源
wget -O /etc/yum.repos.d/consul.repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo

#下载
yum install -y consul

下载后可以发现 consul 就是一个可执行的二进制文件

# rpm -ql consul
/etc/consul.d/consul.env
/etc/consul.d/consul.hcl
/usr/bin/consul
/usr/lib/systemd/system/consul.service

为了简单起见,我们现在将以开发模式启动 Consul 代理。 这种模式对于快速简单地启动单节点 Consul 环境非常有用

我们现在单机简单部署一下consul

#看下 agent 常用参数
consul agent --help

--server:定义运行server agent

--data-dir:配置consul数据存储路径

--bootstrap-expect:期望的server节点数目,consul一直等到指定sever数目的时候才会引导整个集群

--bind:该地址用来在集群内部的通讯,集群内的所有节点到地址都必须是可达的,默认是0.0.0.0

--node:节点在集群中的名称,在一个集群中必须是唯一的,默认是该节点的主机名

--ui: web的管理ui,查看服务和节点

--config-dir:配置文件目录,所有以.json结尾的文件都会被加载,可以是服务或consul自身的配置

--client:提供HTTP、DNS、RPC等服务,默认是127.0.0.1,不对外提供服务,如果需要则改成0.0.0.0
#开发模式启动consul agnet
consul agent -dev -client=0.0.0.0

执行上面这条命令之后,consul 会被启动起来,并且占用终端

加上 -client=0.0.0.0 参数是让我们能够通过本地浏览器来访问 consul 提供的 http 接口(即 consul 能够对外提供服务)
image-20230201143825415.png

注册服务

接下来我们将简单注册一个服务并在 web 界面上实现健康检查

这是官方文档给出的一个注册服务的配置示例:

{
  "id": "web1",
  "name": "web",
  "port": 80,
  "check": {
    "name": "ping check",
    "args": ["ping", "-c1", "learn.hashicorp.com"],
    "interval": "30s",
    "status": "passing"
  }
}

编写一个服务定义配置文件,假设有一个名为 web 的服务在端口 80 上运行

# vim /etc/consul.d/web.json
{"service": {"name": "web", "tags": ["rails"], "port": 80}}

ctrl+c 终止掉 consul 服务,重启 consul

consul agent -dev -client=0.0.0.0 -config-dir=/etc/consul.d
  • 查询服务

一旦 consul 启动,我们可以通过 HTTP API 方式来查询

即使用 /v1/catalog/service/{name} 查询

#web是自己定义服务的名字
curl http://localhost:8500/v1/catalog/service/web

还可以,通过浏览器访问 consul web界面去查看

image-20230201145126543.png
可以看到 web 服务已经注册上去了

自带健康检查功能
image-20230201145149624.png

k-v操作

除了提供服务发现和健康检查之外,consul 还支持 kv 存储

通过 kv 存储,可以实现动态配置保存、修改等功能

举个例子

有一台 server 提供 web 服务,它将网络配置信息以键值对形式保存到 consul 上

当 client 需要去调用这个 web 服务的时候,就去 consul 上面找到相关的 key 然后获取对应的 value

而当 server 的网络配置发生变化时,可以在 consul 上面直接修改 value
image-20230201150018411.png
如上图所示,key 为 webserver,value 为 ip 和 port,以 YAML 的形式保存

consul 上面的 value 有多种形式(JSON、HCL、XML、YAML)

一般我们对 kv 的操作有两种方式:

  1. 通过命令行来操作(CLI API)
  2. 通过 consul 提供的 web 界面(HTTP API)来操作

使用CLI API操作key/value

consul 命令操作 kv 文档:Commands: KV | Consul | HashiCorp Developer

#语法:
consul kv put 

我们想新增一个叫做 webserver 的 key,它的 value 如下:

ip=1.1.1.1 
port=80

查看发现没有 webserver 这个 key

[root@localhost ~]# consul kv get webserver
Error! No key exists at: webserver

我们添加一下

#方法1,通过eof实现换行输入
[root@localhost ~]# consul kv put webserver - <<EOF
> ip=1.1.1.1
> port=80
> EOF
#方法2,通过管道符结合 echo 换行 
[root@localhost ~]# echo -e 'ip=1.1.1.1 \nport=80'| consul kv put webserver -
#方法3,通过文件上传实现
[root@localhost ~]# cat info.txt
ip=1.1.1.1 
port=80

[root@localhost ~]#consul kv put webserver @info.txt
#语法
consul kv delete

假设我们提供 web 服务的 server 发生故障了,需要在 consul 上面删掉它的配置

#server配置
[root@localhost ~]# consul kv get webserver
ip=1.1.1.1 
port=80
[root@localhost ~]# consul kv delete webserver
Success! Deleted key: webserver

#成功删除
[root@localhost ~]# consul kv get webserver   
Error! No key exists at: webserver

假设你某一个 key 对应有多个value,如果修改 value 的话是全部修改的,不能说修改 value 中的某一个值

举个例子,我想修改 webserver 中的 port,将其改成100

[root@localhost ~]# consul kv get webserver
ip=1.1.1.1 
port=80

我只能全部修改,不能单独改 port 字段

[root@localhost ~]# consul kv put webserver - <<EOF
> ip=1.1.1.1
> port=100
> EOF

有一种比较好的方法,就是使用 import 和 export 参数

第一步:我们先将当前的 kv 导出到本地来作备份

[root@localhost ~]# consul kv export webserver >> webserver01.json

第二步:将新配置文件 import 上去

#方法1
consul kv import @webserver02.json
#方法2
cat webserver02.json | consul kv import -
#方法3
consul kv import "$(cat webserver02.json)"
#语法
consul kv get

查看指定 key

[root@localhost ~]# consul kv get webserver
ip=1.1.1.1 
port=80
[root@localhost ~]# consul kv get apiserver
ip=127.0.0.1
port=22

查看指定 key 的详细信息

[root@localhost ~]# consul kv get -detailed webserver
CreateIndex      141
Flags            0
Key              webserver
LockIndex        0
ModifyIndex      141
Session          -
Value            ip=1.1.1.1 
port=80

递归列出所有的 key 以及对应的 value

[root@localhost ~]# consul kv get -recurse webserver
webserver/1.0.0/config:ip=2.2.2.2
port=101
webserver/1.0.1/config:ip=2.2.2.3
port=102

递归列出所有的 key

[root@localhost ~]# consul kv get -keys
apiserver
webserver/
#注意加不加下划线的区别
[root@localhost ~]# consul kv get -keys webserver   
webserver/

[root@localhost ~]# consul kv get -keys webserver/
webserver/1.0.0/
webserver/1.0.1/

使用HTTP API操作key/value

使用浏览器访问 ip:8500 即可进入 consul web 界面

然后鼠标点点点就行了,本文不过多介绍
image-20230201160611085.png
image-20230201160622043.png

相关文章
|
存储 运维 网络协议
服务发现组件:Consul简易攻略
本篇作为Consul攻略的入门导引,帮助小伙伴了解Consul全貌,包含特性、命令操作、架构原理、介绍了Raft、Gossip协议等。
929 0
服务发现组件:Consul简易攻略
|
Windows
『Consul』Consul数据持久化配置并且注册为Windows服务
📣读完这篇文章里你能收获到 - Consul数据持久化配置并且注册为Windows服务
1327 0
『Consul』Consul数据持久化配置并且注册为Windows服务
|
网络协议 算法 Java
04SpringCloud 之 Consul 简介
04SpringCloud 之 Consul 简介
90 0
|
Java Linux 网络安全
05SpringCloud - Consul 环境搭建
05SpringCloud - Consul 环境搭建
50 0
|
JSON 算法 数据中心
consul介绍与安装
Consul是一个微服务管理软件。支持多数据中心下,分布式高可用的,服务发现和配置共享。采用 `Raft 算法`,用来保证服务的高可用。
198 0
consul介绍与安装
|
存储 Java 数据中心
服务发现框架Consul的使用
服务发现框架Consul的使用
235 0
|
JSON 前端开发 JavaScript
|
JavaScript 前端开发 API
|
机器学习/深度学习 JSON JavaScript
ES6详解 快速上手!
编程语言JavaScript是ECMAScript的实现和扩展 。ECMAScript是由ECMA(一个类似W3C的标准组织)参与进行标准化的语法规范。ECMAScript定义了:
ES6详解 快速上手!
C#-使用Consul
Consul是一个服务网格解决方案,提供了一个功能齐全的控制平面,具有服务发现、配置和分段功能。
135 0