微服務設計(五)---分散式配置中心與spring cloud stream

来源:https://www.cnblogs.com/huyangshu-fs/archive/2022/10/01/13888671.html
-Advertisement-
Play Games

一、Spring Cloud Stream 在實際的企業開發中,消息中間件是至關重要的組件之一。消息中間件主要解決應用解耦,非同步消息,流量削鋒等問題,實現高性能,高可用,可伸縮和最終一致性架構。不同的中間件其實現方式,內部結構是不一樣的。如常見的RabbitMQ和Kafka,由於這兩個消息中間件的架 ...


一、Spring Cloud Stream

  在實際的企業開發中,消息中間件是至關重要的組件之一。消息中間件主要解決應用解耦,非同步消息,流量削鋒等問題,實現高性能,高可用,可伸縮和最終一致性架構。不同的中間件其實現方式,內部結構是不一樣的。如常見的RabbitMQ和Kafka,由於這兩個消息中間件的架構上的不同,像 RabbitMQ有exchange,kafka有Topic,partitions分區,這些中間件的差異性導致實際項目開發造成了一定的困擾,如果用了兩個消息隊列的其中一種,後面的業務需求,想往另外一種消息隊列進行遷移,這時候無疑就是一個災難性的,一大堆東西都要重新推倒重新做,因為它跟我們的系統耦合了,這時候 springCloud Stream提供了一種解耦合的方式。

1、概述

  Spring Cloud Stream由一個中間件中立的核組成。應用通過Spring Cloud Stream插入的input(相當於消費者consumer,它是從隊列中接收消息的)和output(相當於生產者producer,它是從隊列中發送消 息的)通道與外界交流。通道通過指定中間件的Binder實現與外部代理連接。業務開發者不再關註具體消息中間件,只需關註Binder對應用程式提供的抽象概念來使用消息中間件實現業務即可。

說明:最底層是消息服務,中間層是綁定層,綁定層和底層的消息服務進行綁定,頂層是消息生產者和消息消費者,頂層可以向綁定層生產消息和和獲取消息消費

2、核心概念

  綁定器Binder 

  綁定器是Spring Cloud Stream中一個非常重要的概念。在沒有綁定器這個概念的情況下,Spring Boot應用要直接與消息中間件進行信息交互的時候,由於各消息中間件構建的初衷不同,實現細節上會有較大的差異性,這使得實現的消息交互邏輯就會非常笨重,因為對具體的中間件實現細節有太重的依賴,當中間件有較大的變動升級、或是更換中間件的時候,就需要付出非常 大的代價來實施。 通過定義綁定器作為中間層,實現了應用程式與消息中間件(Middleware)細節之間的隔離。通過嚮應用程式暴露統一的Channel通過,使得應用程式不需要再考慮各種不同的消息中間件的實現。當需要升級消息中間件,或者是更換其他消息中間件產品時,需要做的就是更換對應的Binder綁定器而不需要修改任何應用邏輯 。甚至可以任意的改變中間件的類型而不需要修改一行代碼。 Spring Cloud Stream支持各種binder實現。

  通過配置把應用和spring cloud stream 的 binder 綁定在一起,之後只需要修改 binder 的配置來達到動態修改topic、exchange、type等一系列信息而不需要修改一行代碼。

發佈/訂閱模型

  在Spring Cloud Stream中的消息通信方式遵循了發佈-訂閱模式,當一條消息被投遞到消息中間件之後,它會通過共用的 Topic 主題進行廣播,消息消費者在訂閱的主題中收到它並觸發自身的業務邏輯處理。這裡所提到的 Topic 主題是Spring Cloud Stream中的一個抽象概念,用來代表發佈共用消息給消費者的地方。在不同的消息中間件中, Topic 可能對應著不同的概念,比如:在RabbitMQ中的它對應了Exchange、而在Kakfa中則對應了Kafka中的Topic。

二、SpringCloud Config

1、配置中心概述

  對於單體應用而言,常使用配置文件來管理所有配置,比如SpringBoot的application.yml文件, 但是在微服務架構中全部手動修改的話很麻煩而且不易維護。微服務的配置管理一般有以下需求:

  集中配置管理,一個微服務架構中可能有成百上千個微服務,所以集中配置管理是很重要的。 不同環境不同配置,比如數據源配置在不同環境(開發,生產,測試)中是不同的。

  運行期間可動態調整。例如,可根據各個微服務的負載情況,動態調整數據源連接池大小等配置修改後可自動更新。如配置內容發生變化,微服務可以自動更新配置。

綜上所述對於微服務架構而言,一套統一的、通用的管理配置機制是不可缺少的總要組成部分。常見的做法就是通過配置伺服器進行管理。

2、常見配置中心

  Spring Cloud Config為分散式系統中的外部配置提供伺服器和客戶端支持。 Apollo(阿波羅)是攜程框架部門研發的分散式配置中心,能夠集中化管理應用不同環境、不同集群的配置,配置修改後能夠實時推送到應用端,並且具備規範的許可權、流程治理等特性,適用於微服務配置管理場景。 

3、Spring Cloud Config簡介

   Spring Cloud Config項目是一個解決分散式系統的配置管理方案。它包含了Client和Server兩個部分, server提供配置文件的存儲、以介面的形式將配置文件的內容提供出去,client通過介面獲取數據、並依據此數據初始化自己的應用。

  Spring Cloud Config為分散式系統中的外部配置提供伺服器和客戶端支持。使用Config Server,可以為所有環境中的應用程式管理其外部屬性。非常適合spring應用,也可以使用在其他語言的應用上。隨著應用程式通過從開發到測試和生產的部署流程,可以管理這些環境之間的配置,並確定應用程式具有遷移時需要運行的一切。伺服器存儲後端的預設實現使用git,因此它輕鬆支持標簽版本的配置環境,以及可以訪問用於管理內容的各種工具。

4、Spring Cloud Config

(1)概述

  Config Server是一個可橫向擴展、集中式的配置伺服器,它用於集中管理應用程式各個環境下的配置, 預設使用Git存儲配置文件內容,也可以使用SVN存儲,或者是本地文件存儲。 

(2)配置中心的高可用

  在單機環境中,客戶端都是直接調用配置中心的server端來獲取配置文件信息。這樣就存在了一個問題,客戶端和服務端的耦合性太高,如果server端要做集群,客戶端只能通過原始的方式來路由, server端改變IP地址的時候,客戶端也需要修改配置,不符合springcloud服務治理的理念。 springcloud提供了這樣的解決方案,只需要將server端當做一個服務註冊到eureka中,client端去 eureka中去獲取配置中心server端的服務即可。

(3)消息匯流排bus

  在微服務架構中,通常會使用輕量級的消息代理來構建一個共用的消息主題來連接各個微服務實例,它廣播的消息會被所有在註冊中心的微服務實例監聽和消費,也稱消息匯流排。 SpringCloud中也有對應的解決方案,SpringCloud Bus將分散式的節點用輕量的消息代理連接起來,可以很容易搭建消息匯流排,配合SpringCloud config 實現微服務應用配置信息的動態更新。

  根據此圖可以看出利用Spring Cloud Bus做配置更新的步驟: 提交代碼觸發post請求給bus/refresh server端接收到請求併發送給Spring Cloud Bus Spring Cloud bus接到消息並通知給其它客戶端其它客戶端接收到通知,請求Server端獲取最新配置全部客戶端均獲取到最新的配置。

5、開源配置中心Apollo

(1)Apollo概述

  Apollo(阿波羅)是攜程框架部門研發的分散式配置中心,能夠集中化管理應用不同環境、不同集群的 配置,配置修改後能夠實時推送到應用端,並且具備規範的許可權、流程治理等特性,適用於微服務配置 管理場景。服務端基於Spring Boot和Spring Cloud開發,打包後可以直接運行,不需要額外安裝 Tomcat等應用容器。 正是基於配置的特殊性,所以Apollo從設計之初就立志於成為一個有治理能力的配置發佈平臺,目前提供了以下的特性:

  • 統一管理不同環境、不同集群的配置

    • Apollo提供了一個統一界面集中式管理不同環境(environment)、不同集群(cluster)、不同命名空間(namespace)的配置。
    • 同一份代碼部署在不同的集群,可以有不同的配置,比如zookeeper的地址等
    • 通過命名空間(namespace)可以很方便地支持多個不同應用共用同一份配置,同時還允許應用對共用的配置進行覆蓋
  • 配置修改實時生效(熱發佈)

    • 用戶在Apollo修改完配置併發布後,客戶端能實時(1秒)接收到最新的配置,並通知到應用程式
  • 版本發佈管理

    • 所有的配置發佈都有版本概念,從而可以方便地支持配置的回滾
  • 灰度發佈

    • 支持配置的灰度發佈,比如點了發佈後,只對部分應用實例生效,等觀察一段時間沒問題後再推給所有應用實例
  • 許可權管理、發佈審核、操作審計

    • 應用和配置的管理都有完善的許可權管理機制,對配置的管理還分為了編輯和發佈兩個環節,從而減少人為的錯誤。
    • 所有的操作都有審計日誌,可以方便地追蹤問題

(2)Apollo的實現方式

上圖簡要描述了Apollo客戶端的實現原理:

  1. 客戶端和服務端保持了一個長連接,從而能第一時間獲得配置更新的推送。

  2. 客戶端還會定時從Apollo配置中心服務端拉取應用的最新配置。 這是一個fallback機制,為了防止推送機制失效導致配置不更新 客戶端定時拉取會上報本地版本,所以一般情況下,對於定時拉取的操作,服務端都會返回 304 - Not Modified 定時頻率預設為每5分鐘拉取一次,客戶端也可以通過在運行時指定System Property: apollo.refreshInterval 來覆蓋,單位為分鐘。

  3. 客戶端從Apollo配置中心服務端獲取到應用的最新配置後,會保存在記憶體中。

  4. 客戶端會把從服務端獲取到的配置在本地文件系統緩存一份 在遇到服務不可用,或網路不通的時候,依然能從本地恢復配置 5. 應用程式從Apollo客戶端獲取最新的配置、訂閱配置更新通知。

(3)Apollo中的幾個核心概念:

  1. application (應用)

    • 實際使用配置的應用,Apollo客戶端在運行時需要知道當前使用配置的應用,從而可以去獲取對應的配置;
    • 每個應用都需要有唯一的身份標識 -- appId。
  2. environment (環境)

    • 配置對應的環境,Apollo客戶端在運行時需要知道當前應用所處環境,從而獲取應用的配置
    • 所以環境預設是通過讀取機器上的配置(server.properties中的env屬性)指定的,也支持運行時通過System Property等指定。
  3. cluster (集群)

    • 一個應用下不同實例的分組,比如典型的可以按照數據中心分,把上海機房的應用實例分為一個集群,把北京機房的應用實例分為另一個集群。

    • 對不同的cluster,同一個配置可以有不一樣的值,如zookeeper地址。

    • 集群預設是通過讀取機器上的配置(server.properties中的idc屬性)指定的,不過也支持運行時通過System Property指定。

  4. namespace (命名空間)

    • 一個應用下不同配置的分組,可以簡單地把namespace類比為文件,不同類型的配置存放在不同的文件中,如資料庫配置文件,RPC配置文件,應用自身的配置文件等;

    • 應用可以直接讀取到公共組件(公有)的配置namespace,如DAL,RPC等;

    • 應用也可以通過繼承(引用)公共組件(公有)的配置namespace來對公共組件的配置做調整,如DAL的初始資料庫連接數;

    • 私有namespace只有當前項目可以訪問。

   github地址 https://github.com/ctripcorp/apollo

 

 感謝閱讀,借鑒了不少大佬資料,如需轉載,請註明出處,謝謝!https://www.cnblogs.com/huyangshu-fs/p/13888671.html

 


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

-Advertisement-
Play Games
更多相關文章
  • Servlet4.0 Response對象Response對象封裝Server返回Client的所有信息。在HTTP協議中,Server傳達給Client信息轉換到HTTP Header或者HTTP BODY中。5.1 Buffering緩衝區Serverlet Container可以但不強制緩衝發 ...
  • 我們在創建條形碼時,如果以圖片的方式將創建好的條碼保存到指定文件夾路徑,可以在程式中直接載入圖片使用;已生成的條碼圖片,需要通過讀取圖片中的條碼信息,如條碼類型、條碼繪製區域在圖片中的四個頂點坐標位置等,可參考本文中的方法。 註:讀取時,也支持讀取二維碼類型。 引入dll 調用API:Spire.B ...
  • 前言 WPF 的 ComboBox 控制項等綁定 enum 值很繁瑣,很讓人頭疼,網上也有提供了一些方法,基本是使用 ObjectDataProvider 方式和 MarkupExtension 方式, 有沒有辦法綁定值為 enum 類型就自動載入所有枚舉值選項,下麵記錄一種方法; 實現方式 主要通過 ...
  • CORS跨域訪問問題往往出現在“瀏覽器客戶端”通過ajax調用“服務端API”的時候。而且若是深究原理,還會發現跨域問題其實還分為【簡單跨域】與【複雜跨域】這兩種情況。 網上對解決跨域限制有很多說明文章,但絕大多數要麼解決的不完善(比如,沒有區分【簡單跨域】與【複雜跨域】),要麼就是解決方案過於複雜 ...
  • 一. 背景 我們在日常開發中,可能你會遇到這樣的需求:"每個月的3號給用戶發信息,提醒用戶XXX "、"每天的0點需要統計前一天的考勤記錄"、"每個月的1號計算上個月的庫存情況"、"定時初始化數據供其它業務使用"、"每隔2分鐘輪詢查資料庫看某業務是否被審核通過,並提示用戶" 等等。 以上需求在開發中 ...
  • 一、crond任務調度 概述: 使用crontab 指令進行定時任務的設置,任務調度是指系統在某個時間端執行的特定任務或程式,例如:病毒掃描,資料庫備份等 基本語法: crontab 【選項】 常用選項: -e編輯crontab定時任務 -l查詢crontab任務 -r刪除當前用戶所有的cronta ...
  • MySQL基本知識 1.資料庫 1.1.創建資料庫 語法: CREATE DATABASE [IF NOT EXISTS] db_name [create_specification[,create_specification]...] create_specification: [DEFAULT] ...
  • #背景 webpack構建過程中的hooks都有什麼呢?除了在網上看一些文章,還可以通過更直接的辦法,結合官方文檔快速讓你進入webpack的hook世界 寫一個入口文件 //index.js const webpack = require("webpack"); const path = requ ...
一周排行
    -Advertisement-
    Play Games
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...