本篇重点介绍 Consul 是什么,它可以解决什么问题,它与现有软件的比较,以及如何开始使用它。
目录
- 1、常见的注册中心
- 2、Consul 介绍
- 3、Consul 特性
- 4、Consul的基本架构
- 5、Consul单节点安装与启动
- 6、Consul启动命令详解
- 7、了解Consul启动输出
- 8、三个注册中心异同点
- 9、SpringCloud使用Consul作为服务注册发现中心
- 10、SpringCloud使用Consul作为配置中心
1、常见的注册中心
现在比较流行的也就是Consul和Nacos,这两个注册中心我做的项目当中都涉及到了,Zookeeper没有管理界面,一般不建议使用,而Eureka已经处于停更,并且本身就存在很多bug,一般不建议使用!
2、Consul 介绍
Consul 是HashiCorp
公司推出的开源工具,用于实现分布式系统的服务发现与配置。与其它分布式服务注册与发现的方案相比,Consul的方案更“一站式”,内置了服务注册与发现框架、分布一致性协议实现、健康检查、Key/Value存储、多数据中心方案,不再需要依赖其它工具(比如ZooKeeper等) ,使用起来也较为简单。
Consul 使用Go语言编写,因此具有天然可移植性(支持Linux,Windows和Mac OS);安装包仅包含一个可执行文件,方便部署,与Docker等轻量级容器可无缝配合。
Consul 官网:https://www.consul.io/ Consul 官网介绍:https://www.consul.io/docs Consul 中文教程:https://www.springcloud.cc/spring-cloud-consul.html SpringCloud官网介绍Consul:https://docs.spring.io/spring-cloud-consul/docs/current/reference/html/#spring-cloud-consul-discovery
3、Consul 特性
- 服务发现:Consul 的客户端可以注册服务,其他客户端可以使用 Consul 发现给定服务的提供者。使用DNS 或 HTTP,
应用程序可以轻松找到它们所依赖的服务
。 - 健康检查:Consul客户端可以提供任意数量的健康检查,可以与给定的服务关联(“web服务器是否返回200 OK”),也可以与本地节点关联(“内存利用率是否低于90%”)。操作人员可以使用此信息监视集群运行状况,
服务发现组件也可以使用此信息将通信流量路由到远离不健康主机的地方
,支持多种方式,HTTP, TCP、 Docker, Shell脚本定制化监控。
KV 存储:应用程序可以使用Consul的分级 key/value 存储来实现各种目的,包括动态配置、特性标记、协调、leader选举
等等。简单的HTTP API使其易于使用。 - 安全服务通信:Consul可以生成和分发服务的TLS证书,以建立相互的TLS连接。
可以使用意图来定义允许哪些服务进行通信
。可以很容易地管理服务细分,目的可以实时更改,而不是使用复杂的网络拓扑和静态防火墙规则。 - 多数据中心:Consul 支持开箱即用的多个数据中心。这意味着 Consul 的用户不必担心构建额外的抽象层以扩展到多个区域。
- Raft 算法:使用Raft算法完成一致性,Raft将一致性问题分解成了三个独立的部分:leader选举、日志复制、安全性。
- 自带web管理界面:这一点相比于zookeeper注册中心要好一点,zookeeper是没有自带管理界面的。通过管理界面可以清晰的看到注册了多少个服务,以及在管理界面还可以使用服务配置功能。
4、Consul的基本架构
这个架构图是官网给出的,其实在不了解consul的时候看到这个图是很蒙圈的。
让我们分解这张图片并描述每一块。首先,我们可以看到有两个数据中心,分别标记为“一”和“二”。Consul 对多个数据中心提供一流的支持,并希望这是常见的情况(这里的数据中心我认为就是Consul集群)。
Consul Cluster
(集群)有Server
和Client
两种角色。不管是Server还是Client,统称为Agent(代理)。
-
Consul Client
是相对无状态的,只负责转发RPC到Server资源开销很少。 -
Server
是一个有一组扩展功能的代理,这些功能包括参与Raft选举、维护集群状态、响应RPC查询、与其他数据中心交互WAN Gossip和转发查询给leader或者远程数据中心。
每个数据中心,Client和Server是混合的
。一股建议有3~5台Server,这是基于有故障情况下的可用性和性能之间的权衡结果,因为越多的机器加入达成共识越慢(server越多追求一致性的时候 必定会消耗一定的时间来进行同步数据,同步数据的过程就会导致服务短时间内不能访问),Server之间会选举出一个Leader
,然而并不限制Client的数量,一般建议一个服务对应一个Client,它们可以很容易的扩展到数千或者数万台。在开发时我们绑定一组服务注册中心中的客户端即可。
为什么集群要搭建奇数?
zookeeper的集群同样会面临这个问题,集群一般都是只要坏掉一半服务整个集群就不可用,3和4都是坏掉两台就不可用 所以一般会选三台。
5、Consul单节点安装与启动
Consul 官网下载地址:https://www.consul.io/downloads
Consul在windows下和linux下是都可以安装的,并且基本上不用配置就能使用!
在windows下的话下载好后就是一个可执行的exe,我们可以通过命令启动来控制consul的一些启动参数配置等。
cd到对应的目录下,使用cmd启动Consul
#-dev表示开发模式运行,另外还有-server表示服务模式运行
consul agent -dev -client=0.0.0.0
为了方便启动,也可以在consul.exe同级目录下创建一个脚本来启动,脚本内容如下:
consul agent -dev -client=0.0.0.0
pause
访问管理后台: http://localhost:8500/看到下图意味着我们的Consul服务启动成功了。
通过如下方式可以查看版本号:
6、Consul启动命令详解
关于启动命令官网介绍:https://www.consul.io/docs/agent/config/cli-flags
- -dev:开发模式,去掉所有持久化选项,内存服务器模式。
- -server:此标志用于控制代理是处于服务器模式还是客户端模式。提供后,代理将充当 Consul 服务器。每个 Consul 集群必须至少有一台服务器,理想情况下每个数据中心不超过 5 台。
- -bind:内部集群通信应该绑定的地址。这是集群中所有其他节点都应该可以访问的 IP 地址。默认情况下,这是“0.0.0.0”,这意味着 Consul 将绑定到本地机器上的所有地址,并将私有 IPv4 地址通告 给集群的其余部分。如果有多个私有 IPv4 地址可用,Consul 将在启动时退出并出现错误。
- -client:Consul 将绑定客户端接口的地址,包括 HTTP 和 DNS 服务器。默认情况下,这是“127.0.0.1”,只允许环回连接,0.0.0.0表示不限客户端ip。
- -ui-:开启web界面访问
- -bootstrap-expect :此标志提供数据中心中预期的服务器数量为3。可以不设置,如果要设置该值必须与集群中的其他服务器一致。设置之后,Consul 会等待指定数量的服务器可用,然后引导集群。此标志需要-server模式。
-bootstrap-expect=3
表示server 集群最低节点数为3,低于这个值将工作不正常 - -data-dir:该标志为代理提供了一个数据目录来存储状态。这对所有代理都是必需的(该目录必须存在,需提前创建好)。
- -node:集群中此节点的名称。这在集群中必须是唯一的。默认情况下,这是机器的主机名。
- -log-file-:日志文件所在位置 需要提前创建好目录。例如,设置log-file为/var/log/将导致日志文件路径为/var/log/consul-{timestamp}.log. log-file可以与
-log-rotate-duration
结合使用 以获得细粒度的日志轮换体验。 - -log-rotate-duration:指定日志在需要轮换之前应写入的最长持续时间。必须是持续时间值,例如 30 秒。默认为 24 小时。
- -datacenter-:此标志控制运行代理的数据中心。如果未提供,则默认为“dc1”。
上面命令除了在cmd使用,还可以将配置写到文件当中,然后通过启动命令引入别的配置文件:
您可以指定许多选项来配置 Consul 在发出consul agent命令时的操作方式。您还可以创建一个或多个配置文件,并在启动时使用-config-file
or -config-dir
选项将它们提供给 Consul。配置文件必须以 JSON 或 HCL 格式编写。
以下示例启动一个 Consul 代理,该代理从server.json位于当前工作目录中的一个名为的文件中获取配置设置:
consul agent -config-file=server.json
json文件配置的案例:https://www.consul.io/docs/agent/config/config-files
7、了解Consul启动输出
- Node name:
这是代理的唯一名称
。默认情况下,这是机器的主机名,但您可以使用-node
标志自定义它。 - Datacenter:
这是配置代理运行的数据中心
。对于单 DC 配置,代理将默认为dc1,但您可以使用-datacenter
标志配置代理向哪个数据中心报告。Consul 对多个数据中心具有一流的支持,但配置每个节点以报告其数据中心可提高代理效率。 - Server:
这表明代理是在服务器模式还是客户端模式下运行
。在服务器模式下运行代理需要额外的开销。这是因为它们参与了共识仲裁、存储集群状态并处理查询。服务器也可能处于 “bootstrap
” 模式,这使服务器能够选举自己作为 Raft 领导者。多个服务器不能处于bootstrap模式,因为它会使集群处于不一致的状态。 - Client Addr:
这是用于代理的客户端接口的地址
。这包括 HTTP 和 DNS 接口的端口。默认情况下,这仅绑定到 localhost。如果更改此地址或端口,则必须-http-addr
在运行命令时指定 a,例如 consul members指示如何访问代理。其他应用程序也可以使用 HTTP 地址和端口 来控制 Consul。 - Cluster Addr:
这是用于集群中 Consul 代理之间通信的地址和端口集
。并非集群中的所有 Consul 代理都必须使用相同的端口,但所有其他节点必须可以访问此地址。
8、三个注册中心异同点
CAP理论:
- C:Consistency (强一致性)
- A:Availability (用性)
- C:Consistency (强一致性)
CAP理论关注粒度是数据,而不是整体系统设计的策略
AP(Eureka)架构:
当网络分区出现后,为了保证可用性,系统B可以返回旧值,保证系统的可用性。
结论:违背了一致性C的要求,只满足可用性和分区容错,即AP
CP(Zookeeper/Consul):
当网络分区出现后,为了保证一致性,就必须拒接请求,否则无法保证一致性
9、SpringCloud使用Consul作为服务注册发现中心
10、SpringCloud使用Consul作为配置中心