1. 程式人生 > >consul(第二篇)consul Ops

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繫結的ip
  • join 指定加入到的consul serverip地址

consul nodes

通過執行

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,如果成功表示servicepassing 否則為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 執行,不論是客戶端還是服務端都是一個agent

  • Client 轉發所有的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通訊協議

圖表說明

利用官網給出的圖片

consul architecture

通過以上圖片可以發現:

1.同一資料中心ClientServer通過LAN Gossip通訊,serviceserver不會直接通訊,其通訊流程為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開始。 第二