[TOC]
## consul
* 端口:8500
* web管理頁面:8600
https://weibo.com/ttarticle/p/show?id=2309351002704321779433768975
### **服務發現和治理**

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 內部端口使用匯總**

### **Consul 請求調用鏈路**

從架構上,圖片被兩個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