分布式系统的三个指标
- Consistency
- Availability
- Partition tolerance
它们的第一个字母分别是 C、A、P。
由于当前的网络硬件肯定会出现延迟丢包等问题,所以分区容错性是我们必须需要实现的
一致性和可用性,不可能同时成立。这个结论就叫做 CAP 定理。
服务发现框架的比较
Feature | Consul | zookeeper | etcd | euerka |
服务健康检查 | 服务状态,内存,硬盘等 | (弱)长连接,keepalive | 连接心跳 | 可配支持 |
多数据中心 | 支持 | — | — | — |
kv存储服务 | 支持 | 支持 | 支持 | — |
一致性 | raft | paxos | raft | — |
cap | cp | cp | cp | ap |
使用接口(多语言能力) | 支持http和dns | 客户端 | http/grpc | http(sidecar) |
watch支持 | 全量/支持long polling | 支持 | 支持 long polling | 支持 long polling/大部分增量 |
自身监控 | metrics | — | metrics | metrics |
安全 | acl /https | acl | https支持(弱) | — |
Consul和Eureka最大的区别:Eureka保证AP, Consul为CP。
Consul强一致性(C)带来的是:
服务注册相比Eureka会稍慢一些。因为Consul的raft协议要求必须过半数的节点都写入成功才认为注册成功
Leader挂掉时,重新选举期间整个consul不可用。保证了强一致性但牺牲了可用性。
Eureka保证高可用(A)和最终一致性:
服务注册相对要快,因为不需要等注册信息replicate到其他节点,也不保证注册信息是否replicate成功
当数据出现不一致时,虽然A, B上的注册信息不完全相同,但每个Eureka节点依然能够正常对外提供服务,这会出现查询服务信息时如果请求A查不到,但请求B就能查到。如此保证了可用性但牺牲了一致性。
Eureka就是个servlet程序,跑在servlet容器中; Consul则是go编写而成
为什么要选择Consul
与其他分布式服务注册与发现的方案,Consul的方案更"一站式",内置了服务注册与发现框 架、分布一致性协议实现、健康检查、Key/Value存储、多数据中心方案。ZK拥有的功能它几乎都支持,但是健康检查和服务安全性方面优于ZK。使用起来也较 为简单。Consul用Golang实现,因此具有天然可移植性(支持Linux、windows和Mac OS X);安装包仅包含一个可执行文件,方便部署,与Docker等轻量级容器可无缝配合。
什么是多数据中心
这里存在两个数据中心:DATACENTER1、DATACENTER2。每个数据中心有着 3 到 5 台 server(该数量使得在故障转移和性能之间达到平衡)。
一个数据中心的网络连接问题或故障不影响其他数据中心的可用性。每个数据中心都是独立运行,并且拥有私有的LAN gossip pool。
数据中心中包含客户节点和服务节点,通常建议三到五个服务节点。因为随着节点的增加,服务同步会变得相对更慢,同时考虑到服务失败和性能要求等方面因素。但是对于客户节点数量,则没有限制。利用Gossip协议用来向集群广播消息,节点之间利用Raft协议选举领导者,领导者负责处理所有的查询和事务请求。
Spring Cloud Consul特性
Spring Cloud Consul项目是针对Consul的服务治理实现。Consul是一个分布式高可用的系统,它包含多个组件,但是作为一个整体,在微服务架构中为我们的基础设施提供服务发现和服务配置的工具。它包含了下面几个特性:
- 服务发现
- 健康检查
- Key/Value存储
- 多数据中
Consul引入
由于Spring Cloud Consul项目的实现,我们可以轻松的将基于Spring Boot的微服务应用注册到Consul上,并通过此实现微服务架构中的服务治理。
以之前实现的基于Eureka的示例(eureka-client)为基础,我们如何将之前实现的服务提供者注册到Consul上呢?方法非常简单,我们只需要在pom.xml
中将eureka的依赖修改为如下依赖:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-discovery</artifactId> </dependency>
接下来再修改一下application.properites
,将consul需要的配置信息加入即可,比如:(下面配置是默认值)
spring.cloud.consul.host=localhost spring.cloud.consul.port=85001. spring.cloud.consul.host=localhost 2. spring.cloud.consul.port=8500
到此为止,我们将eureka-client转换为基于consul服务治理的服务提供者就完成了
Consul 角色
- client: 客户端, 无状态, 将 HTTP 和 DNS 接口请求转发给局域网内的服务端集群。
- server: 服务端, 保存配置信息, 高可用集群, 在局域网内与本地客户端通讯, 通过广域网与其它数据中心通讯。 每个数据中心的 server 数量推荐为 3 个或是 5 个。
Consul常用指令
Consul 工作原理
- 1、当 Producer 启动的时候,会向 Consul 发送一个 post 请求,告诉 Consul 自己的 IP 和 Port
- 2、Consul 接收到 Producer 的注册后,每隔10s(默认)会向 Producer 发送一个健康检查的请求,检验Producer是否健康
- 3、当 Consumer 发送 GET 方式请求 /api/address 到 Producer 时,会先从 Consul 中拿到一个存储服务 IP 和 Port 的临时表,从表中拿到 Producer 的 IP 和 Port 后再发送 GET 方式请求 /api/address
- 4、该临时表每隔10s会更新,只包含有通过了健康检查的 Producer
Consul的key/value数据持久化
dev模式下不会持久化数据
cmd启动:
consul agent -config-file=config.json
{ "bind_addr": "127.0.0.1", "server": true, "bootstrap_expect": 1, "client_addr": "0.0.0.0", "data_dir": "D:\\tool\\consul_1.4.4_windows_amd64\\data", "log_level": "info", "ui": true, "rejoin_after_leave": true } |
Consul注册向windows注册服务
1、向path里添加D:\tool\consul_1.4.4_windows_amd64
2、以管理员身份启动命令提示符,执行
3、sc.exe create "Consul" binPath="consul agent -config-file=D:\\tool\\consul_1.4.4_windows_amd64\\config.json"
4、“运行“输入services.msc进入系统服务,将Consul服务设置为自动启动
windows删除Consul服务
通过管理员权限运行CMD,输入如下命令
1、Net Stop consul
2、sc delete consul
参考文章:
http://blog.didispace.com/spring-cloud-starter-dalston-1/