consul 服务注册发现以及与nginx联动

2023年 7月 16日 110.6k 0

1.Consul介绍

Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置。内置了服务注册与发现框架、分布一致性协议实现、健康检查、Key/Value存储、多数据中心方案,不再需要依赖其他工具(比如ZooKeeper等)。使用起来也较为简单。

2.Consul 安装

Consul 用 golang实现,因此具有天然的可移植性,安装包仅包含一个可执行文件,方便部署。

下载地址:https://www.consul.io/downloads.html

下载完成后,按照如下命令进行安装

[root@service1 ~]# unzip consul_1.0.0_linux_amd64.zip
[root@service1 ~]# mv consul /usr/bin/

安装完成进行验证

[root@service1 ~]# consul -v
Consul v1.0.0
Protocol 2 spoken by default, understands 2 to 3 (agent will automatically use protocol >2 when speaking to compatible agents)

3.环境介绍

四台服务器

IP地址 主机名 操作系统
server(Leader) 192.168.28.71 Service1 Centos 7.2
server(Follower) 192.168.28.72 Service2 Centos 7.2
agent1 192.168.28.61 Agent1 Centos 7.2
agent2 192.168.28.62 Agent2 Centos 7.2

4.建立集群

要想利用Consul提供的服务实现服务的注册与发现,我们需要建立Consul Cluster。在Consul方案中,每个提供服务的节点上都要部署和运行Consul的agent,所有运行Consul agent节点的集合构成Consul Cluster。Consul agent有两种运行模式:Server和Client。这里的Server和Client只是Consul集群层面的区分,与搭建在Cluster之上 的应用服务无关。以Server模式运行的Consul agent节点用于维护Consul集群的状态,官方建议每个Consul Cluster至少有3个或以上的运行在Server mode的Agent,Client节点不限。

1、启动一个server

[root@service1 ~]# consul agent -server -bootstrap-expect 2 -data-dir /tmp/consul -node=n1 -bind=192.168.28.71 -ui

参数说明:

-server:集群启动为service

-bootstrap-expect:期待加入service节点的数量

-data-dir:数据目录

-node:节点名称,集群中每个节点名称需唯一

-bind:指定一个consul运行时的监听地址

-ui:启动时启动ui

2、启动一个agent

[root@service2 ~]# consul agent -server -bootstrap-expect 2 -data-dir /tmp/consul -node=n2 -bind=192.168.28.72 -ui

3、通过consul members查看当前agent状态,可以看出server1和server2启动后并不知道其他节点的存在。

[root@service1 ~]# consul members
Node  Address             Status  Type    Build  Protocol  DC   Segment
n1    192.168.28.71:8301  alive   server  1.0.0  2         dc1  

4、使用consul join命令触发Cluster bootstrap过程,将192.168.28.72服务器加入当前集群中

[root@service1 ~]# consul members
Node  Address             Status  Type    Build  Protocol  DC   Segment
n1    192.168.28.71:8301  alive   server  1.0.0  2         dc1  
n2    192.168.28.72:8301  alive   server  1.0.0  2         dc1  

5、join后,两台主机互相知道了对方,并进行了leader election过程,server1被选举为leader,server2为follower

[root@service1 ~]# consul info
……
	protocol_version_max = 3
	protocol_version_min = 0
	snapshot_version_max = 1
	snapshot_version_min = 0
	state = Leader
	term = 35
……

server2查看结果

[root@service2 ~]# consul info
……
	protocol_version_max = 3
	protocol_version_min = 0
	snapshot_version_max = 1
	snapshot_version_min = 0
	state = Follower
	term = 2
……

到这里server1和server2就成为了dc1这个数据中心consul cluster的两个节点,而且是用来维护集群状态的server node。Server1被选举为leader,server2是follower。

5.服务注册与发现

我们建立Consul Cluster是为了实现服务的注册和发现。Consul支持两种服务注册的方式,一种是通过Consul的服务注册HTTP API,由服务自身在启动后调用API注册自己,另外一种则是通过在配置文件中定义服务的方式进行注册。Consul文档中建议使用后面一种方式来做服务 配置和服务注册。

5.1.准备工作

服务准备,我已经在agent1和agent2安装了两台web服务器,提供web服务,我现在就把它注册到consul server上。

[root@service1 ~]# curl http://192.168.28.61:10000
service1
[root@service1 ~]# curl http://192.168.28.62:10000
service2
[root@service1 ~]# curl http://192.168.28.61:10000/health
ok
[root@service1 ~]# curl http://192.168.28.62:10000/health
ok

5.2.服务注册

Consul agent在启动时可以通过-config-dir来指定配置文件所在目录,比如以agent1为例,我们可以如此启动agent1:

[root@agent1 ~]# consul agent -data-dir /tmp/consul -node=n3 -bind=192.168.28.61 -config-dir=./conf

这样在./conf下的所有配置文件扩展名为.json的文件都会被consul agent作为配置文件读取

我们在agent1的consul agent的配置文件目录下创建server1.json文件。

{
  "service": {
    "name": "service1",
    "tags": ["master"],
    "address": "192.168.28.61",
    "port": 10000,
    "checks": [
      {
        "http": "http://localhost:10000/health",
        "interval": "10s"
      }
    ]
  }
}

这个配置就是我们在agent1节点上为service1这个服务做的服务定义,定义中包含,name、address、port,还包含一个服务检测的配置,这里我们每隔10秒对服务进行一次健康检查。

上述操作完成之后,我们只需要在service1节点把agent1节点加入集群,agent1就可以自动把服务注册到集群。

我们可以通过集群提供的web页面来查看注册到的服务。(web页面访问端口为8500,需要在server启动时指定ui参数)。

consul-ui-1

我们可以使用同样的方式吧agent2节点加入到集群,加入后ui显示如下:

consul-ui-2

5.3.服务发现

Consul提供了两种发现服务的方式,一种是通过HTTP API查看存在哪些服务;另外一种是通过consul agent内置的DNS服务来做。两者的差别在于后者可以根据服务check的实时状态动态调整available服务节点列表。

在agent1和agent2配置和部署完service1服务后,我们就可以通过DNS命令来查询服务的具体信息了。consul为服务编排的内置域名为 “NAME.service.consul”,这样我们的service1的域名为:service1.service.consul。我们在service1通过dig工具来查看一 下,注意是在service1上,service1上并未定义和部署web3服务,但集群中服务的信息已经被同步到n1上了,信息是一致的。

[root@service1 ~]# dig @127.0.0.1 -p 8600 service1.service.consul SRV

; DiG 9.9.4-RedHat-9.9.4-37.el7 @127.0.0.1 -p 8600 service1.service.consul SRV
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADERHEADER

相关文章

服务器端口转发,带你了解服务器端口转发
服务器开放端口,服务器开放端口的步骤
产品推荐:7月受欢迎AI容器镜像来了,有Qwen系列大模型镜像
如何使用 WinGet 下载 Microsoft Store 应用
百度搜索:蓝易云 – 熟悉ubuntu apt-get命令详解
百度搜索:蓝易云 – 域名解析成功但ping不通解决方案

发布评论