consul(第二篇)consul Ops
consul Ops
consul client
通過下面的命令可以建立consul client
nohup consul agent -data-dir /tmp/consul -node=liaokailin -bind=192.168.21.48 -join=120.76.145.187 &
node
指定client節點名稱bind
client繫結的ipjoin
指定加入到的consul server
ip地址
通過執行
consul members --rpc-addr=120.76.145.187:8400
得到
Node Address Status Type Build Protocol DC
iZ94235juoyZ 120.76 .145.187:8301 alive server 0.6.4 2 dc1
liaokailin 192.168.21.48:8301 alive client 0.5.2 2 dc1
``
可以看出一個為`server` 一個為`client`
##service register
在consul中實現服務發現的前提是進行服務註冊
###命令實現
執行如下命令構建一個服務
mkdir /etc/consul.d
vim /etc/consul.d/first-service.json
輸入以下內容
{“service”: {“name”: “first-service”, “tags”: [“dev”], “port”: 8081}}
以上資訊定義一個名稱為`first-service`,tag為`dev`的`service`,一個服務可以有多個tag用以區別在不同的環境,因此在進行服務發現時要精準發現
一個服務需要`tag`和`name`兩個條件
配置完成後指定如下指令碼
consul agent -data-dir /tmp/consul -node=liaokailin -bind=192.168.21.48 -join=120.76.145.187 -config-dir /etc/consul.d
“
{
consul: [ ],
first-service: [
"dev"
]
}
通過dns
dig @120.76.145.187 -p 8600 first-service.service.consul SRV
得到
penAccoutIntrs
; <<>> DiG 9.8.3-P1 <<>> @120.76.145.187 -p 8600 first-service.service.consul SRV
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 26100
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available
;; QUESTION SECTION:
;first-service.service.consul. IN SRV
;; ANSWER SECTION:
first-service.service.consul. 0 IN SRV 1 1 8081 liaokailin.node.dc1.consul.
;; ADDITIONAL SECTION:
liaokailin.node.dc1.consul. 0 IN A 192.168.21.48
;; Query time: 44 msec
;; SERVER: 120.76.145.187#8600(120.76.145.187)
;; WHEN: Thu Jun 2 15:52:29 2016
;; MSG SIZE rcvd: 162
java實現
pom.xml
<dependencies>
<dependency>
<groupId>com.orbitz.consul</groupId>
<artifactId>consul-client</artifactId>
<version>0.12.2</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
</dependency>
</dependencies>
<repositories>
<repository>
<snapshots>
<enabled>false</enabled>
</snapshots>
<id>central</id>
<name>bintray</name>
<url>http://jcenter.bintray.com</url>
</repository>
</repositories>
建立一個單元測試
package com.lkl.consul;
import com.google.common.net.HostAndPort;
import com.orbitz.consul.AgentClient;
import com.orbitz.consul.Consul;
import org.junit.Test;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
/**
* 服務註冊
* Created by liaokailin on 16/6/2.
*/
public class ServiceRegister {
@Test
public void registerServiceForConsul() throws Exception {
Consul consul = Consul.builder().withHostAndPort(HostAndPort.fromParts("127.0.0.1", 8500)).build();
AgentClient agentClient = consul.agentClient();
String serviceId = UUID.randomUUID().toString();
String serviceName = "java-consul-service";
String serviceTag = "test";
long ttl = 3l;
agentClient.register(9090, ttl, serviceName, serviceId, serviceTag);
agentClient.pass(serviceId);
System.out.println("succ.");
TimeUnit.MINUTES.sleep(2);
}
}
首先通過builder
構建consul
物件,通過agent
註冊一個服務.
通過web-ui
可以發現服務成功註冊.
健康檢查
命令實現
vim /etc/consul.d/first-service.json
結果:
cat first-service.json | json_pp
{
"service" : {
"check" : {
"script" : "curl localhost:8080 >/dev/null 2>&1",
"interval" : "3s"
},
"name" : "first-service",
"tags" : [
"dev"
],
"port" : 8081
}
}
增加了check,表示間隔3秒訪問一次localhost:8080,如果成功表示service
為passing
否則為critical
由於localhost:8080
不能訪問,所以通過web-ui
發現狀態為critical
,如果本地啟動一個tomcat監聽8080
埠,則服務狀態為passing
java實現
package com.lkl.consul;
import com.google.common.net.HostAndPort;
import com.orbitz.consul.AgentClient;
import com.orbitz.consul.Consul;
import com.orbitz.consul.HealthClient;
import org.junit.Test;
import java.net.URI;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
/**
* 健康檢查
* Created by liaokailin on 16/6/2.
*/
public class HealthCheck {
@Test
public void doHealthCheck() throws Exception {
Consul consul = Consul.builder().withHostAndPort(HostAndPort.fromParts("127.0.0.1", 8500)).build();
AgentClient agentClient = consul.agentClient();
String serviceName = "health-check-service";
String serviceTag = "test";
agentClient.register(9090, HostAndPort.fromParts("127.0.0.1", 8080), 3l, serviceName, "service-id", serviceTag);
TimeUnit.MINUTES.sleep(2);
}
}
這種方式為client agent
間隔3秒會自動ping http://localhost:8080來進行將康檢查,還可以通過agentClient.pass()
讓service
主動
向agent
報告健康
key-value
命令方式
輸入key
curl -X PUT -d 'test' http://localhost:8500/v1/kv/web/key1
查詢所有值
curl http://localhost:8500/v1/kv/?recurse
查詢指定key對應值
curl http://localhost:8500/v1/kv/web/key1
java方式
package com.lkl.consul;
import com.google.common.base.Optional;
import com.google.common.net.HostAndPort;
import com.orbitz.consul.Consul;
import com.orbitz.consul.KeyValueClient;
import com.orbitz.consul.model.kv.Value;
import org.apache.commons.codec.binary.Base64;
import org.junit.Test;
import sun.misc.BASE64Decoder;
import java.util.List;
import java.util.Set;
/**
* key-value操作
* Created by liaokailin on 16/6/3.
*/
public class KeyValues {
/**
* 新增一個key
*/
@Test
public void pubKey() {
Consul consul = Consul.builder().withHostAndPort(HostAndPort.fromParts("127.0.0.1", 8500)).build();
KeyValueClient keyValueClient = consul.keyValueClient();
keyValueClient.putValue("/web/key3","test");
}
/**
* 按key獲取值
*/
@Test
public void getValueByKey(){
Consul consul = Consul.builder().withHostAndPort(HostAndPort.fromParts("127.0.0.1", 8500)).build();
KeyValueClient keyValueClient = consul.keyValueClient();
Optional<String> result = keyValueClient.getValueAsString("/web/key3");
System.out.println(result.get());
}
/**
* 獲取values
*/
@Test
public void getValues(){
Consul consul = Consul.builder().withHostAndPort(HostAndPort.fromParts("127.0.0.1", 8500)).build();
KeyValueClient keyValueClient = consul.keyValueClient();
List<Value> values = keyValueClient.getValues("/web");
for(Value value : values){
System.out.println(value.getKey()+","+ new String(Base64.decodeBase64(value.getValue().get())) );
}
}
}
consul架構
相關術語
Agent
長期執行在後臺的守護程序,通過consul agent
執行,不論是客戶端還是服務端都是一個agentClient
轉發所有的RPC到服務端的agent,client
是相對無狀態的,主要與service以及通過區域網的gossip pool
與server通訊,對資源消耗少Server
負責引數Raft
選舉、維護叢集狀態、響應RPC、通過廣域網gossip pool
與其他資料中心通訊Datacenter
資料中心,可以理解為一個私有的、低延遲的網路環境Consensus
一致性,叢集狀態下多個伺服器在狀態上達成一致,為了以容錯方式達成一致,一般有超過半數一致則可以認為整體一致
consul使用Raft
實現一致性,進行leader選舉,在consul中的使用bootstrap
時,可以進行自選,其他server加入進來後bootstrap
就可以取消Gossip
consul通過Serf
提供基於Gossip協議通訊,Serf是去中心化的服務發現和編制的解決方案,節點失敗偵測與發現,具有容錯、輕量、高可用的特點。LAN Gossip
同一網路或者資料中心節點通訊協議WAN Gossip
不同網路或不同資料中心中server通訊協議
圖表說明
利用官網給出的圖片
通過以上圖片可以發現:
1.同一資料中心Client
與Server
通過LAN Gossip
通訊,service
與server
不會直接通訊,其通訊流程為service
–>client
–>server
2.server
通過Raft
演算法進行選舉
3.不同資料中心通過WAN Gossip
通訊
ok ~ it’s work ! more about is here
歡迎關注,您的肯定是對我最大的支援
相關推薦
consul(第二篇)consul Ops
consul Ops consul client 通過下面的命令可以建立consul client nohup consul agent -data-dir /tmp/consul -node=liaokailin -bind=192.168.21
consul(第一篇)consul 入門
consul 入門 consul是什麼 consul包含多個元件,從整體上看可以理解為一個服務發現、配置的工具,包含一下幾個特點: 服務發現(Service Discovery):客戶端通過consul提供服務,其他客戶端可以通過consul利用dn
Prometheus的服務發現之Consul介紹篇一
一、引言 Prometheus是一套開源的系統監控報警框架,此前對Prometheus有過介紹Prometheus的介紹與實踐,Prometheus會去各個監控節點Pull資料。現在存在一個問題,如何讓Prometheus去新增的監控節點Pull資料。 二、Prometheus的服務
實例講解webpack的基本使用第二篇
文件的 分享 fig .com size 如何 try 基本 bpa 這一篇來講解一下如何設置webpack的配置文件webpack.config.js 我們新建一個webpack-demo的項目文件夾,然後安裝webpack 執行如下命令 在項目文件夾下,
關於註解Annotation第二篇
ace public not turn http 通過反射 cnblogs interface 這樣的 舉個例子來看一看註解定義類在語法樹中用哪些語法節點來表示以及如何組織的。 @Retention(RetentionPolicy.RUNTIME) // 註解會在cl
RabbitMQ第二篇:java簡單的實現RabbitMQ
ech pre cer wait clas comm amqp cti 一次 前言:在這裏我將用java來簡單的實現rabbitMQ。下面我們帶著下面問題來一步步的了解和學習rabbitMQ。 1:如果消費者連接中斷,這期間我們應該怎麽辦 2:如何做到負載均衡 3:如何有效
第二篇:使用Spark對MovieLens的特征進行提取
src 參考 創建過程 程序 單單 關於 font 我們 eve 前言 在對數據進行了初步探索後,想必讀者對MovieLens數據集有了感性認識。而在數據挖掘/推薦引擎運行前,往往需要對數據預處理。預處理的重要性不言而喻,甚至比數據挖掘/推薦系統本身還重要。
第二篇:數據可視化 - 基本API
數據挖掘 idt 示例 iyu 大小 blue .com sof 個性化 前言 數據可視化是數據挖掘非常重要的一個環節,它不單在查閱了解數據環節使用到,在整個數據挖掘的流程中都會使用到。 因為數據可視化不單可以形象地展示數據,讓你對數據有更好
Neo4j 第二篇:圖形數據庫
this 擁有 個數 bms 關系型 基本概念 dex pan unique 在深入學習圖形數據庫之前,首先理解屬性圖的基本概念。一個屬性圖是由頂點(Vertex),邊(Edge),標簽(Lable),關系類型和屬性(Property)組成的有向圖。頂點也稱作節點(Node
我的微信小程序第二篇
公眾平臺 說了 支付 痛苦 平臺 .html tps 初創企業 應該 在上一篇《我的微信小程序第一篇(入門)》中,很多人問我什麽是微信小程序,在這裏我要說一下這個是我的失誤啦,我默認大家都知道微信小程序,其實可能行內人士都知道小程序,好多非行內朋友可能平時不太關註這些,所謂
Shell第二篇:正則表達式和文本處理工具
chan 金字塔 文本 lar 乘法 res 每次 比較 而是 一 什麽是正則 正則就是用一些具有特殊含義的符號組合到一起(稱為正則表達式)來描述字符或者字符串的方法。或者說:正則就是用來描述一類事物的規則。 生活中處處都是正則: 比如我們描述:4條腿
【滲透課程】第二篇下-HTTP協議的請求與響應深度剖析
語記 空行 服務器端 oid 原因 str 負載 log 引用 【滲透課程】第二篇下-HTTP協議的請求與響應深度剖析 HTTP1.1目前支持以下7種請求方法: 常見的MIME類型如下: 第一個數字有五種可能的取值: 目錄 什麽是請求方法?什麽是請求頭?
【滲透課程】第二篇上-http請求協議的簡單描述
html 文章 ont tp服務器 交互 .exe 打開 路徑 什麽 HTTP協議剖析 什麽是HTTP協議?如何發起請求?我認為這樣講大家能夠理解: 瀏覽器訪問網站也是http請求的一個過程。當你打開瀏覽器,訪問一個URL (協議://服務器IP:端口/路徑/文件)的時候,
英漢翻譯 第二篇
bsp 文章 industry 整形 com 美容 cts man product 政府官員 a government official 贊成 approve 我不贊成整形手術 I don‘t approve of comsmetic surgery. 美容的 化
什麽是反向傳播(第二篇)
圖片 ont epm 什麽是 put 回來 課程 之前 idea 作者韓小雨 類比幾個人站成一排,第一個人看一幅畫(輸入數據),描述給第二個人(隱層)……依此類推,到最後一個人(輸出)的時候,畫出來的畫肯定不能看了(誤差較大)。 反向傳播就是,把畫拿給最後一個人看(求取
Linux賬號管理之第二篇:對用戶組進行管理
mov 切換 屬於 tom blog 用戶組 第二篇 roo clas 1、查看用戶的有效組群 groups 用戶名 註意:查看出來的結果可能有多個;第一個為主組群,後面的都是副組群 2、添加和刪除組群 添加一個組:groupadd 組
Linux實戰第二篇:Centos6和Centos7密碼破解實戰
root恢復個人筆記分享(在線閱讀):http://note.youdao.com/noteshare?id=744d026219e72c69e606f115bd333ddcPDF版本下載請在附近中下載本文出自 “人才雞雞” 博客,請務必保留此出處http://6575793.blog.51cto.com/6
小學期心得第二篇
頁面 查詢 調試 小學 保存數據 錯誤 save ont 實現 第四第五第六天 在這幾天的學習裏,我還是出現了很多的問題,不過靠著同學和老師的幫助,都得以順利解決。 我們一起配置了一系列接口,實現類,xml,數據庫映射文件 要使用MYSQL就要先建好表格,在
硬件——nrf51822第二篇,如何設置keil用來下載程序
硬件 電子 keil .com logs alt .cn cnblogs image 轉自電子發燒友論壇 硬件——nrf51822第二篇,如何設置keil用來下載程序
python入門第二篇
indent 正序 space pla pac 列表 總結 form spa python 有切片和叠片的兩種操作 支持list 和tuple兩種數據類型 list: 第一種操作[0:1] :以第0個索引開始,到索引1 結束, [:] 什麽都沒有寫,則是從0開始。 第二