天天看點

Consul 的安裝與基本使用

  • 什麼是 Consul

    ​ Consul是一種服務網格解決方案,提供具有服務發現,配置和分段功能的全功能控制平面。這些功能中的每一個都可以根據需要單獨使用,也可以一起使用以建構全服務網格。Consul需要資料平面并支援代理和本機內建模型。Consul附帶一個簡單的内置代理,是以一切都可以開箱即用,但也支援第三方代理內建,如Envoy

  • Consul的主要特點
  • 服務發現:Consul 的客戶可以注冊服務,例如

    api

    mysql

    ,并且其他客戶可以使用Consul來發現給定服務的提供者。使用 DNS 或 HTTP,應用程式可以輕松找到它們所依賴的服務。
  • 運作狀況檢查:Consul 用戶端可以提供任意數量的運作狀況檢查,這些檢查與給定服務(“是 Web 伺服器傳回 200 OK”)或本地節點(“記憶體使用率低于 90%”)相關聯。營運商可以使用此資訊來監控群集運作狀況,服務發現元件使用該資訊将流量路由遠離不健康的主機。
  • KV 商店:應用程式可以将 Consul 的分層鍵/值存儲用于任何目的,包括動态配置,功能标記,協調,上司者選舉等。簡單的 HTTP API 使其易于使用。
  • 安全服務通信:Consul可以為服務生成和分發 TLS 證書,以建立互相的 TLS 連接配接。 意圖 可用于定義允許哪些服務進行通信。可以使用可以實時更改的意圖輕松管理服務分段,而不是使用複雜的網絡拓撲和靜态防火牆規則。
  • 多資料中心:Consul 支援多個資料中心。這意味着 Consul 的使用者不必擔心建構額外的抽象層以擴充到多個區域。

Consul 是一個分布式,高度可用的系統。本節将介紹基礎知識,故意省略一些不必要的細節,以便您快速了解Consul的工作原理。有關更多詳細資訊,請參閱 深入的體系結構概述

1、安裝

  • 通過官網位址下載下傳對應的安裝包
  • 以 Linux 的為例,将安裝包解壓在任意喜歡的目錄之中如: /usr/local

    在 /usr/local 建立 consul 目錄

    将下載下傳好的壓縮包移動值該目錄解壓: unzip consul_1.4.4_linux_amd64.zip

    為了友善起見,将得到的 consul 指令檔案拷貝一份到 /usr/local/bin 目錄之中即可全局使用

    cp ./consul /usr/local/bin/ 
               
    如若無誤在任意位置輸入: consul version 即可看到對應的 consul 的版本資訊
    Consul v1.4.4
    Protocol 2 spoken by default, understands 2 to 3 (agent will automatically use protocol >2 when speaking to compatible agents)
               

2、啟動

  • 基本指令(前台啟動)
consul agent -server -bind=192.168.xxx.134 -client=0.0.0.0 -bootstrap-expect=1 -data-dir=/usr/data/consul_data -node=server1
           

**-server ** 表示以服務端身份啟動

**-bind ** 強制綁定到指定 IP

-client 指定用戶端通路的 IP (consul 有豐富的 api 接口,這裡的用戶端指浏覽器或調用方),0.0.0.0 表示不限制用戶端 IP

-bootstrap-expect=3 表示 server 叢集最低節點為 3,低于這個值将工作不正常(注:類似zookeeper一樣,通常叢集數為奇數,友善選舉,consul采用的是raft算法)

-data-dir 表示指定資料的存放目錄(該目錄必須已存在)

-node 表示節點在 web ui 中顯示的名稱

啟動成功後,不要關閉終端視窗,在浏覽器之中通路:http://192.168.xxx.134:8500/ ,如若無誤将會得到:

Consul Agent
           
  • 背景啟動
nohup consul agent -server -bind=192.168.xxx.134 -client=0.0.0.0 -bootstrap-expect=1 -data-dir=/usr/data/consul_data -node=server1  > /dev/null 2>&1 &
           

3、啟動 client 端

  • 與 Server 端類似,去除掉 -server 即可
nohup consul agent -bind=192.168.xxx.134 -http-port=8500 -dns-port=8600 -client=0.0.0.0 -data-dir=/usr/data/consul_data/ -node=client1  > /dev/null 2>&1 &
           
  • 指定 http 與 dns 端口号
nohup consul agent -bind=192.168.xxx.134 -http-port=7500 -dns-port=7600 -client=0.0.0.0 -data-dir=/usr/data/consul_data/ -node=client1  > /dev/null 2>&1 &
           

4、帶 UI 啟動

nohup consul agent -server -bind=192.168.xxx.134 -client=0.0.0.0 -bootstrap-expect=1 -data-dir=/usr/data/consul_data -node=server1 -ui > /dev/null 2>&1 &
           

5、搭建叢集

搭建多個節點,在多個節點中啟動 Consul ,通過 join 指令關聯示例

例如: 将目前節點添加到 192.168.xxx.131 節點之中

consul join 192.168.xxx.131
           

成功後,會輸出:Successfully joined cluster by contacting 1 node

檢視叢集:consul members

Node     Address               Status  Type    Build  Protocol  DC   Segment
server1  192.168.xxx.134:8301  alive   server  1.4.4  2         dc1  <all>
server2  192.168.xxx.131:8301  alive   server  1.4.4  2         dc1  <all>
           

6、服務注冊/發現/登出

目前在 services 裡,除了 consul 外,還沒有其他服務,我們可以通過 service api 來進行注冊,可以通過 postman、Insomnia 等 rest api工具或者 curl 指令,向 服務注冊位址 進行注冊,以 PUT 方式送出、Content-Type 為 application/json 格式,參數設定為以下 JSON 内容

{
     "ID": "elasticsearchID",
      "Service": "elasticsearch",
     "Name":"my-service-name",
      "Tags": [
                "mytags=1"
            ],
      "Meta": {
          "elasticsearch_version": "4.0"
      },
      "Port": 8080,
      "Address": "192.168.xxx.1",
      "EnableTagOverride": false,
      "Weights": {
          "Passing": 10,
          "Warning": 1
      }
}
           

往 192.168.xxx.131 這台機器的注冊一個名為 my-service-name,ID 為 elasticsearchID的服務

具體 API 解釋與更多使用參考 官網

  • 服務發現,檢視已注冊成功的服務

    直接通過浏覽器請求: http://192.168.xxx.131:8500/v1/agent/services 如若以上内容注冊成功可擷取到以下結果

    {
      "elasticsearchID": {
        "ID": "elasticsearchID",
        "Service": "my-service-name",
        "Tags": [
          "mytags=1"
        ],
        "Meta": {
          "elasticsearch_version": "4.0"
        },
        "Port": 8080,
        "Address": "192.168.xxx.1",
        "Weights": {
          "Passing": 10,
          "Warning": 1
        },
        "EnableTagOverride": false
      }
    }
               
  • 服務登出

    通過 PUT 請求方式,調用: http://192.168.xxx.131:8500/v1/agent/service/deregister/elasticsearchID

    即登出了elasticsearchID 這個服務資訊,可調用 http://192.168.xxx.131:8500/v1/agent/services 檢視該服務是否已被登出

7、開發者模式

​ 前面的幾步操作在開發的過程中操作起來的步驟相對繁瑣,是以 consul 也為開發人員推出了開發者模式(即 dev) 使用方式及其簡單,輸入如下指令即可:

consul agent -dev
           

開發模式,自帶了 web ui,當然此種方式也預設 IP 為: 127.0.0.1 ,是以直接輸入:http://127.0.0.1:8500 通路 UI 頁面

8、在 Spring Cloud 中使用 Consul

​ 建立一個 Spring Cloud 工程「microcloud」,在該工程中使用 Consul

  • 建立「microcloud」,配置父 pom.xml 檔案
    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
      <groupId>com.microcloud</groupId>
      <artifactId>microcloud</artifactId>
      <packaging>pom</packaging>
      <version>1.0-SNAPSHOT</version>
      <modules>
        <module>microcloud-consul-8501</module>
      </modules>
    
    <name>microcloud</name>
    
    <!-- FIXME change it to the project's website -->
    
    <url>http://www.example.com</url>
    
    
    <properties>
    
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    
    <maven.compiler.source>1.8</maven.compiler.source>
    
    <maven.compiler.target>1.8</maven.compiler.target>
    
    <jdk.version>1.8</jdk.version>
    
    </properties>
    
    
    <dependencyManagement>
    
    <dependencies>
    
    <!--cloud父pom引用-->
    
    <dependency>
    
    <groupId>org.springframework.cloud</groupId>
    
    <artifactId>spring-cloud-dependencies</artifactId>
    
    <version>Greenwich.RELEASE</version>
    
    <type>pom</type>
    
    <scope>import</scope>
    
    </dependency>
    
    <!--支援cloud-->
    
    <dependency>
    
    <groupId>org.springframework.boot</groupId>
    
    <artifactId>spring-boot-dependencies</artifactId>
    
    <version>2.1.4.RELEASE</version>
    
    <type>pom</type>
    
    <scope>import</scope>
    
    </dependency>
    
    </dependencies>
    
    </dependencyManagement>
    
    
    <build>
    
    <finalName>microcloud</finalName>
    
    <plugins>
    
    <plugin>
    
    <groupId>org.apache.maven.plugins</groupId>
    
    <artifactId>maven-compiler-plugin</artifactId>
    
    <configuration>
    
    <source>${jdk.version}</source> <!--源碼的JDK版本-->
    
    <target>${jdk.version}</target>
    
    <encoding>${project.build.sourceEncoding}</encoding>
    
    </configuration>
    
    </plugin>
    
    </plugins>
    
           
    <span class="token comment">&lt;!--資源檔案打包管理--&gt;</span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>resources</span><span class="token punctuation">&gt;</span></span>
      <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>resource</span><span class="token punctuation">&gt;</span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>directory</span><span class="token punctuation">&gt;</span></span>src/main/resources<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>directory</span><span class="token punctuation">&gt;</span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>includes</span><span class="token punctuation">&gt;</span></span>
          <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>include</span><span class="token punctuation">&gt;</span></span>**/*.properties<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>include</span><span class="token punctuation">&gt;</span></span>
          <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>include</span><span class="token punctuation">&gt;</span></span>**/*.yml<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>include</span><span class="token punctuation">&gt;</span></span>
          <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>include</span><span class="token punctuation">&gt;</span></span>**/*.xml<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>include</span><span class="token punctuation">&gt;</span></span>
          <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>include</span><span class="token punctuation">&gt;</span></span>**/*.tld<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>include</span><span class="token punctuation">&gt;</span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>includes</span><span class="token punctuation">&gt;</span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>filtering</span><span class="token punctuation">&gt;</span></span>true<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>filtering</span><span class="token punctuation">&gt;</span></span>
      <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>resource</span><span class="token punctuation">&gt;</span></span>
    
      <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>resource</span><span class="token punctuation">&gt;</span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>directory</span><span class="token punctuation">&gt;</span></span>src/main/java<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>directory</span><span class="token punctuation">&gt;</span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>includes</span><span class="token punctuation">&gt;</span></span>
          <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>include</span><span class="token punctuation">&gt;</span></span>**/*.properties<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>include</span><span class="token punctuation">&gt;</span></span>
          <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>include</span><span class="token punctuation">&gt;</span></span>**/*.yml<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>include</span><span class="token punctuation">&gt;</span></span>
          <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>include</span><span class="token punctuation">&gt;</span></span>**/*.xml<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>include</span><span class="token punctuation">&gt;</span></span>
          <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>include</span><span class="token punctuation">&gt;</span></span>**/*.tld<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>include</span><span class="token punctuation">&gt;</span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>includes</span><span class="token punctuation">&gt;</span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>filtering</span><span class="token punctuation">&gt;</span></span>true<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>filtering</span><span class="token punctuation">&gt;</span></span>
      <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>resource</span><span class="token punctuation">&gt;</span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>resources</span><span class="token punctuation">&gt;</span></span>
               
    </build> </project>
  • 建立「microcloud-consul-8501」子產品,配置 pom.xml 檔案
    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <parent>
            <artifactId>microcloud</artifactId>
            <groupId>com.microcloud</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
        <artifactId>microcloud-consul-8501</artifactId>
        <name>microcloud-consul-8501</name>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-jetty</artifactId>
            </dependency>
           
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>dependency</span><span class="token punctuation">&gt;</span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>groupId</span><span class="token punctuation">&gt;</span></span>org.springframework.boot<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>groupId</span><span class="token punctuation">&gt;</span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>artifactId</span><span class="token punctuation">&gt;</span></span>spring-boot-starter-web<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>artifactId</span><span class="token punctuation">&gt;</span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>exclusions</span><span class="token punctuation">&gt;</span></span>
                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>exclusion</span><span class="token punctuation">&gt;</span></span>
                    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>groupId</span><span class="token punctuation">&gt;</span></span>org.springframework.boot<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>groupId</span><span class="token punctuation">&gt;</span></span>
                    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>artifactId</span><span class="token punctuation">&gt;</span></span>spring-boot-starter-tomcat<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>artifactId</span><span class="token punctuation">&gt;</span></span>
                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>exclusion</span><span class="token punctuation">&gt;</span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>exclusions</span><span class="token punctuation">&gt;</span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>dependency</span><span class="token punctuation">&gt;</span></span>
    
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>dependency</span><span class="token punctuation">&gt;</span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>groupId</span><span class="token punctuation">&gt;</span></span>org.springframework.boot<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>groupId</span><span class="token punctuation">&gt;</span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>artifactId</span><span class="token punctuation">&gt;</span></span>spring-boot-starter-test<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>artifactId</span><span class="token punctuation">&gt;</span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>dependency</span><span class="token punctuation">&gt;</span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>dependency</span><span class="token punctuation">&gt;</span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>groupId</span><span class="token punctuation">&gt;</span></span>junit<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>groupId</span><span class="token punctuation">&gt;</span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>artifactId</span><span class="token punctuation">&gt;</span></span>junit<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>artifactId</span><span class="token punctuation">&gt;</span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>scope</span><span class="token punctuation">&gt;</span></span>test<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>scope</span><span class="token punctuation">&gt;</span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>dependency</span><span class="token punctuation">&gt;</span></span>
        <span class="token comment">&lt;!--consul 引用--&gt;</span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>dependency</span><span class="token punctuation">&gt;</span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>groupId</span><span class="token punctuation">&gt;</span></span>org.springframework.cloud<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>groupId</span><span class="token punctuation">&gt;</span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>artifactId</span><span class="token punctuation">&gt;</span></span>spring-cloud-starter-consul-discovery<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>artifactId</span><span class="token punctuation">&gt;</span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>dependency</span><span class="token punctuation">&gt;</span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>dependencies</span><span class="token punctuation">&gt;</span></span>
               
    </project>
  • 【microcloud-consul-8501】在 /src/main/resources 下建立配置檔案 application.yml 配置檔案,增加 Consul 配置
    server:
      port: 8501
    spring:
      cloud:
        consul:
          host: 127.0.0.1
          port: 8500
          discovery:
            tags: version=1.0,author=code
            health-check-path: /info # 為健康檢查的url,由consul定時調用一次判斷服務是否可用
            health-check-interval: 5s # 檢查間隔時間
            instance-id: ${spring.application.name}:prod # 注冊的服務ID
            service-name: ${spring.application.name} # 注冊的服務名稱
            prefer-ip-address: true # 是否使用指定IP位址,預設為 false
            ip-address: 127.0.0.1 # 指定 IP 位址
                  application:
    
    name: microcloud-consul-8501
    
               
  • 【microcloud-consul-8501】配置檢查健康服務類
    package com.microcloud.controller;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    /**
     * @Auther: xxx
     */
    @RestController
    public class ConsulController {
           
    <span class="token annotation punctuation">@GetMapping</span><span class="token punctuation">(</span>value <span class="token operator">=</span> <span class="token string">"/echo"</span><span class="token punctuation">)</span>
    <span class="token keyword">public</span> <span class="token class-name">String</span> <span class="token function">echo</span><span class="token punctuation">(</span><span class="token class-name">String</span> message<span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token keyword">return</span> <span class="token string">"Echo:"</span> <span class="token operator">+</span> message<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    
    <span class="token comment">/**
     * consul 檢查服務方法
     * @return
     */</span>
    <span class="token annotation punctuation">@GetMapping</span><span class="token punctuation">(</span>value <span class="token operator">=</span> <span class="token string">"/info"</span><span class="token punctuation">)</span>
    <span class="token keyword">public</span> <span class="token class-name">String</span> <span class="token function">info</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token keyword">return</span> <span class="token string">"info"</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
               
    }
  • 【microcloud-consul-8501】 啟動類
    package com.microcloud;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    /**
    
               
    • @Auther: xxx */ @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }

  • 啟動,測試

    啟動後可得到類似如下内容,即表示注冊成功,可通過 Consul UI 位址檢視到對應在服務資訊

    Registering service with consul: NewService{id='microcloud-consul-8501-prod', name='microcloud-consul-8501', tags=[version=1.0, author=code, secure=false], address='127.0.0.1', meta=null, port=8501, enableTagOverride=null, check=Check{script='null', interval='5s', ttl='null', http='http://127.0.0.1:8501/info', method='null', header={}, tcp='null', timeout='null', deregisterCriticalServiceAfter='null', tlsSkipVerify=null, status='null'}, checks=null}
               
    通路: http://localhost:8500/v1/agent/services 将擷取如下内容
    {
      "microcloud-consul-8501-prod": {
        "ID": "microcloud-consul-8501-prod",
        "Service": "microcloud-consul-8501",
        "Tags": [
          "version=1.0",
          "author=code",
          "secure=false"
        ],
        "Meta": {},
        "Port": 8501,
        "Address": "127.0.0.1",
        "Weights": {
          "Passing": 1,
          "Warning": 1
        },
        "EnableTagOverride": false
      }
    }
               
  • 【microcloud-customer-80】通過 RestTemplate 調用在 Consul 中注冊的服務,建立并配置 「microcloud-customer-80」 子產品

    配置 pom.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <parent>
            <artifactId>microcloud</artifactId>
            <groupId>com.microcloud</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
        <artifactId>microcloud-customer-80</artifactId>
           
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>name</span><span class="token punctuation">&gt;</span></span>microcloud-customer-80<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>name</span><span class="token punctuation">&gt;</span></span>
    <span class="token comment">&lt;!-- FIXME change it to the project's website --&gt;</span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>url</span><span class="token punctuation">&gt;</span></span>http://www.example.com<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>url</span><span class="token punctuation">&gt;</span></span>
    
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>dependencies</span><span class="token punctuation">&gt;</span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>dependency</span><span class="token punctuation">&gt;</span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>groupId</span><span class="token punctuation">&gt;</span></span>org.springframework.boot<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>groupId</span><span class="token punctuation">&gt;</span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>artifactId</span><span class="token punctuation">&gt;</span></span>spring-boot-starter-jetty<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>artifactId</span><span class="token punctuation">&gt;</span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>dependency</span><span class="token punctuation">&gt;</span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>dependency</span><span class="token punctuation">&gt;</span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>groupId</span><span class="token punctuation">&gt;</span></span>org.springframework.boot<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>groupId</span><span class="token punctuation">&gt;</span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>artifactId</span><span class="token punctuation">&gt;</span></span>spring-boot-starter-web<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>artifactId</span><span class="token punctuation">&gt;</span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>exclusions</span><span class="token punctuation">&gt;</span></span>
                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>exclusion</span><span class="token punctuation">&gt;</span></span>
                    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>groupId</span><span class="token punctuation">&gt;</span></span>org.springframework.boot<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>groupId</span><span class="token punctuation">&gt;</span></span>
                    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>artifactId</span><span class="token punctuation">&gt;</span></span>spring-boot-starter-tomcat<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>artifactId</span><span class="token punctuation">&gt;</span></span>
                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>exclusion</span><span class="token punctuation">&gt;</span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>exclusions</span><span class="token punctuation">&gt;</span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>dependency</span><span class="token punctuation">&gt;</span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>dependency</span><span class="token punctuation">&gt;</span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>groupId</span><span class="token punctuation">&gt;</span></span>org.springframework.boot<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>groupId</span><span class="token punctuation">&gt;</span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>artifactId</span><span class="token punctuation">&gt;</span></span>spring-boot-starter-test<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>artifactId</span><span class="token punctuation">&gt;</span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>dependency</span><span class="token punctuation">&gt;</span></span>
        <span class="token comment">&lt;!--consul 引用--&gt;</span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>dependency</span><span class="token punctuation">&gt;</span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>groupId</span><span class="token punctuation">&gt;</span></span>org.springframework.cloud<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>groupId</span><span class="token punctuation">&gt;</span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>artifactId</span><span class="token punctuation">&gt;</span></span>spring-cloud-starter-consul-discovery<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>artifactId</span><span class="token punctuation">&gt;</span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>dependency</span><span class="token punctuation">&gt;</span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>dependencies</span><span class="token punctuation">&gt;</span></span>
               
    </project>
    建立 Rest 配置模闆 Bean
    package com.microcloud.config;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.client.RestTemplate;
    /**
     * Rest 模闆配置
     * @Auther: xxx
     */
    @Configuration
    public class RestConfig {
        @Bean
        public RestTemplate getRestTemplate() {
            return new RestTemplate();
        }
    }
               
    Rest控制服務
    package com.microcloud.controller;
    
    import org.springframework.cloud.client.ServiceInstance;
    
    import org.springframework.cloud.client.discovery.DiscoveryClient;
    
    import org.springframework.util.CollectionUtils;
    
    import org.springframework.web.bind.annotation.GetMapping;
    
    import org.springframework.web.bind.annotation.RequestMapping;
    
    import org.springframework.web.bind.annotation.RestController;
    
    import org.springframework.web.client.RestTemplate;
    
    import javax.annotation.Resource;
    
    import java.net.URI;
    
    import java.util.List;
    
    /**
    
            
    • @Auther: xxx */ @RestController @RequestMapping(value = "/customer") public class CustomerController { @Resource private RestTemplate restTemplate; @Resource private DiscoveryClient discoveryClient; @GetMapping(value = "/info") public String getInfo(String echo) { String serviceName = "microcloud-consul-8501"; List<ServiceInstance> instances = discoveryClient.getInstances(serviceName); if (!CollectionUtils.isEmpty(instances)) { URI uri = instances.get(0).getUri(); String result = restTemplate.getForObject(uri + "/echo?message=" + echo, String.class); return result; } return ""; } }
    YAMl配置檔案
    server:
      port: 80
    spring:
      application:
        name: customer
      cloud:
        consul:
          host: 127.0.0.1
          port: 8500
               
    服務啟動
    package com.microcloud;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    /**
    
               
    • @Auther: xxx */ @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }

  • 在浏覽器中輸入 http://localhost/customer/info?echo=Hello Consul 觀察傳回結果

    如若無誤會得到

    Echo:Hello Consul
  • 擷取完整源碼

    原文位址:https://www.jianshu.com/p/266f4c8c265c

    繼續閱讀