Spring Cloud(二)Consul 服務(wù)治理實現(xiàn)

2019-04-17 13:57 更新

Spring Cloud Consul 項目是針對Consul的服務(wù)治理實現(xiàn)。Consul是一個分布式高可用的系統(tǒng),具有分布式、高可用、高擴展性。

Consul 簡介

Consul 是 HashiCorp 公司推出的開源工具,用于實現(xiàn)分布式系統(tǒng)的服務(wù)發(fā)現(xiàn)與配置。與其他分布式服務(wù)注冊與發(fā)現(xiàn)的方案,Consul的方案更“一站式” ,內(nèi)置了服務(wù)注冊與發(fā)現(xiàn)框 架、具有以下性質(zhì):

  • 分布一致性協(xié)議實現(xiàn)、
  • 健康檢查、
  • Key/Value存儲、
  • 多數(shù)據(jù)中心方案,

不再需要依賴其他工具(比如ZooKeeper等)。

使用起來也較 為簡單。Consul使用Go語言編寫,因此具有天然可移植性(支持Linux、windows和Mac OS X);安裝包僅包含一個可執(zhí)行文件,方便部署,與Docker等輕量級容器可無縫配合 。 基于 Mozilla Public License 2.0 的協(xié)議進行開源. Consul 支持健康檢查,并允許 HTTP 和 DNS 協(xié)議調(diào)用 API 存儲鍵值對. 一致性協(xié)議采用 Raft 算法,用來保證服務(wù)的高可用. 使用 GOSSIP 協(xié)議管理成員和廣播消息, 并且支持 ACL 訪問控制.

Consul 的使用場景

  • docker 實例的注冊與配置共享
  • coreos 實例的注冊與配置共享
  • vitess 集群
  • SaaS 應(yīng)用的配置共享
  • 與 confd 服務(wù)集成,動態(tài)生成 nginx 和 haproxy 配置文件

Consul 的優(yōu)勢

使用 Raft 算法來保證一致性, 比復(fù)雜的 Paxos 算法更直接. 相比較而言, zookeeper 采用的是 Paxos, 而 etcd 使用的則是 Raft. 支持多數(shù)據(jù)中心,內(nèi)外網(wǎng)的服務(wù)采用不同的端口進行監(jiān)聽。 多數(shù)據(jù)中心集群可以避免單數(shù)據(jù)中心的單點故障,而其部署則需要考慮網(wǎng)絡(luò)延遲, 分片等情況等. zookeeper 和 etcd 均不提供多數(shù)據(jù)中心功能的支持. 支持健康檢查. etcd 不提供此功能. 支持 http 和 dns 協(xié)議接口. zookeeper 的集成較為復(fù)雜, etcd 只支持 http 協(xié)議. 官方提供web管理界面, etcd 無此功能.

Consul 的角色

client: 客戶端, 無狀態(tài), 將 HTTP 和 DNS 接口請求轉(zhuǎn)發(fā)給局域網(wǎng)內(nèi)的服務(wù)端集群.server: 服務(wù)端, 保存配置信息, 高可用集群, 在局域網(wǎng)內(nèi)與本地客戶端通訊, 通過廣域網(wǎng)與其他數(shù)據(jù)中心通訊. 每個數(shù)據(jù)中心的 server 數(shù)量推薦為 3 個或是 5 個.

由于Spring Cloud Consul項目的實現(xiàn),我們可以輕松的將基于Spring Boot的微服務(wù)應(yīng)用注冊到Consul上,并通過此實現(xiàn)微服務(wù)架構(gòu)中的服務(wù)治理。

搭建環(huán)境

參考

要想利用Consul提供的服務(wù)實現(xiàn)服務(wù)的注冊與發(fā)現(xiàn),我們需要搭建Consul Cluster 環(huán)境。

在Consul方案中,每個提供服務(wù)的節(jié)點上都要部署和運行Consul的agent,所有運行Consul agent節(jié)點的集合構(gòu)成Consul Cluster。

Consul agent有兩種運行模式:Server和Client。這里的Server和Client只是Consul集群層面的區(qū)分,與搭建在Cluster之上 的應(yīng)用服務(wù)無關(guān)。

以Server模式運行的Consul agent節(jié)點用于維護Consul集群的狀態(tài),官方建議每個Consul Cluster至少有3個或以上的運行在Server mode的Agent,Client節(jié)點不限。

環(huán)境配置如下:

Centos 7.3

主機名稱 IP 作用 是否允許遠程訪問
node1 192.168.252.121 consul server
node2 192.168.252.122 consul client
node3 192.168.252.123 consul client

關(guān)閉防火墻

systemctl stop firewalld.service

Consul 最新版的下載地址:
https://releases.hashicorp.com/consul/1.0.1/consul_1.0.1_linux_amd64.zip

下載,然后unzip 解壓,得到唯一,一個可執(zhí)行文件

cd /opt/
wget https://releases.hashicorp.com/consul/1.0.1/consul_1.0.1_linux_amd64.zip
unzip consul_1.0.1_linux_amd64.zip
cp consul /usr/local/bin/

查看是否安裝成功

[root@node1 opt]# consul

出現(xiàn)如下結(jié)果,表示安裝成功

Usage: consul [--version] [--help] <command> [<args>]


Available commands are:
    agent          Runs a Consul agent
    catalog        Interact with the catalog
    event          Fire a new event
    exec           Executes a command on Consul nodes
    force-leave    Forces a member of the cluster to enter the "left" state
    info           Provides debugging information for operators.
    join           Tell Consul agent to join cluster
    keygen         Generates a new encryption key
    keyring        Manages gossip layer encryption keys
    kv             Interact with the key-value store
    leave          Gracefully leaves the Consul cluster and shuts down
    lock           Execute a command holding a lock
    maint          Controls node or service maintenance mode
    members        Lists the members of a Consul cluster
    monitor        Stream logs from a Consul agent
    operator       Provides cluster-level tools for Consul operators
    reload         Triggers the agent to reload configuration files
    rtt            Estimates network round trip time between nodes
    snapshot       Saves, restores and inspects snapshots of Consul server state
    validate       Validate config files/directories
    version        Prints the Consul version
    watch          Watch for changes in Consul

檢查版本

[root@node1 opt]# consul version

Consul v1.0.1
Protocol 2 spoken by default, understands 2 to 3 (agent will automatically use protocol >2 when speaking to compatible agents)

Consul常用命令

命令 解釋 示例
agent 運行一個consul agent consul agent -dev
join 將agent加入到consul集群 consul join IP
members 列出consul cluster集群中的members consul members
leave 將節(jié)點移除所在集群 consul leave

consul agent 命令的常用選項

-data-dir

  • 作用:指定agent儲存狀態(tài)的數(shù)據(jù)目錄
  • 這是所有agent都必須的
  • 對于server尤其重要,因為他們必須持久化集群的狀態(tài)

-config-dir

  • 作用:指定service的配置文件和檢查定義所在的位置
  • 通常會指定為”某一個路徑/consul.d”(通常情況下,.d表示一系列配置文件存放的目錄)

-config-file

  • 作用:指定一個要裝載的配置文件
  • 該選項可以配置多次,進而配置多個配置文件(后邊的會合并前邊的,相同的值覆蓋)

-dev

  • 作用:創(chuàng)建一個開發(fā)環(huán)境下的server節(jié)點
  • 該參數(shù)配置下,不會有任何持久化操作,即不會有任何數(shù)據(jù)寫入到磁盤
  • 這種模式不能用于生產(chǎn)環(huán)境(因為第二條)

-bootstrap-expect

  • 作用:該命令通知consul server我們現(xiàn)在準(zhǔn)備加入的server節(jié)點個數(shù),該參數(shù)是為了延遲日志復(fù)制的啟動直到我們指定數(shù)量的server節(jié)點成功的加入后啟動。

-node

  • 作用:指定節(jié)點在集群中的名稱
  • 該名稱在集群中必須是唯一的(默認(rèn)采用機器的host)
  • 推薦:直接采用機器的IP

-bind

  • 作用:指明節(jié)點的IP地址
  • 有時候不指定綁定IP,會報Failed to get advertise address: Multiple private IPs found. Please configure one. 的異常

-server

  • 作用:指定節(jié)點為server
  • 每個數(shù)據(jù)中心(DC)的server數(shù)推薦至少為1,至多為5
  • 所有的server都采用raft一致性算法來確保事務(wù)的一致性和線性化,事務(wù)修改了集群的狀態(tài),且集群的狀態(tài)保存在每一臺server上保證可用性
  • server也是與其他DC交互的門面(gateway)

-client

  • 作用:指定節(jié)點為client,指定客戶端接口的綁定地址,包括:HTTP、DNS、RPC
  • 默認(rèn)是127.0.0.1,只允許回環(huán)接口訪問
  • 若不指定為-server,其實就是-client

-join

  • 作用:將節(jié)點加入到集群

-datacenter(老版本叫-dc,-dc已經(jīng)失效)

  • 作用:指定機器加入到哪一個數(shù)據(jù)中心中

啟動服務(wù)

我們嘗試一下:

-dev表示開發(fā)模式運行,使用-client 參數(shù)可指定允許客戶端使用什么ip去訪問,例如-client 192.168.252.121 表示可以使用

http://192.168.252.121:8500/ui/ 去訪問。

consul agent -dev -client 192.168.252.121

Consul Cluster

Consul 的高可用

Consul Cluster集群架構(gòu)圖如下:

Consul Cluster集群架構(gòu)

這邊準(zhǔn)備了三臺Centos 7.3的虛擬機,主機規(guī)劃如下,供參考:

主機名稱 IP 作用 是否允許遠程訪問
node1 192.168.252.121 consul server
node2 192.168.252.122 consul client
node3 192.168.252.123 consul client

搭建步驟

命令參數(shù),參看上面詳細介紹

在 node1 機器上啟動 Consul

cd /opt/
mkdir data
consul agent -data-dir /opt/data -node=192.168.252.121 -bind=0.0.0.0 -datacenter=dc1 -ui -client=192.168.252.121 -server -bootstrap-expect 1 > /dev/null 2>&1 &

在 node2 機器上啟動 Consul,并且將node2節(jié)點加入到node1節(jié)點上

cd /opt/
mkdir data
consul agent -data-dir /opt/data -node=192.168.252.122 -bind=0.0.0.0 -datacenter=dc1 -ui -client=192.168.252.122 -join=192.168.252.121 > /dev/null 2>&1 &

在 node3 機器上啟動 Consul,并且將node3節(jié)點加入到node1節(jié)點上

cd /opt/
mkdir data
consul agent -data-dir /opt/data -node=192.168.252.123 -bind=0.0.0.0 -datacenter=dc1 -ui  -client=192.168.252.123 -join=192.168.252.121 > /dev/null 2>&1 &

在node1上查看當(dāng)前集群節(jié)點:

consul members -rpc-addr=192.168.252.123:8400  


consul leave -rpc-addr=192.168.252.123:8400  

http://192.168.252.121:8500/ui/ 去訪問。

Consul Cluster集群 nodes

項目示例

新建項目:spring-cloud-consul-client

添加依賴

在項目 spring-cloud-consul-client pom.xml中引入需要的依賴內(nèi)容:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>

開啟服務(wù)注冊

客戶端注冊Consul時,它提供有關(guān)自身的元數(shù)據(jù),如主機和端口,ID,名稱和標(biāo)簽。默認(rèn)情況下,將創(chuàng)建一個HTTP 檢查,每隔10秒Consul命中/health端點。如果健康檢查失敗,則服務(wù)實例被標(biāo)記為關(guān)鍵。

package io.ymq.example.consul;


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


@SpringBootApplication
@EnableDiscoveryClient
@RestController
public class ConsulApplication {


    @RequestMapping("/")
    public String home() {
        return "Hello world";
    }


    public static void main(String[] args) {
        SpringApplication.run(ConsulApplication.class, args);
    }
}

配置文件

application.yml配置文件中增加如下信息:如果Consul客戶端位于localhost:8500以外,則需要配置來定位客戶端

spring:
  application:
    name: consul-client
  cloud:
    consul:
      host: 192.168.252.121
      port: 8500
      discovery:
        healthCheckPath: /
        healthCheckInterval: 5s

如果Consul客戶端位于localhost:8500以外的位置,則需要配置來定位客戶端。例:

host: 192.168.252.121
port: 8500

HTTP健康檢查路徑 INSTALL

“10s”和“1m”分別表示10秒和1分

discovery:
    healthCheckPath: ${management.context-path}/health
    healthCheckInterval: 15s

啟動服務(wù)

spring-cloud-consul-client 項目根目錄下,執(zhí)行mvn clean package,把target 目錄下 生成的 jar spring-cloud-consul-client-0.0.1-SNAPSHOT.jar 上傳服務(wù)器,發(fā)布項目

打包命令

mvn clean package

發(fā)布命令

nohup java -jar spring-cloud-consul-client-0.0.1-SNAPSHOT.jar  > /dev/null 2>&1 &

訪問服務(wù)

http://192.168.252.121:8500/ui/#/dc1/nodes/192.168.252.121

Consul Cluster 集群 服務(wù)注冊情況

Consul Cluster集群 服務(wù)注冊情況

Consul Cluster集群 服務(wù)注冊情況

通過上圖HTTP健康檢查,可以看到服務(wù)檢測正常

源碼下載

GitHub:https://github.com/souyunku/spring-cloud-examples/tree/master/spring-cloud-consul

碼云:https://gitee.com/souyunku/spring-cloud-examples/tree/master/spring-cloud-consul

Contact

  • 作者:鵬磊
  • 出處:http://www.souyunku.com
  • Email:admin@souyunku.com
  • 版權(quán)歸作者所有,轉(zhuǎn)載請注明出處
  • Wechat:關(guān)注公眾號,搜云庫技術(shù)團隊,專注于開發(fā)技術(shù)的研究與知識分享

    關(guān)注公眾號-搜云庫

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號