一.基本概念
Consul是一套開源的分散式服務發現和配置管理系統,由HashiCorp公司用Go開發。
它提供微服務系統中的服務治理、配置中心、控制匯流排等功能。
服務發現:提供HTTP和DNS兩種發現方式。
健康檢測:支援多種方式,http、tcp、Docker、shell等
kv儲存:key、value儲存方式
多資料中心:Consul支援多資料中心。
視覺化web介面。
二.安裝(Docker)
拉取映象:
docker pull consul
執行:
docker run --name consul -d -p 8500:8500 -p 8300:8300 -p 8301:8301 -p 8302:8302 -p 8600:8600 consul agent -server -bootstrap-expect 1 -ui -bind=0.0.0.0 -client=0.0.0.0
埠詳解
- 8500 : http 埠,用於 http 介面和 web UI訪問;
- 8300 : server rpc 埠,同一資料中心 consul server 之間通過該埠通訊;
- 8301 : serf lan 埠,同一資料中心 consul client 通過該埠通訊; 用於處理當前datacenter中LAN的gossip通訊;
- 8302 : serf wan 埠,不同資料中心 consul server 通過該埠通訊; agent Server使用,處理與其他datacenter的gossip通訊;
- 8600 : dns 埠,用於已註冊的服務發現;
引數詳解:
–net=host docker引數, 使得docker容器越過了net namespace的隔離,免去手動指定埠對映的步驟 -server consul支援以server或client的模式執行, server是服務發現模組的核心, client主要用於轉發請求 -advertise 將本機私有IP傳遞到consul -retry-join 指定要加入的consul節點地址,失敗後會重試, 可多次指定不同的地址 -client 指定consul繫結在哪個client地址上,這個地址可提供HTTP、DNS、RPC等服務,預設是>127.0.0.1 -bind 繫結伺服器的ip地址;該地址用來在叢集內部的通訊,叢集內的所有節點到地址必須是可達的,>預設是0.0.0.0 allow_stale 設定為true則表明可從consul叢集的任一server節點獲取dns資訊, false則表明每次請求都會>經過consul的server leader -bootstrap-expect 資料中心中預期的伺服器數。指定後,Consul將等待指定數量的伺服器可用,然後>啟動群集。允許自動選舉leader,但不能與傳統-bootstrap標誌一起使用, 需要在server模式下執行。 -data-dir 資料存放的位置,用於持久化儲存叢集狀態 -node 群集中此節點的名稱,這在群集中必須是唯一的,預設情況下是節點的主機名。 -config-dir 指定配置檔案,當這個目錄下有 .json 結尾的檔案就會被載入,詳細可參考https://www.consul.io/docs/agent/options.html#configuration_files -enable-script-checks 檢查服務是否處於活動狀態,類似開啟心跳 -datacenter 資料中心名稱 -ui 開啟ui介面 -join 指定ip, 加入到已有的叢集中
這裡有一個坑,如果是單機版consul,-bootstrap-expect選項要設定為1,大於等於2將導致web介面出現500錯誤。
訪問 192.168.10.137:8500,出現如下web介面,說明consul安裝成功。
三.服務註冊入駐Consul
部分pom依賴:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-discovery</artifactId> </dependency>
yml配置:
server: port: 8006 spring: application: name: consul-provider-payment cloud: consul: host: 192.168.10.137 port: 8500 discovery: service-name: ${spring.application.name} #心跳預設是關閉的,如果不開啟,consul檢查會認為該服務是unhealthy heartbeat: enabled: true
主啟動類:
@SpringBootApplication @EnableDiscoveryClient public class PaymentMain8006 { public static void main(String[] args) { SpringApplication.run(PaymentMain8006.class,args); } }
執行,觀察consul的web介面,發現該服務已經被註冊到consul中了
三個註冊中心異同:
CAP C:強一致性 A:可用性 P:分割槽容錯性