天天看點

深入學習consul

一.背景

——随着網際網路的發展,越來越多的系統/網站走向了分布式之路,但是分布式帶給我們的複雜性是難以想象的,這就需要專門有第三方統一管理微服務、配置、資源等。 第三方系統必須要具有下面兩個特征: 1.叢集部署 2.資料一緻性

——目前業内有很多這種産品:zookeeper、etcd、consul,三者各有各的特點。這裡就不一一說明三者的優缺,僅僅分析consul的優勢 1.封裝了服務發現的api,開發調用非常簡單 2.提供了健康檢查功能 3.使用了raft算法保證了一緻性,比複雜的paxos算法更直接,相比而言,zk采用的是paxos,二etcd采用的是raft 4.支援多資料中心,保證多機房使用。 5.支援 http 和 dns 協定接口.,zookeeper 的內建較為複雜,,etcd 隻支援 http 協定 6.官方提供web管理界面, etcd 無此功能

二:consul的基本概念

agent

組成 consul 叢集的每個成員上都要運作一個 agent,可以通過 consul agent 指令來啟動。agent 可以運作在 server 狀态或者 client 狀态。自然的,運作在 server 狀态的節點被稱為 server 節點;運作在 client 狀态的節點被稱為 client 節點。

client 節點

負責轉發所有的 RPC 到 server 節點。本身無狀态,且輕量級,是以,可以部署大量的 client 節點。

server 節點

負責組成 cluster 的複雜工作(選舉、狀态維護、轉發請求到 lead),以及 consul 提供的服務(響應 RCP 請求)。考慮到容錯和收斂,一般部署 3 ~ 5 個比較合适。

datacenter 多機房使用的資料共享

基本架構圖

深入學習consul

三.安裝和啟動

consul支援Mac os   、Linux、Windows等常用作業系統,下載下傳位址: 點選下載下傳   consul可以配置其web ui檢視目前的服務  key/value   資料節點等 web-ui下載下傳位址: 點選下載下傳

下載下傳後解壓,直接運作

consul需要用agent啟動,啟動模式可以是server和client

以window單機啟動server為例:

配置config.conf檔案

{
  "datacenter":"dc1",//資料中心名稱
  "data_dir": "D:\\consul\\consul\\data",//資料存儲目錄
  "log_level": "INFO",//日志級别
  "node_name": "node1",//server節點名稱
  "server": true,//是否開啟服務模式
  "ui":true,//是否開啟web-ui
  "bind_addr":"192.168.100.110",//綁定的位址
  "bootstrap":true,//引用啟動
  "ui_dir": "D:\\consul\\consul\\webui"//web-ui位址
}
           

進入consul根目錄  啟動指令:consul.exe agent -config-file config.conf

啟動成功後,浏覽器打開http://127.0.0.1:8500/ui/ 可以看到整個consul的所有資訊

如果需要配置叢集的話

server node1 配置資訊

{
  "datacenter":"dc1",
  "log_level": "INFO",
  "node_name": "node1",
  "server": true,
  "ui":true,
  "bind_addr":"192.168.100.110",
  "cluster_addr":"10.10.105.71",
  "bootstrap":true,
  "join":"10.10.105.72"
  "ui_dir": "D:\\consul\\consul\\webui"
}
           

server node2 配置資訊

{
  "datacenter":"dc1",
  "log_level": "INFO",
  "node_name": "node2",
  "server": true,
  "ui":true,
  "bind_addr":"192.168.100.111",
  "cluster_addr":"10.10.105.72",
  "bootstrap":true
}
           

啟動兩個節點  啟動指令:consul.exe agent -config-file config.conf

這樣就完成了叢集部署 打開consul的web-ui :http://127.0.0.1:8500/

深入學習consul

四.服務注冊與發現的兩種方式

——Consul支援兩種服務注冊的方式,一種是通過Consul的服務注冊HTTP API,由服務自身在啟動後調用API注冊自己,另外一種則是通過在配置檔案中定義服務的方式進行注冊。Consul文檔中建議使用後面一種方式來做服務 配置和服務注冊。

1.1首先我們來了解用配置注冊服務

建立一個叫redis-server1.json檔案

{
  "service": {
    "name": "redis-server1",
    "tags": ["master"],
    "address": "127.0.0.1",
    "port": 6379,
    "checks": [
      {
        "http": "http://localhost:6379",
        "interval": "10s"
      }
    ]
  }
}
           

再建立一個client節點

{
  "datacenter":"dc1",
  "log_level": "INFO",
  "node_name": "node3",
  "server": false,
  "bind_addr":"192.168.100.112",
  "config_dir":"./conf"
}
           

把json檔案放到conf檔案夾下面,利用consul.exe agent -config-file config.conf ,client注冊一個redis服務。

json檔案定義中包含服務的name、address、port等,還包含一個服務檢測的配置,這裡 我們每隔10s對服務進行一次健康檢查。同理,我們可以在其它節點上也建立同樣配置檔案(需重新開機,并帶上 -config-dir指令行選項),服務注冊就這麼簡單。

1.2使用java代碼注冊服務

首先利用maven把封裝consul的用戶端jar包導入

<dependency>
     <groupId>com.orbitz.consul</groupId>
      <artifactId>consul-client</artifactId>
      <version>0.12.3</version>
</dependency>
           

注冊代碼:

Consul client = Consul.builder().build();
 String serviceName = UUID.randomUUID().toString();
 String serviceId = UUID.randomUUID().toString();
 client.agentClient().register(8080, new URL("http://localhost:1337/health"), 1000L, serviceName, serviceId);
           

這樣就完成了服務注冊,并且添加了健康檢查的url,比較簡單。

——同樣Consul提供了兩種發現服務的方式,一種是通過HTTP API檢視存在哪些服務;另外一種是通過consul agent内置的DNS服務來做。兩者的差别在于後者可以根據服務check的實時狀态動态調整available服務節點清單。

2.1.DNS發現服務 在配置和部署完client服務後,我們就可以通過DNS指令來查詢服務的具體資訊了。consul為服務編排的内置域名為 “NAME.service.consul",這樣我們的redis的域名為:redis.service.consul 進行查詢服務

2.2.java代碼發現服務
HealthClient healthClient = Consul.newClient().healthClient();
ConsulResponse<List<ServiceHealth>> response = client2.healthClient().getHealthyServiceInstances(serviceName);//擷取健康的服務
ServiceHealthCache svHealth = ServiceHealthCache.newCache(healthClient, serviceName);//建立今天服務
svHealth.start();//開始監聽服務
           

上面用代碼實作了服務的發現,其發現是排除了一些不健康的服務,這正是consul最大的優點,使得服務變化通知更加簡單。

這裡分析下consul和zookeeper服務變更通知的差別: zookeeper:用戶端和服務端通過建立tcp長連接配接進行服務變更通知,一旦服務端有服務變化,通過socket發送消息給用戶端。優點是簡單,服務端主動推送消息到用戶端,缺點是長連接配接往往不穩定,鍊路斷開,用戶端經常收不到服務端推送的消息。

consul:是基于http協定,用戶端通過http api主動查詢服務,如果有變更則傳回服務資訊,我們都知道http是一個request,一個response,而consul怎樣保證服務端一有變更馬上response到用戶端呢,這裡consul解決方案是:1輪循;2阻塞查詢,通過輪循調用服務端,并且不及時傳回服務資訊,而是等待一定時間在傳回,在規定時間内如果有服務變更則馬上傳回變更資訊,這樣就用戶端就可以及時的知道服務變更。

五.consul的其它使用

——consul做為分布式架構絕不僅僅滿足服務注冊和發現,它還可以

1.分布式key/value,用于做配置中心。 2.分布式session,用于解決session的問題。 3.分布式鎖,其key/value也可以用于分布式鎖的問題 4.資源中心,動态管理redis、datasource、rabbitmq等資源

繼續閱讀