一、Consul介绍
1.1 Consul是什么?
Consul是HashiCorp公司推出的开源工具,是使用Go语言实现的分布式系统的服务发现与配置管理中心服务。它具有以下优点:
- 基于raft协议,语法简洁;
- 支持健康检查和HTTP、DNS等协议;
- 支持跨数据中心的集群;
- 跨平台支持
1.2 什么是服务发现
比如说有两个服务,一个a服务,另外一个b服务。假如a服务要调用服务b,那么b服务先会在注册中心进行注册。注册中心维护了一个服务列表,所有注册过服务的名称和地址都会保存在该服务列表中。所以,当a服务要嗲用b服务的时候,首先a服务会从注册中心根据服务名称查询b服务的地址,然后再根据地址调用b服务。在实际开发中,Consul就是作为这个服务的注册中心被使用。除了维护所有注册服务的地址以外,注册中心还维护了注册服务的状态。它会定时检查所有服务的状态,如果服务已经关闭,那么它就会把服务从服务列表中删除掉。
1.3 Consul的组成
在Consul集群架构中,主要包含了Client、Server、Server-Leader、Data Center几部分,如下图所示:

- Client:客户端模式。在这种模式下,所有注册到当前节点的服务会被转发到Server,该节点本身不会保存这些信息。
- Server:服务端模式。与Client模式的功能相似,但是在该模式下,如果节点发生故障,它会把所有信息保存在本地,防止节点数据的丢失。
- Server-Leader:服务的领导者。与Server不一样的是,它需要负责同步注册信息给其他Server,同时也要负责对各个节点的健康进行检测。
- Data Center:每一个数据中心都是有Client和Server组成。一般建议一个数据中心应该包含3~5个Server。但对于Client没有该限制。
1.4 Consul的下载和安装
官方下载地址:https://releases.hashicorp.com/consul/
我们可以执行命令下载最新的压缩包。例如:
$ wget https://releases.hashicorp.com/consul/1.5.1/consul_1.5.1_linux_amd64.zip
下载完成后,执行命令直接解压缩。
$ unzip consul_1.5.1_linux_amd64.zip
最后,把解压缩后的可执行文件移动到/usr/local/bin目录下。
$ mv ./consul /usr/local/bin
二、搭建Consul集群
Consul是典型的C/S结构,每一个数据中心都包含客户端和服务端。但是要求每个数据中心都包含至少一个服务节点,建议3~5个服务节点,以防数据发生丢失的情况。
(1)环境准备
我们在vmware上准备三台服务器,每一台服务器运行一个服务节点或客户端节点。然后配置每一台服务器的网络,例如:
sudo vim /etc/network/interfaces
修改为每一台机器分配一个IP地址,例如:
node1:192.168.31.20
node2:192.168.31.101
node3:192.168.31.156
分配完成后重启网络。
$ sudo /etc/init.d/networking restart
最后,每一台服务测试一下网络,保证三台服务器的网络可以互相连接。
(2)启动Consul Server
完成consul安装后,必须运行agent。agent可以使用server或client的方式运行,但是至少要有一个服务端的agent,其他agent可运行为client模式。一个client是一个非常轻量级的进程,它必须运行在集群中的每一台主机上。它负责服务注册、运行健康检查、转发对server的查询等等。
# 命令格式:
consul agent [-server] [-bootstrap-expect 节点数量] [-data-dir 目录名] [-node=节点名] [-bind=节点IP] [-ui] [-config-dir 配置文件目录] [-rejoin] [-join 节点IP] [-client 服务地址]
参数说明:
- -server:指定agent的运行模式为server模式;
- -bootstrap-expect:指定数据中心期望提供的server节点数量。如果指定该参数,那么只有当节点达到了该数量的时候,consul才会引导整个集群;
- -data-dir:提供一个目录,用于存放agent的状态信息;
- -node:节点名称,在整个集群中是唯一的,用于标识一个节点。默认名称为该节点的主机名;
- -bind:绑定宿主机的IP地址,用于集群内部通信的IP地址,默认为0.0.0.0;
- -ui:如果指定该参数,就会启动一个ui界面;
- -config-dir:保存consul配置文件的目录;
- -rejoin:如果指定该参数,那么consul重启后会自动重新加入集群中;
- -join:启动时候加入集群的地址;
- -client:consul监听服务地址,该地址提供了HTTP、DNS、RPC等服务,默认为127.0.0.1。如果要对外提供服务,需要修改为0.0.0.0;
例如:
# 在机器192.168.31.20创建node1节点
$ sudo mkdir /etc/consul.d
$ consul agent -server -bootstrap-expect 2 -data-dir /tmp/consul -node=n1 -bind=192.168.31.20 -ui -config-dir /etc/consul.d -rejoin -join 192.168.31.20 -client 0.0.0.0
# 在机器192.168.31.101创建node2节点
$ sudo mkdir /etc/consul.d
$ consul agent -server -bootstrap-expect 2 -data-dir /tmp/consul -node=n2 -bind=192.168.31.101 -config-dir=/etc/consul.d -rejoin -join 192.168.31.20
上面node2节点没有指定-ui和-client参数,因此无法通过该节点地址查询所有服务,只能通过node1节点查询。
(3)启动Consul Client
运行Client的命令格式与Consul Server相似,命令如下:
# 在机器192.168.31.156创建node3节点
$ sudo mkdir /etc/consul.d
$ consul agent -data-dir /tmp/consul -node=n3 -bind=192.168.31.156 -config-dir /etc/consul.d -rejoin -join 192.168.31.20
运行client无需指定-server、-bootstrap-expect、-ui、-client参数。-join指定要加入到集群的地址。
(4)查看集群成员
启动完成后,可以执行consul members命令查看到Consul集群中的所有成员信息。

我们也可以使用web方式查看。在浏览器上输入“http://192.168.31.20:8500”回车,效果如下所示:

三、注册服务
搭建好集群后,我们可以在集群中的任意一个节点上注册服务。
注册服务有两种方式:定义服务文件或者是调用Consul提供的API注册服务。下面主要介绍定义服务文件方式注册服务。
3.1 定义服务文件
第一步:在/etc/consul.d目录下新建一个json文件,文件名可以自行定义。
$ cd /etc/consul.d
$ vim web.json
第二步:编辑文件,配置服务信息。
{
"service": {
"name": "web",
"tags": ["zhong"],
"address": "127.0.0.1",
"port": 10000,
"checks": [
{
"http": "http://localhost:10000/test",
"interval": "10s"
}
]
}
}
上面代码定义了一个名为web的服务。服务地址是127.0.0.1:10000,也就是说,该服务是部署到本地机器上。
第三步:定义服务。在$GOPATH/src目录下新建test.go文件。
package main
import (
"fmt"
"net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Println("hello handler....")
}
func testHandler(w http.ResponseWriter, r *http.Request) {
fmt.Println("hello testHandler....")
}
func main() {
http.HandleFunc("/", handler)
http.HandleFunc("/test", testHandler)
http.ListenAndServe(":10000", nil)
}
第四步:启动服务。
$ go run test.go
第五步:重启运行Consul Agent。运行成功后可以在web上查看注册的服务。


2万+

被折叠的 条评论
为什么被折叠?



