Consul簡介
Consul是基於GO語言開發的開源工具,主要面向分佈式,服務化的系統提供服務註冊、服務發現和配置管理的功能。Consul的功能都很實用,其中包括:服務註冊/發現、健康檢查、Key/Value存儲、多數據中心和分佈式一致性保證等特性。Consul本身只是一個二進制的可執行文件,所以安裝和部署都非常簡單,只需要從官網下載後,在執行對應的啓動腳本即可。
Consul特性
-
服務註冊/發現
爲什麼微服務架構下就需要做服務註冊和服務發現呢?微服務的目標就是要將原來大一統的系統架構,拆分成細粒度的按功能職責分成的小系統,這樣就會出現很多小的系統,部署的節點也會隨之增加。試想一下,如果沒有一個統一的服務組件來管理各系統間的列表,微服務架構是很難落地實現的。
Consul提供的服務註冊/發現功能在數據強一致性和分區容錯性上都有非常好的保證,但在集羣可用性下就會稍微差一些(相比Euerka來說)。 -
數據強一致性保證
Consul採用了一致性算法Raft來保證服務列表數據在數據中心中各Server下的強一致性,這樣能保證同一個數據中心下不管某一臺Server Down了,請求從其他Server中同樣也能獲取的最新的服務列表數據。數據強一致性帶來的副作用是當數據在同步或者Server在選舉Leader過程中,會出現集羣不可用。 -
多數據中心
Consul支持多數據中心(Data Center),多個數據中心之間通過Gossip協議進行數據同步。多數據中心的好處是當某個數據中心出現故障時,其他數據中心可以繼續提供服務,提升了可用性。 -
健康檢查
Consul支持基本硬件資源方面的檢查,如:CPU、內存、硬盤等 -
Key/Value存儲
Consul支持Key/Value存儲功能,可以將Consul作爲配置中心使用,可以將一些公共配置信息配置到Consul,然後通過Consul提供的 HTTP API來獲取對應Key的Value。
調用過程
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。
Spring Cloud Consul 項目是針對 Consul 的服務治理實現。Consul 是一個分佈式高可用的系統,它包含多個組件,但是作爲一個整體,在微服務架構中,爲我們的基礎設施提供服務發現和服務配置的工具。
安裝與啓動
打開 Consul官網根據不同的操作系統選擇最新的 Consul 版本,我們這裏以 macOS 操作系統爲例。
cd到安裝目錄輸入./consul agent -dev
會以開發者模式啓動。輸入:localhost:8500就可以看到時consul管理界面了。
consul管理界面默認連接爲本地機器127.0.0.1,可以在啓動時輸入:./consul agent -dev -client 0.0.0.0 -ui
其它機器也可以訪問管理頁面。
配置文件
pom文件添加:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
配置文件根據需要添加:
spring:
application:
name: consul
cloud:
consul:
#配置consul服務器的host
host: localhost
#配置端口
port: 8500
config:
#配置默認文件名
default-context: ${spring.application.name}
#是否啓用consul配置
enabled: true
#配置文件格式
format: YAML
#配置基本文件,默認值config
prefix: config
#配置文件名,默認data
data-key: data
discovery:
#是否啓用服務發現
enabled: true
#配置健康檢查路徑
health-check-path: /actuator/health
#配置健康檢查時間間隔
health-check-interval: 15s
#配置實例id
instance-id: ${spring.application.name}:${vcap.application.instance_id:${spring.application.instance_id:${random.value}}}
#配置服務註冊
register: true
deregister: true
#表示註冊時使用ip而不是hostname
prefer-ip-address: true
#表示指定訪問服務IP
ip-address: IP
#健康檢查失敗多長時間取消註冊
health-check-critical-timeout: 30s