1.consul是什么?
Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置。 Consul是分布式的、高可用的、可横向扩展的。它具备以下特性 :
service discovery:consul通过DNS或者HTTP接口使服务注册和服务发现变的很容易,一些外部服务,例如saas提供的也可以一样注册。
health checking:健康检测使consul可以快速的告警在集群中的操作。和服务发现的集成,可以防止服务转发到故障的服务上面。
key/value storage:一个用来存储动态配置的系统。提供简单的HTTP接口,可以在任何地方操作。
multi-datacenter:无需复杂的配置,即可支持任意数量的区域。
2.为什么要使用consul服务发现?
因为一套微服务架构中有很多个服务需要管理,也就是说会有很多对grpc。如果一一对应的进行管理会很繁琐所以我们需要有一个管理发现的机制。
服务1~4把当前自己的网络位置注册到服务发现模块,服务发现就以K-V的方式记录下,K一般是服务名,V就是IP:PORT。服务发现模块定时的轮询查看这些服务能不能访问的了(这就是健康检查)。客户端在调用服务1~4的时候,就跑去服务发现模块问下它们的网络位置,然后再调用它们的服务。客户端完全不需要记录这些服务网络位置,客户端和服务端完全解耦!
3.consul的安装
(1)进入consul官网找到自己开发平台对应的安装包下载 https://www.consul.io/downloads.html
或者 wget https://releases.hashicorp.com/consul/1.5.1/consul_1.5.1_linux_amd64.zip
(2)下载完后,解压,得到一个可执行文件consul
(3)将这个文件移动到全局变量环境中
$ sudo mv consul /usr/local/bin/
(4)验证是否安装成功
$ consul
4.consul说明
(1)consul角色
client: 客户端, 无状态, 将 HTTP 和 DNS 接口请求转发给局域网内的服务端集群.
server: 服务端, 保存配置信息, 高可用集群, 在局域网内与本地客户端通讯, 通过广域网与其他数据中心通讯. 每个数据中心的 server 数量推荐为 3 个或是 5 个。
(2)运行 consul代理
consul是典型的 C/S架构,可以运行服务模式或客户模式。每一个数据中心必须有至少一个服务节点, 3到5个服)务节点最好。非 常不建议只运行一个服务节点,因为在节点失效的情况下数据有极大的丢失风险。
(3)运行Agent
完成Consul的安装后,必须运行agent。agent可以运行为server或client模式.每个数据中心至少必须拥有一台server。建议在一 个集群中有3或者5个server。部署单一的server,在出现失败时会不可避免的造成数据丢失。其他的agent运行为client模式。一 个client是一个非常轻量级的进程。用于注册服务,运行健康检查和转发对server的查询。agent必须在集群中的每个主机上运行。
5.启动consul server和client
PS:一共三个节点,两个节点作为服务器,一个作为客户端。三个节点地址分别为:
106.14.125.167 (云1)
129.28.80.79 (云2)
106.12.77.99 (云3)
node1:运行cosnul agent以server模式
首先在node1节点的/etc目录下创建consul.d目录,然后打开终端输入下面的命令:
consul agent -server -ui -bootstrap-expect=2 -data-dir=/tmp/consul -node=n1 -config-dir /etc/consul.d -advertise=106.14.125.167 -bind=0.0.0.0 -client=0.0.0.0
参数说明:
-server : 定义agent运行在server模式
-bootstrap-expect :在一个datacenter中期望提供的server节点数目,当该值提供的时候,consul一直等到达到指定sever数目的时候才会引导整个集群,该标记不能和bootstrap共用
-data-dir:提供一个目录用来存放agent的状态,所有的agent允许都需要该目录,该目录必须是稳定的,系统重启后都继续存在
-node:节点在集群中的名称,在一个集群中必须是唯一的,默认是该节点的主机名
-bind::指明节点的IP地址,一般是0.0.0.0
或者云服务器内网地址,不能写阿里云外网地址
。这是Consul侦听的地址,它必 须可以被集群中的所有其他节点访问。虽然绑定地址不是绝对必要的,但最好提供一个。
-ui: 启动web界面
-config-dir::配置文件目录,里面所有以.json结尾的文件都会被加载
-rejoin:使consul忽略先前的离开,在再次启动后仍旧尝试加入集群中。
-client:consul服务侦听地址,这个地址提供HTTP、DNS、RPC等服务,默认是127.0.0.1所以不对外提供服务,如果你要对外提供服务改成0.0.0.0
node2:运行cosnul agent以server模式
切换到node2机器上,打开终端输入下面的命令:
consul agent -server -ui -bootstrap-expect=2 -data-dir=/tmp/consul -node=n2 -advertise=129.28.80.79 -bind=0.0.0.0 -client=0.0.0.0 -join 106.14.125.167
node3:运行cosnul agent以client模式
切换到node3机器上,首先在/etc目录下创建consul.d目录,然后打开终端输入下面的命令:
consul agent -data-dir=/tmp/consul -node=n3 -advertise=106.12.77.99 -bind=0.0.0.0 -client=0.0.0.0 -join 106.14.125.167
6.在终端中查看集群成员
新开一个终端窗口运行consul members, 你可以看到Consul集群的成员:
7.停止Agent
你可以使用Ctrl-C 优雅的关闭Agent。中断Agent之后你可以看到他离开了集群并关闭。
在退出中,Consul提醒其他集群成员,这个节点离开了.如果你强行杀掉进程.集群的其他成员应该能检测到这个节点失效了。当一个成员离开,他的服务和检测也会从目录中移除。当一个成员失效了,他的健康状况被简单的标记为危险,但是不会从目录中移除。Consul会自动尝试对失效的节点进行重连.允许他从某些网络条件下恢复过来.离开的节点则不会再继续联系。
此外,如果一个agent作为一个服务器,一个优雅的离开是很重要的,可以避免引起潜在的可用性故障影响达成一致性协议。
$ consul leave
8.注册服务
搭建好conusl集群后,用户或者程序就能到consul中去查询或者注册服务。可以通过提供服务定义文件或者调用HTTP API来注册 一个服务。
这里我们将编写服务定义配置文件。假设我们有一个名叫web的服务运行在10000端口。另外,我们将给他设置一个标签。这样我们可以使用他作为额外的查询方式。在node1的/etc/consul.d/目录下创建一个web.json文件,内容如下:
{
"service": {
"name": "web",
"tags": ["master"],
"address": "127.0.0.1",
"port": 10000,
"checks": [
{
"http": "http://localhost:10000/health",
"interval": "10s"
}
]
}
}
9.测试程序
在node1的GOPATH/src目录下创建一个测试文件consulTest.go ,内容如下:
package main
import (
"fmt"
"net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Println("hello Web3! This is n3或者n2")
fmt.Fprintf(w, "Hello Web3! This is n3或者n2")
}
func healthHandler(w http.ResponseWriter, r *http.Request) {
fmt.Println("health check! n3或者n2")
}
func main() {
http.HandleFunc("/", handler)
http.HandleFunc("/health", healthHandler)
http.ListenAndServe(":10000", nil)
}
go run consulTest.go运行该代码后,刷新浏览器页面106.14.125.167:8500,可以发现已经正常启动了,并且没有错误了。
想要学习更多consul内容:http://www.liangxiansen.cn/2017/04/06/consul/