配置环境
curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo apt-key add -
sudo apt-add-repository "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main"
sudo apt-get update && sudo apt-get install consul
#查看是否安装成功
consul
其他环境
安装go
然后通过克隆,再生成两个Linux虚拟机,生成的Linux虚拟机需要更改hostname
$ sudo vi /etc/hostname
#修改完成后,查看三个虚拟机的主机名,确保不一样
$ hostname
另外,虚拟机的ip地址也需要不同。
集群搭建
consul角色
完成Consul的安装,必须运行agent,可以理解为每一个虚拟机都是一个agent,其中agent有两种角色,一是client,二是server。
- client:客户端,是一个非常轻量级的进程,用于注册服务,进行健康检查和将HTTP和DNS接口请求发给局域网内的server服务器。
- server:服务端,保存配置信息,用于处理请求,可以与局域网内的客户端进行通信或者广域网的其他数据中心进行通信,推荐3或者5个。一个数据中心至少要有一个server,但只部署一个会有很大的数据丢失风险。
启动server
第一个server
consul agent -server -bootstrap-expect 2 -data-dir /tmp/consul -node=n1 -bind=192.168.20.128 -ui -config-dir /etc/consul.d -rejoin -join 192.168.20.128 -client 0.0.0.0
- -server 运行在server模式
- -bootstrap-expect 在一个数据中心中,期望提供服务的server的数量,只有server的数量到达这个数量,consul才会引导整个集群。不能和bootstrap共用。
- -data-dir 提供一个目录用于保存agent状态,所有agent都需要该目录,而且系统重启后需要这个目录依然存在。
- -node 节点在集群中的名称,必须唯一,默认主机名。
- -bind 绑定IP地址,用于集群内部通讯,默认0.0.0.0
- -ui 启动web界面
- -config-dir 配置文件目录,json文件会被加载为配置文件。
- rejoin 再次启动仍可加入集群
- -client consul服务监听地址,这个地址提供HTTP、DNS、RPC等服务,默认是127.0.0.1不对外提供服务,如果提供服务换成0.0.0.0,那么可以得出agent既可以当server,也可以当client。
第二个server
consul agent -server -bootstrap-expect 2 -data-dir /tmp/consul -node=n2 -bind=192.168.20.129 -ui -rejoin -join 192.168.20.128
client
consul agent -data-dir /tmp/consul -node=n3 -bind=192.168.20.130 -config-dir /etc/consul.d -rejoin -join 192.168.20.128
注册服务
为consul配置文件创建一个目录,consul会载入配置文件目录里的所有文件,通常.d结尾的目录表示整个路径包含一组配置文件。
mkdir /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"
}
]
}
}
{
"service":{ #服务
"name": "web",
"tags": ["master"],
"address": "127.0.0.1", #ip
"port": 10000, #端口
"checks":[
{
"http": "http://localhost:10000/health",
"interval": "10s" #检查时间,每10s检查一次
}
]
}
}
测试程序hello.go
package main
import (
"fmt"
"net/http"
)
//浏览器输入http://localhost:10000/调用这个方法
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Println("hello web,this is n1 or n2")
fmt.Fprintf(w, "hello web3,this is n1 or n2")
}
//浏览器输入http://localhost:10000/health调用这个方法
//每隔10s会自动调用
func healthHandler(w http.ResponseWriter, r *http.Request) {
fmt.Println("health check n1 or n2")
}
func main(){
//绑定处理函数
http.HandleFunc("/",handler)
http.HandleFunc("/health",healthHandler)
//监听端口10000
http.ListenAndServe(":10000",nil)
}
测试程序在第一个server上运行起来
go run hello.go
成果展示
在浏览器输入localhost:8500/
浏览器输入localhost:10000/
hello.go控制台输出