跟我學SpringCloud | 第七篇:Spring Cloud Config 配置中心高可用和refresh

来源:https://www.cnblogs.com/babycomeon/archive/2019/07/07/11135926.html
-Advertisement-
Play Games

SpringCloud系列教程 | 第七篇:Spring Cloud Config 配置中心高可用和refresh Springboot: 2.1.6.RELEASE SpringCloud: Greenwich.SR1 如無特殊說明,本系列教程全採用以上版本 1. 引言 上一篇我們聊了Spring ...


SpringCloud系列教程 | 第七篇:Spring Cloud Config 配置中心高可用和refresh

Springboot: 2.1.6.RELEASE

SpringCloud: Greenwich.SR1

如無特殊說明,本系列教程全採用以上版本

1. 引言

上一篇我們聊了Spring Cloud Config 配置中心,並且和Github做了集成,我們的Server端是單機版的,任何單機版的服務都只能使用與測試環境或者自己做Demo測試,生產環境嚴禁使用單機服務,配置中心在整個微服務體系中都是及其重要的一個節點,尤其是在DevOps中自動擴容,如果配置中心宕機,那麼所有的自動擴容都會失敗。

所以這一篇我們聊聊配置中心的高可用,說到高可用,在springcloud體系中,是有註冊中心的,那麼,我們的配置中心也是一個服務,可不可以使用Eureka做服務的註冊與發現呢?

答案是肯定的。

2. Serve端

我們將上一篇的Serve端Copy到新的目錄中,增加Eureka-client的依賴,使得Config-Serve可以註冊到Eureka上。

2.1 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>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.springcloud</groupId>
    <artifactId>config-server</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>config-server</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Greenwich.SR1</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

2.2 配置文件application.yml

server:
  port: 8080
spring:
  application:
    name: spring-cloud-config-server
  cloud:
    config:
      server:
        git:
          uri: https://github.com/meteor1993/SpringCloudLearning
          search-paths: chapter6/springcloud-config
          username: username
          password: password
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/

增加eureka的地址配置

2.3 啟動類

啟動類增加@EnableEurekaClient激活對註冊中心的支持

package com.springcloud.configserver;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@SpringBootApplication
@EnableConfigServer
@EnableEurekaClient
public class ConfigServerApplication {

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

}

這樣Server註冊端我們就修改完成了。先啟動Eureka,再啟動Serve,在瀏覽器中訪問http://localhost:8761/,就可以看到我們的Serve端已經註冊到註冊中心了,接下來我們開始改造Client端。

3. Client端

首先還是將上一篇的Client端Copy過來,和Server端一樣,增加Eureka-client的依賴,使得Config-Client可以從註冊中心上發現服務。

3.1 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>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.springcloud</groupId>
    <artifactId>config-client</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>config-client</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Greenwich.SR1</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

3.2 bootstrap.properties

這裡我們需要先清空application.yml,所有的配置全都轉移到bootstrap.properties中。

spring.application.name=spring-cloud-config-client
server.port=8081

spring.cloud.config.name=springcloud-config
spring.cloud.config.profile=dev
spring.cloud.config.label=master
spring.cloud.config.discovery.enabled=true
spring.cloud.config.discovery.serviceId=spring-cloud-config-server

eureka.client.service-url.defaultZone=http://localhost:8761/eureka/

主要是去掉了spring.cloud.config.uri直接指向server端地址的配置,增加了最後的三個配置:

  • spring.cloud.config.discovery.enabled :開啟Config服務發現支持
  • spring.cloud.config.discovery.serviceId :指定server端的name,也就是server端spring.application.name的值
  • eureka.client.serviceUrl.defaultZone :指向註冊中心的地址

3.3 啟動類

啟動類增加@EnableEurekaClient激活對註冊中心的支持

package com.springcloud.configclient;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@SpringBootApplication
@EnableEurekaClient
public class ConfigClientApplication {

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

}

4. 高可用

現在我們來模擬生產環境。

首先,順次啟動Eureka,Server,Client。

在idea啟動兩個config-serve,我們修改idea配置啟動配置,換到8000埠啟動config-serve。

先訪問http://localhost:8761/,可以看到兩個config-serve都正常註冊到註冊中心。

如上圖就可發現會有兩個server端同時提供配置中心的服務,防止某一臺down掉之後影響整個系統的使用。

我們訪問client端的鏈接:http://localhost:8081/hello, 可以看到頁面正常顯示:hello dev update1,刷新幾次,顯示都沒問題,現在我們隨機停掉一個埠的config-serve服務,再去刷新頁面,可以發現,頁面依然可以正常顯示:hello dev update1。

至此,我們高可用的目的已經達到,但是,不知道各位有沒有映像,我們上一篇留了一個坑,服務啟動後,我們修改遠端github上的配置時,這個配置並不會實時被客戶端端所獲取到,下麵我們來聊一聊有關Spring Cloud Config 刷新的問題。

5. refresh

我們的客戶端並不能主動去感知Git或者Svn的配置變化,從而主動獲取最新的配置。那麼,客戶端如何去主動獲取新的配置信息呢?springcloud已經給我們提供瞭解決方案,每個客戶端通過POST方法觸發各自的/refresh。

修改config-client項目已到達可以refresh的功能。

5.1 添加依賴pom.xml

在我們原有的config-client項目的pom.xml的基礎增加新的依賴

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

增加了spring-boot-starter-actuator包,spring-boot-starter-actuator是一套監控的功能,可以監控程式在運行時狀態,其中就包括/refresh的功能。

5.2 開啟更新機制

需要給載入變數的類上面載入@RefreshScope,在客戶端執行/refresh的時候就會更新此類下麵的變數值。

package com.springcloud.configclient.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Author: shiyao.wei
 * @Date: 2019/7/4 16:19
 * @Version: 1.0
 * @Desc:
 */
@RestController
@RefreshScope // 使用該註解的類,會在接到SpringCloud配置中心配置刷新的時候,自動將新的配置更新到該類對應的欄位中。
public class HelloController {

    @Value("${springcloud.hello}")
    private String hello;

    @RequestMapping("/hello")
    public String from() {
        return this.hello;
    }
}

5.3 配置文件bootstrap.properties

spring.application.name=spring-cloud-config-client
server.port=8081

spring.cloud.config.name=springcloud-config
spring.cloud.config.profile=dev
spring.cloud.config.label=master
spring.cloud.config.discovery.enabled=true
spring.cloud.config.discovery.serviceId=spring-cloud-config-server

eureka.client.service-url.defaultZone=http://localhost:8761/eureka/

management.security.enabled=false
management.endpoints.web.exposure.include=*
  • management.security.enabled: springboot 1.5.X 以上預設開通了安全認證,所以需要添加這個配置
  • management.endpoints.web.exposure.include: springboot 2.x 預設只開啟了info、health的訪問,*代表開啟所有訪問

5.4 測試

我們先訪問客戶端的測試連接:http://localhost:8081/hello, 這時,頁面的顯示是:hello dev update1,我們修改github上的信息,修改為:hello dev update,現在訪問http://localhost:8081/hello,得到的信息還是:hello dev update1,現在我們刷新一下客戶端,通過cmd命令行執行:curl -X POST http://localhost:8081/actuator/refresh,可以看到命令行上有顯示:["springcloud.hello","config.client.version"],意味著springcloud.hello這個配置已經刷新,這時,我們再去刷新一下頁面,可以看到,頁面上得到的信息已經變為了:hello dev update,這時我們refresh成功。

每次手動刷新客戶端還是很麻煩,有沒有什麼辦法只要提交代碼就自動調用客戶端來更新呢,github的webhook是一個好的辦法。

6. webhook

WebHook是當某個事件發生時,通過發送http post請求的方式來通知信息接收方。Webhook來監測你在Github.com上的各種事件,最常見的莫過於push事件。如果你設置了一個監測push事件的Webhook,那麼每當你的這個項目有了任何提交,這個Webhook都會被觸發,這時Github就會發送一個HTTP POST請求到你配置好的地址。

如此一來,你就可以通過這種方式去自動完成一些重覆性工作,比如,你可以用Webhook來自動觸發一些持續集成(CI)工具的運作,比如Travis CI;又或者是通過 Webhook 去部署你的線上伺服器。下圖就是github上面的webhook配置。

  • Payload URL: 觸發後回調的URL
  • Content type: 數據格式,兩種一般使用json
  • Secret: 用作給POST的body加密的字元串。採用HMAC演算法
  • events: 觸發的事件列表
events事件類型 描述
push 倉庫有push時觸發。預設事件
create 當有分支或標簽被創建時觸發
delete 當有分支或標簽被刪除時觸發

這樣我們就可以利用hook的機制去觸發客戶端的更新,但是當客戶端越來越多的時候hook支持的已經不夠優雅,另外每次增加客戶端都需要改動hook也是不現實的。其實Spring Cloud給了我們更好解決方案,我們在下一篇接著聊。

示例代碼-Github


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在http://www.w3school.com.cn/ 學習前端知識,利用暑假,自主學習以拓展知識面 DAY 1 HTML 不是一種編程語言,而是一種標記語言 (markup language) 標記語言是一套標記標簽 (markup tag) HTML 使用標記標簽來描述網頁 HTML 文檔描述 ...
  • 這裡總結一下上次使用bootstrap-select的過程中遇到的一些問題。至於bootstrap-select的具體使用方法這裡就不介紹了,網上有很多例子。 地址: 官方插件地址:https://developer.snapappointments.com/bootstrap-select Git ...
  • SpringCloud系列教程 | 第八篇:Spring Cloud Bus 消息匯流排 Springboot: 2.1.6.RELEASE SpringCloud: Greenwich.SR1 如無特殊說明,本系列教程全採用以上版本 前面兩篇文章我們聊了Spring Cloud Config配置中心 ...
  • 課程設計(論文)任務書(文章末尾--源文檔下載) 軟體 學院 軟體工程 專業 2016 -7 班 一、課程設計(論文)題目 綜合課程設計2 二、課程設計(論文)工作自 2018 年 1月 1 日起至 2018 年 1月 12 日止。 三、課程設計(論文) 地點:軟體工程實訓中心一部 四、課程設計(論 ...
  • 課程設計(論文)任務書 軟體 學院 軟體工程 專業 2016 -07 班 一、課程設計(論文)題目 綜合課程設計2 二、課程設計(論文)工作自 2018 年 1月 1 日起至 2018 年 1月 12 日止。 三、課程設計(論文) 地點:軟體工程實訓中心一部 四、課程設計(論文)內容要求: 1.本課 ...
  • Analysis of requirement specification of parking management system PURPOSE OF THE SYSTEM The parking management system refers to the automatic identif ...
  • 慄子回顧 簡單工廠模式: "https://www.cnblogs.com/call me devil/p/10926633.html" 運算類使用工廠方法模式實現 UML圖 代碼實現 工廠介面 運算基礎類 為節省篇章,詳見 "簡單工廠模式" ,此處省略。 以下加減乘除運算類(OperationAd ...
  • 狀態模式重構條件語句 直接上代碼: 客戶端調用: 狀態模式:當一個對象的內部狀態改變時允許改變它的行為。狀態模式主要解決的是當控制一個對象狀態轉換的條件表達式過於複雜時的情況。把狀態的判斷邏輯轉移到表示不同狀態的一系列類當中,可以把複雜的判斷邏輯簡化。 客戶端通過SetAddress(對應狀態模式中 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...