Spring Cloud Consul 項目是針對Consul的服務(wù)治理實現(xiàn)。Consul是一個分布式高可用的系統(tǒng),具有分布式、高可用、高擴展性。
Consul 是 HashiCorp 公司推出的開源工具,用于實現(xiàn)分布式系統(tǒng)的服務(wù)發(fā)現(xiàn)與配置。與其他分布式服務(wù)注冊與發(fā)現(xiàn)的方案,Consul的方案更“一站式” ,內(nèi)置了服務(wù)注冊與發(fā)現(xiàn)框 架、具有以下性質(zhì):
不再需要依賴其他工具(比如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 訪問控制.
使用 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 無此功能.
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ù)治理。
參考
要想利用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)
命令 | 解釋 | 示例 |
---|---|---|
agent | 運行一個consul agent | consul agent -dev |
join | 將agent加入到consul集群 | consul join IP |
members | 列出consul cluster集群中的members | consul members |
leave | 將節(jié)點移除所在集群 | consul leave |
-data-dir
-config-dir
-config-file
-dev
-bootstrap-expect
-node
-bind
Failed to get advertise address: Multiple private IPs found. Please configure one.
的異常-server
-client
-join
-datacenter(老版本叫-dc,-dc已經(jīng)失效)
我們嘗試一下:
-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集群架構(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/ 去訪問。
新建項目: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>
客戶端注冊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
到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 &
http://192.168.252.121:8500/ui/#/dc1/nodes/192.168.252.121
通過上圖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
Wechat:關(guān)注公眾號,搜云庫技術(shù)團隊,專注于開發(fā)技術(shù)的研究與知識分享
更多建議: