consul和consul template初步体验

一、consul概述

consul是 HashiCorp 公司推出的开源的一个使用go语言开发的服务发现、配置管理中心服务。内置了服务注册与发现框架、分布一致性协议实现、健康检查、Key/Value存储、多数据中心方案,不再需要依赖其他工具(比如ZooKeeper等)。服务部署简单,只有一个可运行的二进制的包。每个节点都需要运行agent,他有两种运行模式server和client。每个数据中心官方建议需要3或5个server节点以保证数据安全,同时保证server-leader的选举能够正确的进行。

@client

CLIENT表示consul的client模式,就是客户端模式。是consul节点的一种模式,这种模式下,所有注册到当前节点的服务会被转发到SERVER,本身是不持久化这些信息。

@server

SERVER表示consul的server模式,表明这个consul是个server,这种模式下,功能和CLIENT都一样,唯一不同的是,它会把所有的信息持久化的本地,这样遇到故障,信息是可以被保留的。

@server-leader

中间那个SERVER下面有LEADER的字眼,表明这个SERVER是它们的老大,它和其它SERVER不一样的一点是,它需要负责同步注册的信息给其它的SERVER,同时也要负责各个节点的健康监测。

@raft

server节点之间的数据一致性保证,一致性协议使用的是raft,而zookeeper用的paxos。

@服务发现协议

consul采用http和dns协议,etcd只支持http

@服务注册

consul支持两种方式实现服务注册,一种是通过consul的服务注册http API,由服务自己调用API实现注册,另一种方式是通过json个是的配置文件实现注册,将需要注册的服务以json格式的配置文件给出。consul官方建议使用第二种方式。

@服务发现

consul支持两种方式实现服务发现,一种是通过http API来查询有哪些服务,另外一种是通过consul agent 自带的DNS(8600端口),域名是以NAME.service.consul的形式给出,NAME即在定义的服务配置文件中,服务的名称。DNS方式可以通过check的方式检查服务。

@服务间的通信协议

Consul使用gossip协议管理成员关系、广播消息到整个集群,他有两个gossip pool(LAN pool和WAN pool),LAN pool是同一个数据中心内部通信的,WAN pool是多个数据中心通信的,LAN pool有多个,WAN pool只有一个。
二、consul集群搭建

1)安装
首先去官网现在合适的consul包:https://www.consul.io/downloads.html
安装直接下载zip包,解压后只有一个可执行的文件consul

2)启动
consul必须启动agent才能使用,有两种启动模式server和client,还有一个官方自带的ui。server用与持久化服务信息,集群官方建议3或5个节点。client只用与于server交互。ui可以查看集群情况的。

server启动方式:

cn1:

./consul agent  -bootstrap-expect 1  -server   -data-dir /data/servers/consul/data/consul0 -node=cn1 -bind=10.127.26.98 -config-dir /data/servers/consul/etc/consul.d -enable-script-checks=true  -datacenter=dc1

cn2:
./consul agent   -server   -data-dir /data/servers/consul/data/consul0 -node=cn1 -bind=10.127.26.99 -config-dir /data/servers/consul/etc/consul.d -enable-script-checks=true  -datacenter=dc1 -join 10.127.26.98

参数解释:
-bootstrap-expect:集群期望的节点数,只有节点数量达到这个值才会选举leader。
-server: 运行在server模式
-data-dir:指定数据目录,其他的节点对于这个目录必须有读的权限
-node:指定节点的名称
-bind:为该节点绑定一个地址
-config-dir:指定配置文件,定义服务的,默认所有一.json结尾的文件都会读
-enable-script-checks=true:设置检查服务为可用
-datacenter: 数据中心没名称,
-join:加入到已有的集群中

client:

#consul agent   -data-dir /data/consul0 -node=cn4 -bind=192.168.1.199 -config-dir /etc/consul.d -enable-script-checks=true  -datacenter=dc1  -join 192.168.1.202

client节点可以有多个,自己根据服务指定即可。

ui:

#consul agent  -ui  -data-dir /data/consul0 -node=cn4 -bind=192.168.1.198  -client 192.168.1.198   -config-dir /etc/consul.d -enable-script-checks=true  -datacenter=dc1  -join 192.168.1.202

-ui:使用自带的ui,
-ui-dir:指定ui的目录,使用自己定义的ui
-client:指定web ui、的监听地址,默认127.0.0.1只能本机访问。

集群创建完成后:
使用一些常用的命令检查集群的状态:

#consul  info

可以在raft:stat看到此节点的状态是Fllower或者leader

#consul members

3)服务注册
采用的是配置文件的方式,首先在etc下创建一个目录consul.d,用于存放定义服务的配置文件web.json,把192.168.123.121:14001注册到login服务中。

{
	"service": 
	{
		"name": "login",
		"tags": ["rails"], 
		"address": "192.168.123.121",
		"port": 14001
	}
}

或者用http api的方式注册:

curl http://localhost:8500/v1/agent/service/register -X PUT -i -H "Content-Type:application/json" -d '{
  "ID": "login",
  "Name": "login",
  "Tags": ["v1"],
  "Address": "192.168.10.101",
  "Port": 14020,
  "Check": {
    "DeregisterCriticalServiceAfter": "90m",
    "TCP": "localhost:6379",
    "Interval": "10s"
  }
}'

查询服务名为login的信息:

curl 'http://localhost:8500/v1/health/service/login?passing'

4)健康检查
check使用来做服务的健康检查的,可以拥有多个,也可以不使用支持多种方式检查。check可以是script、http、tcp、TTL等类型的,如果是script类型则script和interval变量必须被提供,如果是TTL类型则ttl变量必须被提供。script是consul主动去检查服务的健康状况,ttl是服务主动向consul报告自己的状况。
三. consul-template介绍

Consul-template是Consul的一个方扩展工具,通过监听Consul中的数据可以动态修改一些配置文件,大家比较热衷于应用在Nginx,HAProxy上动态配置健康状态下的客户端反向代理信息。
consul-template文档:
github:https://github.com/hashicorp/consul-template
consul-template安装:
只需要下载可执行文件:https://releases.hashicorp.com/consul-template/

示例:
1)准备consul-template的配置文件tmpl.json,放在当前目录:

consul = "127.0.0.1:8500"
 
template {
source = "./config.ctmpl"
destination = "./config.py"
command = "python ./config.py"
}

含义是:
需要连接的consul是:“127.0.0.1:8500”
配置文件模板是:"./config.ctmpl"
需要生成的配置文件是:"./config.py"
生成新的配置文件后,执行命令:“python ./config.py”

2)准备配置文件模板config.ctmpl,放在当前目录:

#!/usr/bin/python
#coding:utf-8
 
#login
iplist = [ {{range service "login|passing"}} "{{.Address}}:{{.Port}}", {{end}} ]
 
for ip in iplist:
    print ip

含义是:从consul拿到服务"login"的ip,并打印出来

3)准备工作完毕,开始执行consul-template:

./consul-template -config ./tmpl.json -once

4)生成了config.py,执行config.py就可以打印出服务名为login的ip列表。

参考文档:
https://www.cnblogs.com/cuishuai/p/8194345.html
https://blog.csdn.net/daiyudong2020/article/details/53559008

你可能感兴趣的:(架构设计)