[TOC]
## consul
* 端口:8500
* web管理页面:8600
https://weibo.com/ttarticle/p/show?id=2309351002704321779433768975
### **服务发现和治理**
![](https://img.kancloud.cn/94/ee/94ee7cd683e15b9036d6af6b1e24f9f7_606x492.png)
1、服务发现以及注册:
当服务Producer 启动时,会将自己的Ip/host等信息通过发送请求告知 Consul,Consul 接收到 Producer 的注册信息后,每隔一段时间会向 Producer 发送一个健康检查的请求,检验Producer是否健康。
2、服务调用:
当 Consumer 请求Product时,会先从 Consul 中拿到存储Product服务的 IP 和 Port 的临时表(temp table),从temp table表中任选一个· Producer 的 IP 和 Port, 然后根据这个IP和Port,发送访问请求;temp table表只包含通过了健康检查的 Producer 信息,并且每隔一段时间更新
### **consule 核心 agent组件**
Agent是一个独立的程序,通过守护进程的方式,运行在consul集群中的每个节点上。每个Consul agent维护它自己的服务集合以及检查注册和健康信息。agent负责执行自己的健康检查和更新本地状态其中,Agent 根据节点的性质,分为: Agent Server 和 Agent Client
Agent Client:
client将 HTTP 和 DNS 接口请求转发给局域网内的服务端集群。
Agent Server:
server 保存client的注册信息,集群的配置信息, 维护集群高可用, 在局域网内与本地客户端通讯, 通过广域网与其它数据中心通讯。 每个数据中心的 server 数量推荐为 3 个或是 5 个,通过 Raft 算法来保证一致性。
### **consul 通信接口**
1. RPC
用于内部通讯Gossip/日志分发/选主等
2. HTTP API
服务发现/健康检查/KV存储等几乎所有功能, 默认端口为8500
2.3 Consul Commands (CLI)
consul命令行工具可以与consul agent进行连接,提供部分consul的功能。
实际上Consul CLI 默认就是调用的HTTP API来与consul集群进行通讯。
2.4 DNS
仅用于服务查询
例如: dig @127.0.0.1 -p 8600 web.service.consul
可以通过cosul提供的DNS接口来获取当前的服务“web”对应的可用节点
**Consul 内部端口使用汇总**
![](https://img.kancloud.cn/d4/13/d4139087bbf1404b69f5c4bf8f191f55_628x361.png)
### **Consul 请求调用链路**
![](https://img.kancloud.cn/df/a6/dfa68ee040430b1d38203f3c64701f5b_650x646.png)
从架构上,图片被两个datacenter分成了上下两部分;但这两部分又并不是完全隔离的,他们之间通过WAN GOSSIP在Internet上交互报文。因此,我们了解到consul是可以支持多个数据中心之间基于WAN来做同步的。
再看单个datacenter内部,节点被划分为两种颜色,其中红色为server,紫色为client。它们之间通过GRPC通信(主要用于业务数据)。除此之外,server和client之间,还有一条LAN GOSSIP通信,这是用于当LAN内部发生了拓扑变化时,存活的节点们能够及时感知,比如server节点down掉后,client就会触发将对应server节点从可用列表中剥离出去。
当然,server与server之间,client与client之间,client与server之间,在同一个datacenter中的所有consul agent会组成一个LAN网络(当然它们之间也可以按照区域划分segment),当LAN网中有任何角色变动,或者有用户自定义的event产生的时候,其他节点就会感知到,并触发对应的预置操作。
所有的server节点共同组成了一个集群,他们之间运行raft协议,通过共识仲裁选举出leader。所有的业务数据都通过leader写入到集群中做持久化,当有半数以上的节点存储了该数据后,server集群才会返回ACK,从而保障了数据的强一致性。当然,server数量大了之后,也会影响写数据的效率。所有的follower会跟随leader的脚步,保障其有最新的数据副本。
> Server节点
* 参与共识仲裁(raft)
* 存储群集状态(日志存储)
* 处理查询
* 维护与周边(LAN/WAN)各节点关系
>Agent节点
* 负责通过该节点注册到consul的微服务的健康检查
* 将客户端注册请求以及查询转化为对server的RPC请求
* 维护与周边(LAN/WAN)各节点关系
>实现原理
* 纵观consul的实现,其核心在于两点:
1. 集群内节点间信息的高效同步机制,其保障了拓扑变动以及控制信号的及时传递
2. server集群内日志存储的强一致性
* 它们主要基于以下两个协议来实现:
1. 使用gossip协议在集群内传播信息
2. 使用raft协议来保障日志的一致性
- Go准备工作
- 依赖管理
- Go基础
- 1、变量和常量
- 2、基本数据类型
- 3、运算符
- 4、流程控制
- 5、数组
- 数组声明和初始化
- 遍历
- 数组是值类型
- 6、切片
- 定义
- slice其他内容
- 7、map
- 8、函数
- 函数基础
- 函数进阶
- 9、指针
- 10、结构体
- 类型别名和自定义类型
- 结构体
- 11、接口
- 12、反射
- 13、并发
- 14、网络编程
- 15、单元测试
- Go常用库/包
- Context
- time
- strings/strconv
- file
- http
- Go常用第三方包
- Go优化
- Go问题排查
- Go框架
- 基础知识点的思考
- 面试题
- 八股文
- 操作系统
- 整理一份资料
- interface
- array
- slice
- map
- MUTEX
- RWMUTEX
- Channel
- waitGroup
- context
- reflect
- gc
- GMP和CSP
- Select
- Docker
- 基本命令
- dockerfile
- docker-compose
- rpc和grpc
- consul和etcd
- ETCD
- consul
- gin
- 一些小点
- 树
- K8s
- ES
- pprof
- mycat
- nginx
- 整理后的面试题
- 基础
- Map
- Chan
- GC
- GMP
- 并发
- 内存
- 算法
- docker