1. 程式人生 > >Spring Cloud 系列之 Consul 配置中心

Spring Cloud 系列之 Consul 配置中心

前面我們已經學習過 Spring Cloud Config 了:

  • Spring Cloud 系列之 Config 配置中心(一)
  • Spring Cloud 系列之 Config 配置中心(二)
  • Spring Cloud 系列之 Config 配置中心(三)

它提供了配置中心的功能,但是需要配合 git、svn 或外部儲存(例如各種資料庫),且需要配合 Spring Cloud Bus 《Spring Cloud 系列之 Bus 訊息匯流排》實現配置重新整理。

前面的課程中我們也學習了 Spring Cloud Consul,當時講解了它作為註冊中心的使用方案,且作為 Spring Cloud 官方推薦替換 Eureka 註冊中心的方案。既然使用了 Consul,就可以使用 Consul 提供的配置中心功能,並且不需要額外的 git 、svn、資料庫等配合,且無需配合 Bus 即可實現配置重新整理。

Spring Cloud 官方宣告 Consul 可以作為 Spring Cloud Config 配置中心的替代方案。

官方文件:https://cloud.spring.io/spring-cloud-static/spring-cloud-consul/2.2.2.RELEASE/reference/html/#spring-cloud-consul-config

關於 Consul 註冊中心部分我們已經學習過,未學習的同學請參考之前的課程進行學習。今天我們主要講解 Consul 作為配置中心如何使用。

Consul 介紹

Consul 是 HashiCorp 公司推出的開源工具,用於實現分散式系統的服務發現與配置。與其它分散式服務註冊與發現的方案,Consul 的方案更“一站式”,內建了服務註冊與發現框架、分散式一致性協議實現、健康檢查、Key/Value 儲存(配置中心)

、多資料中心方案,不再需要依賴其它工具(比如 ZooKeeper 等),使用起來也較為簡單。

Consul 使用 Go 語言編寫,因此具有天然可移植性(支援Linux、Windows 和 Mac OS);安裝包僅包含一個可執行檔案,方便部署,與 Docker 等輕量級容器可無縫配合。

Consul 特性

  • Raft 演算法

  • 服務發現

  • 健康檢查

  • Key/Value 儲存(配置中心)

  • 多資料中心

  • 支援 http 和 dns 協議介面

  • 官方提供 Web 管理介面

Consul 安裝

點選連結觀看:Consul 安裝視訊(獲取更多請關注公眾號「哈嘍沃德先生」)

Consul 是用 go 語言編寫的第三方工具需要單獨安裝使用。

下載

訪問 Consul 官網:https://www.consul.io 下載 Consul 的最新版本。

支援多種環境安裝,截圖中只顯示了部分環境。

安裝

單節點和叢集的安裝方式在之前的課程中已經詳細講解過,這裡主要講解 Consul 配置中心的作用,我們在 Windows 安裝一個單節點的 Consul 即可。

下載後的壓縮包中就只有一個 consul.exe 的執行檔案。

cd 到對應的目錄下,使用 cmd 啟動 Consul

# -dev表示開發模式執行
consul agent -dev -client=0.0.0.0

為了方便啟動,也可以在 consul.exe 同級目錄下建立一個指令碼來啟動,指令碼內容如下:

consul agent -dev -client=0.0.0.0
pause

訪問管理後臺:http://localhost:8500/ 看到下圖意味著我們的 Consul 服務啟動成功了。

初始化配置

點選連結觀看:初始化配置資訊視訊(獲取更多請關注公眾號「哈嘍沃德先生」)

建立基本目錄

使用 Consul 作為配置中心,第一步我們先建立目錄,把配置資訊儲存至 Consul。

點選選單 Key/Value 再點選 Create 按鈕。

建立 config/ 基本目錄,可以理解為配置檔案所在的最外層資料夾。

建立應用目錄

點選 config 進入資料夾。

再點選 Create 按鈕。

建立 orderService/ 應用目錄,儲存對應微服務應用的 default 環境配置資訊。

多環境應用目錄

假設我們的專案有多環境:defaulttestdevprod,在 config 目錄下建立多環境目錄。

  • orderService 資料夾對應 default 環境
  • orderService-test 資料夾對應 test 環境
  • orderService-dev 資料夾對應 dev 環境
  • orderService-prod 資料夾對應 prod 環境

初始化配置

dev 環境為例,點選 orderService-dev 進入資料夾。

點選 Create 按鈕準備建立 Key/Value 配置資訊。

填寫 Key:orderServiceConfig

填寫 Value:

name: order-service-dev
mysql:
  host: localhost
  port: 3006
  username: root
  password: root

假設以上內容為訂單微服務的配置資訊,下面我們通過案例來載入 Consul 配置中心中的配置資訊。

環境準備

consul-config-demo 聚合工程。SpringBoot 2.2.4.RELEASESpring Cloud Hoxton.SR1

  • order-service:訂單服務
  • order-service02:訂單服務

實踐案例

點選連結觀看:Consul 配置中心實踐視訊(獲取更多請關注公眾號「哈嘍沃德先生」)

新增依賴

需要從 Consul 獲取配置資訊的專案主要新增 spring-cloud-starter-consul-config 依賴,完整依賴如下:

order-serviceorder-service02 依賴一致。

<?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.example</groupId>
    <artifactId>order-service</artifactId>
    <version>1.0-SNAPSHOT</version>

    <!-- 繼承父依賴 -->
    <parent>
        <groupId>com.example</groupId>
        <artifactId>consul-config-demo</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <!-- 專案依賴 -->
    <dependencies>
        <!-- spring boot web 依賴 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- spring boot actuator 依賴 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!-- spring cloud consul discovery 服務發現依賴 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-consul-discovery</artifactId>
        </dependency>
        <!-- spring cloud consul config 配置中心依賴 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-consul-config</artifactId>
        </dependency>

        <!-- spring boot test 依賴 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

</project>

配置檔案

老規矩,配置檔案必須叫 bootstrap.yml 我們除了使用 Consul 配置中心功能之外,把微服務也註冊到 Consul 註冊中心去。order-serviceorder-service02 的配置項中除了埠和註冊例項 id 之外,其餘配置項一致,完整配置如下:

server:
  port: 9090 # 埠

spring:
  application:
    name: order-service # 應用名稱
  profiles:
    active: dev # 指定環境,預設載入 default 環境
  cloud:
    consul:
      # Consul 伺服器地址
      host: localhost
      port: 8500
      # 配置中心相關配置
      config:
        # 是否啟用配置中心,預設值 true 開啟
        enabled: true
        # 設定配置的基本資料夾,預設值 config 可以理解為配置檔案所在的最外層資料夾
        prefix: config
        # 設定應用的資料夾名稱,預設值 application 一般建議設定為微服務應用名稱
        default-context: orderService
        # 配置環境分隔符,預設值 "," 和 default-context 配置項搭配
        # 例如應用 orderService 分別有環境 default、dev、test、prod
        # 只需在 config 資料夾下建立 orderService、orderService-dev、orderService-test、orderService-prod 資料夾即可
        profile-separator: '-'
        # 指定配置格式為 yaml
        format: YAML
        # Consul 的 Key/Values 中的 Key,Value 對應整個配置檔案
        data-key: orderServiceConfig
        # 以上配置可以理解為:載入 config/orderService/ 資料夾下 Key 為 orderServiceConfig 的 Value 對應的配置資訊
        watch:
          # 是否開啟自動重新整理,預設值 true 開啟
          enabled: true
          # 重新整理頻率,單位:毫秒,預設值 1000
          delay: 1000
      # 服務發現相關配置
      discovery:
        register: true                                # 是否需要註冊
        instance-id: ${spring.application.name}-01    # 註冊例項 id(必須唯一)
        service-name: ${spring.application.name}      # 服務名稱
        port: ${server.port}                          # 服務埠
        prefer-ip-address: true                       # 是否使用 ip 地址註冊
        ip-address: ${spring.cloud.client.ip-address} # 服務請求 ip

配置檔案實體類

order-serviceorder-service02 實體類程式碼一致。

package com.example.config;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "mysql")
public class MySQLProperties {

    private String host;
    private Integer port;
    private String username;
    private String password;

    public String getHost() {
        return host;
    }

    public void setHost(String host) {
        this.host = host;
    }

    public Integer getPort() {
        return port;
    }

    public void setPort(Integer port) {
        this.port = port;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

}

控制層

order-serviceorder-service02 控制層程式碼一致。

注意需要新增 @RefreshScope 註解用於重新重新整理作用域實現屬性值自動重新整理。

package com.example.controller;

import com.example.config.MySQLProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RefreshScope
@RestController
public class ConfigController {

    @Autowired
    private MySQLProperties mySQLProperties;

    @Value("${name}")
    private String name;

    @GetMapping("/name")
    public String getName() {
        return name;
    }

    @GetMapping("/mysql")
    public MySQLProperties getMySQLProperties() {
        return mySQLProperties;
    }

}

啟動類

order-serviceorder-service02 啟動類程式碼一致。

package com.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class OrderServiceApplication {

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

}

測試

修改配置資訊前

訪問:http://localhost:9090/name 結果如下:

訪問:http://localhost:9090/mysql 結果如下:

修改配置資訊

修改 Consul 配置中心 orderService-dev 環境的配置資訊為:

name: order-service-dev-2.0
mysql:
  host: localhost
  port: 3006
  username: root123
  password: root123

修改配置資訊後

控制檯列印資訊如下:

[TaskScheduler-1] b.c.PropertySourceBootstrapConfiguration : Located property source: [BootstrapPropertySource {name='bootstrapProperties-config/order-service-dev/'}, BootstrapPropertySource {name='bootstrapProperties-config/order-service/'}, BootstrapPropertySource {name='bootstrapProperties-config/orderService-dev/'}, BootstrapPropertySource {name='bootstrapProperties-config/orderService/'}]
[TaskScheduler-1] o.s.boot.SpringApplication               : The following profiles are active: dev
[TaskScheduler-1] o.s.boot.SpringApplication               : Started application in 3.748 seconds (JVM running for 142.28)
[TaskScheduler-1] o.s.c.e.event.RefreshEventListener       : Refresh keys changed: [name, mysql.password, mysql.username]

Consul 使用 Spring 定時任務 Spring TaskScheduler來監聽配置檔案的更新。

預設情況下,它是一個定時任務執行緒池 ThreadPoolTaskScheduler,其poolSize值為

相關推薦

Spring Cloud 系列 Consul 配置中心

前面我們已經學習過 Spring Cloud Config 了: Spring Cloud 系列之 Config 配置中心(一)Spring Cloud 系列之 Config 配置中心(二)Spring Cloud 系列之 Config 配置中心(三) 它提供了配置中心的功能,但是需要配合 git、svn

Spring Cloud 系列 Config 配置中心(一)

## 服務配置現狀      配置檔案是我們再熟悉不過的,在微服務系統中,每個微服務不僅僅只有程式碼,還需要**連線其他資源**,例如資料庫的配置或功能性的開關 MySQL、Redis 、Security 等相關的配置。除了專案執行的基礎配置之外,還有一些配置是與我們業務有關係的,比如說七牛儲存、簡訊和郵

Spring Cloud 系列 Config 配置中心(二)

本篇文章為系列文章,未讀第一集的同學請猛戳這裡:Spring Cloud 系列之 Config 配置中心(一) 本篇文章講解 Config 如何實現配置中心自動重新整理。 配置中心自動重新整理 點選連結觀看:配置中心自動重新整理視訊(獲取更多請關注公眾號「哈嘍沃德先生」) Spring Cloud Con

Spring Cloud 系列 Config 配置中心(三)

本篇文章為系列文章,未讀前幾集的同學請猛戳這裡: Spring Cloud 系列之 Config 配置中心(一)Spring Cloud 系列之 Config 配置中心(二) 本篇文章講解 Config 如何實現配置中心加解密,配置中心使用者安全認證。 配置中心加解密 考慮這樣一個問題:所有的配置檔案都

Spring Cloud 系列 Apollo 配置中心(一)

背景 隨著程式功能的日益複雜,程式的配置日益增多:各種功能的開關、引數的配置、伺服器的地址等等。 對程式配置的期望值也越來越高:配置修改後實時生效,灰度釋出,分環境、分叢集管理配置,完善的許可權、稽核機制等等。 在這樣的大環境下,傳統的通過配置檔案、資料庫等方式已經越來越無法滿足開發人員對配置管理

Spring Cloud 系列 Apollo 配置中心(二)

本篇文章為系列文章,未讀第一集的同學請猛戳這裡:Spring Cloud 系列之 Apollo 配置中心(一) 本篇文章講解 Apollo 部門管理、使用者管理、配置管理、叢集管理。 點選連結觀看:Apollo 部門管理、使用者管理、配置管理、叢集管理視訊(獲取更多請關注公眾號「哈嘍沃德先生」) 部門及使

Spring Cloud 系列 Apollo 配置中心(四)

本篇文章為系列文章,未讀前幾集的同學請猛戳這裡: Spring Cloud 系列之 Apollo 配置中心(一)Spring Cloud 系列之 Apollo 配置中心(二)Spring Cloud 系列之 Apollo 配置中心(三) 本篇文章講解 Apollo 高可用環境搭建,灰度釋出,教大家搭建企業中

spring cloud系列教程(13)---配置中心初步

給大家推薦個靠譜的公眾號程式設計師探索之路,大家一起加油 ​  1.微服務面臨的問題,配置檔案 微服務意味著要將單體應用中的業務拆分成一個個子服務,每個子服務的粒度相對較小,因此係統中會出現大量的服務。由於每個服務都需要必要的配置資訊才能執行,所以一套集中式的,動態的配置管理設

Spring Cloud 系列 ZooKeeper 註冊中心

## 什麼是註冊中心      服務註冊中心是服務實現服務化管理的核心元件,類似於目錄服務的作用,主要用來儲存服務資訊,譬如提供者 url 串、路由資訊等。服務註冊中心是微服務架構中最基礎的設施之一。   註冊中心可以說是微服務架構中的“通訊錄”,它記錄了服務和服務地址的對映關係。在分散式架構中,服務會

Spring Cloud 系列 Alibaba Nacos 配置中心

## Nacos 介紹    ![](https://user-gold-cdn.xitu.io/2020/6/16/172bb81969149073?w=2001&h=391&f=png&s=35417 " ")      Nacos 是 Alibaba 公司推出的開源工具,用於實現分散式系統的服務

SpringCloud實戰初級入門(三)— spring cloud config搭建git配置中心

目錄 1.環境介紹 2.配置中心 2.1 建立工程 2.2 修改配置檔案 2.3 在github中加入配置檔案 2.3 修改啟動檔案 3. 訪問配置中心 1.環境介紹 上一篇文章中,我們介紹瞭如何利用eureka註冊中心釋出服務以及呼叫服務

Spring Cloud 系列 Alibaba Nacos 註冊中心(一)

前言 從本章節開始,我們學習 Spring Cloud Alibaba 相關微服務元件。 Spring Cloud Alibaba 介紹 Spring Cloud Alibaba 致力於提供微服務開發的一站式解決方案。此專案包含開發分散式應用微服務的必需元件,方便開發者通過 Spring Cloud

Spring Cloud實踐集中配置Spring-config

serve 啟動 gap rop project 自己的 HA sna tst 將一個系統中各個應用的配置文件集中起來,方便管理。 import org.springframework.boot.SpringApplication; import org.spri

Spring Cloud 入門教程 - 搭建配置中心服務

Spring spring boog spring cloud 簡介 Spring Cloud 提供了一個部署微服務的平臺,包括了微服務中常見的組件:配置中心服務, API網關,斷路器,服務註冊與發現,分布式追溯,OAuth2,消費者驅動合約等。我們不必先知道每個組件有什麽作用,隨著教程的深入,我

spring cloud(五、配置中心

在分散式系統中,由於服務數量巨多,為了方便服務配置檔案統一管理,實時更新,所以需要分散式配置中心元件。在Spring Cloud中,有分散式配置中心元件spring cloud config ,它支援配置服務放在配置服務的記憶體中(即本地),也支援放在遠端Git倉庫中。 一、設定一個配置中心(e

Spring Cloud Config + Spring Cloud Bus + kafka實現配置中心配置動態更新

一、架構圖 當在 Git 倉庫中某個應用配置檔案中的引數更新後,只需要通過 POST方法訪問 config Server 的 /actuator/bus-refresh 介面,就可以讓所以的微服務節點更新配置。 在我們的 DEMO 中有一個 Config Server

Spring Cloud(四)配置中心Config

在分散式系統中,由於服務數量巨多,為了方便服務配置檔案統一管理,實時更新,所以需要分散式配置中心元件。在Spring Cloud中,有分散式配置中心元件spring cloud config ,它支援配置服務放在配置服務的記憶體中(即本地),也支援放在遠端Git

Spring Cloud入門:分散式配置中心Spring Cloud Config)

文章例項使用的Spring Cloud版本為Finchley.SR1,Spring Boot版本為2.0.4。 1 Spring Cloud Config Spring Cloud Config是Spring Cloud團隊建立的一個全新專案,用來為分散式系統中的基礎設

Spring Cloud學習筆記(十)-配置中心Config元件從GitHub讀取配置檔案

說明:本文僅作為本人學習<<深入理解Spring Cloud與微服務構建>>一書的學習筆記,所有程式碼案例及文字描述均參考該書,不足之處,請留言指正,不勝感激. 一.為什麼要使用Config元件?   我覺得主要有兩點,方便配置統一

Spring Cloud config搭建分散式配置中心

通常情況下,我們將配置檔案放在各自的服務中,這樣有個缺點,就是每次修改,要重啟服務。如今微服務這麼流行的趨勢下,一個大專案下會有幾十甚至上百上千個微服務組成。這時候就需要一個統一配置管理了。Spring Cloud config 就很好的解決了這一問題。下圖是Config實現