**
1,consul简介
Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置。 Consul是分布式的、高可用的、可横向扩展的。它具备以下特性 :
1,service discovery:consul通过DNS或者HTTP接口使服务注册和服务发现变的很容易,一些外部服务,例如saas提供的也可以一样注册。
2,health checking:健康检测使consul可以快速的告警在集群中的操作。和服务发现的集成,可以防止服务转发到故障的服务上面。
3,key/value storage:一个用来存储动态配置的系统。提供简单的HTTP接口,可以在任何地方操作。
4,multi-datacenter:无需复杂的配置,即可支持任意数量的区域。
-总结consul特性:
通过DNS或者HTTP应用程序能找到它所依赖的服务,方便进行服务注册
使用Key/Value方式进行数据存储
支持开箱即用的多数据中心。用户不需要建立额外的抽象层来扩展业务
对服务进行定时健康检查,判断依据为响应码是否为200
3,consul安装
官网:https://www.consul.io/
下载地址:https://releases.hashicorp.com/consul/1.10.1/consul_1.10.1_linux_amd64.zip
cd /usr/local/src
wget https://releases.hashicorp.com/consul/1.10.1/consul_1.10.1_linux_amd64.zip
unzip consul_1.10.1_linux_amd64.zip
mv consul /usr/local/bin/
准备三台机器,安装好consul
服务器 | 版本 |
---|---|
192.168.1.244 | CentOS Linux release 7.6.1810 (Core) |
192.168.1.245 | CentOS Linux release 7.6.1810 (Core) |
192.168.1.246 | CentOS Linux release 7.6.1810 (Core) |
245和246作为server,244作为client
client: 客户端, 无状态, 将 HTTP 和 DNS 接口请求转发给局域网内的服务端集群.
server: 服务端, 保存配置信息, 高可用集群, 在局域网内与本地客户端通讯, 通过广域网与其他数据 中心通讯. 每个数据中心的 server 数量推荐为 3 个或是 5 个。
(这里因为是测试搭建,所以只用了两台server)
consul是典型的 C/S架构,可以运行服务模式或客户模式。每一个数据中心必须有至少一个服务节点, 3到5个服)务节点最好。非 常不建议只运行一个服务节点,因为在节点失效的情况下数据有极大的丢失风险。
245:
consul agent -server -ui -bootstrap-expect=2 -data-dir=/data/consul -node=s1 -config-dir /etc/consul.d -advertise=192.168.1.245 -bind=0.0.0.0 -client=0.0.0.0
后台启动:
consul agent -server -ui -bootstrap-expect=2 -data-dir=/data/consul -node=s1 -config-dir /etc/consul.d -advertise=192.168.1.245 -bind=0.0.0.0 -client=0.0.0.0 >> /var/log/consul/consul.log 2>&1
246:
consul agent -server -ui -bootstrap-expect=2 -data-dir=/data/consul -node=n2 -advertise=192.168.1.246 -bind=0.0.0.0 -client=0.0.0.0 -join 192.168.1.245
后台启动:
consul agent -server -ui -bootstrap-expect=2 -data-dir=/data/consul -node=n2 -advertise=192.168.1.246 -bind=0.0.0.0 -client=0.0.0.0 -join 192.168.1.245 >> /var/log/consul/consul.log 2>&1
参数说明:
-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
-join:需要加入的其它节点地址,可以多次使用,加入多个节点。
244:
consul agent -data-dir=/data/consul -node=c3 -advertise=192.168.1.244 -bind=0.0.0.0 -client=0.0.0.0 -join 192.168.1.245
consul agent -data-dir=/data/consul -node=c3 -advertise=192.168.1.244 -bind=0.0.0.0 -client=0.0.0.0 -join 192.168.1.245 >> /var/log/consul/consul.log 2>&1
consul members
优雅的关闭结点:
consul leave
WEB界面:
python注册:
#!/usr/bin/python3
# -*- coding:utf-8 -*-
import consul
class Consul(object):
def __init__(self, host, port):
'''初始化,连接consul服务器'''
self._consul = consul.Consul(host, port)
def RegisterService(self, name, server_id, host, port, tags=None):
tags = tags or []
self._consul.agent.service.register(
name,
server_id,
host,
port,
tags,
# 健康检查ip端口,检查时间:5,超时时间:30,注销时间:30s
check=consul.Check().tcp(host, port, "5s", "30s", "30s"))
def GetService(self, name):
services = self._consul.agent.services()
service = services.get(name)
if not service:
return None, None
addr = "{0}:{1}".format(service['Address'], service['Port'])
return service, addr
if __name__ == '__main__':
host="192.168.1.245" #consul服务器的ip
port="8500" #consul服务器对外的端口
consul_client=Consul(host,port)
name="test1"
host="192.168.1.188"
port=8088
server_id = 'test1'
consul_client.RegisterService(name,server_id,host,port,tags=['tags1'])
# 当有负载均衡时,保持name不变,多次执行RegisterService函数即可
# name1="test2"
# host="192.168.1.199"
# port=8080
# server_id = 'test2'
# consul_client.RegisterService(name,server_id,host,port,tags=['test2'])
check = consul.Check().tcp(host, port, "5s", "30s", "30s")
print(check)
result=consul_client.GetService("test-concul")
print(result)