目录
1、consul注册中心介绍(Go官网)
Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置。与其它分布式服务注册与
发现的方案,Consul 的方案更“一站式”,内置了服务注册与发现框架、分布式一致性协议实现、健康检查、Key/Value 存储(配置中心)、多数据中心方案,不再需要依赖其它工具(比如 ZooKeeper 等),使用起来也较为
简单。
Consul 使用 Go 语言编写,因此具有天然可移植性(支持Linux、Windows 和 Mac OS);安装包仅包含一个可
执行文件,方便部署,与 Docker 等轻量级容器可无缝配合。
Consul 特性
- Raft 算法
- 服务发现
- 健康检查
- Key/Value 存储(配置中心)
- 多数据中心
- 支持 http 和 dns 协议接口
- 官方提供 Web 管理界面
1.1 consul角色说明
1.1.1 client: 客户端
无状态, 将 HTTP 和 DNS 接口请求转发给局域网内的服务端集群。
1.1.2 server: 服务端
保存配置信息, 高可用集群, 在局域网内与本地客户端通讯, 通过广域网与其它数据中心通讯。 每个数据中心的 server 数量推荐为 3 个或是 5 个。
1.2 consul架构简述
首先,我们可以看到有两个数据中心,分别标记为“datacenter1”和“datacenter1”(Consul 对多个数据中心有一流的支持)。
在每个数据中心内,我们混合了客户端(client)和服务器(server),每个数据中心的 server 数量推荐三到五台。这在故障情况下的可用性和性能之间取得了平衡,因为随着更多机器的加入,保持数据一致性所做的同步变得越来越慢。但是,客户端数量没有限制,它们可以轻松扩展到数千或数万。
不管是 Server 还是Client,统称为 Agent,Consul Client 是相对无状态的,只负责转发 RPC 到 Server 资源开销很少。Server 是一个有一组扩展功能的代理,这些功能包括参与 Raft 选举,维护集群状态,响应 RPC 查询,与其他数据中心交互 WAN Gossip 和转发查询给 leader 或者远程数据中心。
Consul使用gossip协议管理成员关系、广播消息到整个集群。数据中心中的所有代理都参与gossip协议(流言协议),这意味着gossip协议池包含数据中心的所有代理。这有几个目的:首先,不需要使用服务器地址配置客户端;发现是自动完成的。其次,检测代理故障的工作不是放在服务器上而是分布式的。这使得故障检测比简单的心跳方案更具可扩展性。它还为节点提供故障检测;如果代理不可访问,则节点可能遇到故障。第三,它用作消息传递层,以在发生领导者选举等重要事件时进行通知。
每个数据中心内的服务器都是单个 Raft 中节点集的一部分。这意味着他们一起工作,选择一个单一的领导者——一个具有额外职责的选定的服务器。leader 负责处理所有查询和事物。事物也必须作为同步协议的一部分复制到节点集中的所有节点。由于这个要求,当非 leader 服务器接收到 RPC 请求时,就会将请求其转发给集群 leader。。
服务器端节点同时也作为 WAN Gossip 池的一部分,WAN 池和 LAN 池不同的是,它针对网络高延迟做了优
化,而且只包含其他Consul 服务器的节点。这个池的目的是允许数据中心以最少的消耗方式发现对方。启动新的数据中心与加入现有的 WAN Gossip 一样简单。因为这些服务器都在这个池中运行,它还支持跨数据中心请求。当服务器收到对不同数据中心的请求时,它会将其转发到正确数据中心中的随机服务器。那个服务器可能会转发给本地的leader。
这导致数据中心之间的耦合非常低,但由于故障检测、连接缓存和多路复用,跨数据中心请求相对快速和可靠。
通常,不同的 Consul 数据中心之间不会复制数据。当对另一个数据中心中的资源发出请求时,本地 Consul 服务器会将 RPC 请求转发到该资源的远程 Consul 服务器并返回结果。如果远程数据中心不可用,那么这些资源也将不可用,但这不会影响本地数据中心。在某些特殊情况下,可以复制有限的数据子集,例如使用 Consul 的内置 ACL 复制功能,或使用consul-replicate等外部工具。
在某些地方,客户端代理可能会缓存来自服务器的数据,以使其在本地可用以提高性能和可靠性。示例包括连接证书和意图,它们允许客户端代理对入站连接请求做出本地决策,而无需往返服务器。一些 API 端点还支持可选的结果缓存。这有助于提高可靠性,因为即使与服务器的连接中断或服务器暂时不可用,本地代理也可以继续响应某些查询,如服务发现或缓存中的连接授权。
1.3 服务发现以及注册
当服务 Producer 启动时,会将自己的 Ip/host 等信息通过发送请求告知 Consul,Consul 接收到 Producer 的注册信息后,每隔 10s(默认)会向 Producer 发送一个健康检查的请求,检验 Producer 是否健康。
1.4 服务调用
当 Consumer 请求 Product 时,会先从 Consul 中拿到存储 Product 服务的 IP 和 Port 的临时表(temp table),从temp table 表中任选一个· Producer 的 IP 和 Port,然后根据这个 IP 和 Port,发送访问请求;temp table 表只包含通过了健康检查的 Producer 信息,并且每隔 10s(默认)更新。
1.3 配置说明
1.4 官网下载地址
2、在windows开发模式启动
2.1 安装
将下载的consul.exe
放在指定目录,双击运行后,在当前目录启动cmd客户端,执行consul
命令,返回如下提示。
2.2 启动
使用consul agent -dev
命令启动
启动报错:
D:\JavaSoftware\consul_1.9.4_windows_amd64\端口7---> consul agent -config-dir ./
==> Multiple private IPv4 addresses found. Please configure one with 'bind' and/or 'advertise'.
原因:因为有虚拟机,有多块网卡。关闭虚拟机的网卡,或者使用bind指定ipv4地址``
2.3 访问consul客户端
http://127.0.0.1:8500/ui/dc1/services
3、在windows启动client模式
3.1 端口分配
节点用途 | 节点主机IP | HTTP | HTTPS | DNS | GRPC | SERVER | LAN | WAN |
---|---|---|---|---|---|---|---|---|
consul-client1 | 本机IP | 8499 | 8509 | 8599 | 8399 | 8290 | 8291 | 8292 |
consul-client2 | 本机IP | 8500 | 8510 | 8600 | 8400 | 8320 | 8301 | 8302 |
3.2 创建如下目录结构
3.3 根据端口创建配置文件
通过修改节点名称、目录、端口,给客户端client1和client2创建配置文件client.json。
注:使用时需要删除注释!!!
{
"node_name": "client1", -- 该节点在集群中的名称。这在集群中必须是唯一的
"data_dir": "D:\\JavaSoftware\\consul_1.9.4_windows_amd64\\consul-cluster\\client-1\\data", --数据持久化目录
"server": false, -- true为服务端,false为客户端
"bind_addr": "127.0.0.1", -- 绑定ip,本机ip地址
"client_addr": "0.0.0.0", -- 配置0.0.0.0,允许局域网所有ip访问
"bootstrap": false,
"datacenter": "yyyL", -- 数据中心
"log_level": "INFO",
"log_file": "D:\\JavaSoftware\\consul_1.9.4_windows_amd64\\consul-cluster\\client-1\\log\\consul.log", --日志存放目录
"log_rotate_duration": "24h",
"enable_syslog": false,
"disable_host_node_id": true,
"rejoin_after_leave": true,
"ui": true,
"ports": {
"http": 8500,
"https": 8510,
"dns": 8600,
"grpc": 8400,
"serf_lan": 8301,
"serf_wan": 8302,
"server": 8300
},
"start_join": [