随着微服务的风潮的来临,服务注册和发现成了微服务架构中不可或缺的一部分。想象一下,你的系统被拆分成了n个独立的服务,相互直接的调用如果还是使用传统的配置文件来解决的话,管理起来可就违背了微服务的初衷。本篇文章注重介绍一下consul 使用。
consul与其他常见的服务发现框架对比
zookeeper是一款基于Java的强大的框架,优点是不只是可以做服务发现,他提供了watcher机制可以实时获取服务提供者的从状态,缺点是没有健康检查,他是复杂度高,通过sdk提供服务
etcd是一款相对轻巧的服务框架,他的优点是简单易用,可配置性强,缺点是没有健康检查,需要配合其他服务完成服务发现。
consul相对两者而言,由于是go编译的,不需要安装依赖,即插即用,同时指出http和dns的方式完成操作接口,而且提供了web页面,缺点是不能实时获取服务信息的变化通知。
consul的几个概念
Gossip 疫情传播算法,他是以生活中的电脑传播的,森林大火等方式进行传播,详细介绍可参考https://www.jianshu.com/p/8279d6fd65bb。consul通过Gossip来保证分布式的最终一致性。
Server和Client,其实都是consul运行的实例,区别是Server维护consul状态信息,负责持久化数据,Client只维护自身的状态, 并将 HTTP 和 DNS 接口请求转发给服务端。Server建议配置3或5个,当Server leader挂掉的时候,会有选举算法推举出新的leader。Client可以根据需求进行无限扩展。
consul实战
1,安装docker,未安装可参考https://blog.csdn.net/JiuJieGuDuKe/article/details/100581909
2,docker启动Server和Client
docker pull consul 拉取镜像
#启动第1个Server节点,集群要求要有3个Server,将容器8500端口映射到主机8900端口,同时开启管理界面
docker run -d --name=consul1 -p 8900:8500 -e CONSUL_BIND_INTERFACE=eth0 consul agent --server=true --bootstrap-expect=3 --client=0.0.0.0 -ui
#启动第2个Server节点,并加入集群
docker run -d --name=consul2 -e CONSUL_BIND_INTERFACE=eth0 consul agent --server=true --client=0.0.0.0 --join 172.17.0.2
#启动第3个Server节点,并加入集群
docker run -d --name=consul3 -e CONSUL_BIND_INTERFACE=eth0 consul agent --server=true --client=0.0.0.0 --join 172.17.0.2
#启动第4个Client节点,并加入集群
docker run -d --name=consul4 -e CONSUL_BIND_INTERFACE=eth0 consul agent --server=false --client=0.0.0.0 --join 172.17.0.2
3,测试注册服务
使用postman或者curl等工具发送注册服务请求
http://ip:8900/v1/health/service/mysql1
put请求数据
{
"ID": "mysql1",
"Name": "mysql1",
"Tags": [
"primary",
"v1"
],
"Address": "ip",
"Port": 3306,
"Meta": {
"redis_version": "4.0"
},
"EnableTagOverride": false,
"Check": {
"id": "mysql1",
"name": "mysql1",
"tcp": "ip:3306",
"interval": "10s",
"timeout": "1s"
},
"Weights": {
"Passing": 10,
"Warning": 1
}
}
查看服务状态http://ip.144:8900/v1/health/service/mysql1
4 web ui页面
打开 http://ip:8900/ui/dc1/services 可以查看相关服务的状态
5 consul template
consul官方提供了模板工具,可以通过标签的方式来获取服务状态,详情参考https://github.com/hashicorp/consul-template