Spring Cloud:Consul基礎知識

秋風颯颯吹發表於2020-09-04

一.基本概念

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:分割槽容錯性