Consul 介绍
Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置。与其他分布式服务注册与发现的方案,Consul 的方案更“一站式”,内置了服务注册与发现框 架、分布一致性协议实现、健康检查、Key/Value 存储、多数据中心方案,不再需要依赖其他工具(比如 ZooKeeper 等)。使用起来也较 为简单。Consul 使用 Go 语言编写,因此具有天然可移植性(支持Linux、windows和Mac OS X);安装包仅包含一个可执行文件,方便部署,与 Docker 等轻量级容器可无缝配合。
Consul 优势
- 使用 Raft 算法来保证一致性, 比复杂的 Paxos 算法更直接. 相比较而言, zookeeper 采用的是 Paxos, 而 etcd 使用的则是 Raft。
- 支持多数据中心,内外网的服务采用不同的端口进行监听。 多数据中心集群可以避免单数据中心的单点故障,而其部署则需要考虑网络延迟, 分片等情况等。 zookeeper 和 etcd 均不提供多数据中心功能的支持。
- 支持健康检查。 etcd 不提供此功能。
- 支持 http 和 dns 协议接口。 zookeeper 的集成较为复杂, etcd 只支持 http 协议。
- 官方提供 web 管理界面, etcd 无此功能。
综合比较, Consul 作为服务注册和配置管理的新星, 比较值得关注和研究。
Consul 特性
- 服务发现
- 健康检查
- Key/Value 存储
- 多数据中心
Consul 角色
- client: 客户端, 无状态, 将 HTTP 和 DNS 接口请求转发给局域网内的服务端集群。
- server: 服务端, 保存配置信息, 高可用集群, 在局域网内与本地客户端通讯, 通过广域网与其他数据中心通讯。 每个数据中心的 server 数量推荐为 3 个或是 5 个。
Consul 安装(Docker)
指定固定网络
创建自定义网络,并指定网段:172.10.0.0/16
并命名为mynetwork
1 | docker network create --subnet=172.10.0.0/16 mynetwork |
查看网络
1 | docker network ls |
创建dockerfile
1 | FROM centos:7.4.1708 |
编译Dockerfile
1 | docker build -t consul:1.5.2 . |
检查编译后的docker镜像
1 | docker images |
使用docker镜像创建容器
1 | docker run -itd --name test2 --network mynetwork -P --ip 172.10.0.2 --rm consul:1.5.2 |
查看结果1
docker ps -a
配置consul集群
这里我们先来配置server。从高可用上,最少要配置3个server。
进入每个容器,执行server启动命令(只有第一个主server需要指定bootstrap-expect参数):1
2
3docker exec -it test2 bash
consul agent -server -ui -node=server2 -bootstrap-expect=4 -bind=172.10.0.2 -data-dir /consul/data -config-dir /consul/config -join=172.10.0.2 -client 0.0.0.0
1 | docker exec -it test3 bash |
1 | docker exec -it test4 bash |
1 | docker exec -it test5 bash |
1 | docker exec -it test6 bash |
查看docker test2的8500端口自动分配的本地对应端口
访问 http://localhost:32769,可以看到consul server已成功启动,并组成了集群。
加入几个client节点
1 | docker run -itd --name test7 --network mynetwork --ip 172.10.0.7 --rm consul:1.5.2 && |
1 | docker exec -it test7 bash |
1 | docker exec -it test8 bash |
1 | docker exec -it test9 bash |
查看node节点
http://localhost:32769/ui/dc1/nodes
Spring Cloud 集成 Consul
新建服务端项目(Spring Cloud)
pom.xml
1 | <?xml version="1.0" encoding="UTF-8"?> |
application.properties
1 | spring.application.name=spring-cloud-consul-test |
启动类 ConsulApplication.java
1 | package com.mindex.consul; |
测试类 ConsulController.java
1 | package com.mindex.consul.controller; |
发布应用
通过不同的端口-Dserver.port
将同一个服务发布到不同的端口上
新建Consumer端项目(Spring Cloud)
pom.xml
1 | <?xml version="1.0" encoding="UTF-8"?> |
application.properties
1 | spring.application.name=spring-cloud-consul-consumer |
服务测试类 ServiceController.java
1 | package com.mindex.consul.consumer.controller; |
检验结果
列出所有服务
http://localhost:8503/services
1 | [ |
调用特定服务
hello consul, IP: 192.168.0.103
查看日志,服务已自动负载均衡。