第三章 分散式配置中心

来源:https://www.cnblogs.com/xuyubing/archive/2023/12/18/17910346.html
-Advertisement-
Play Games

1. 簡介 為什麼需要分散式配置中心 分散式配置中心是為瞭解決在分散式系統中進行配置管理的需求而引入的。在傳統的單體應用中,通常使用配置文件集中管理系統的配置信息。然而,在分散式系統中,由於系統規模變大、節點眾多,並且可能部署在不同的伺服器上,傳統的配置文件方式會面臨一些挑戰。 首先,配置文件的修改 ...


1. 簡介

為什麼需要分散式配置中心

分散式配置中心是為瞭解決在分散式系統中進行配置管理的需求而引入的。在傳統的單體應用中,通常使用配置文件集中管理系統的配置信息。然而,在分散式系統中,由於系統規模變大、節點眾多,並且可能部署在不同的伺服器上,傳統的配置文件方式會面臨一些挑戰。

首先,配置文件的修改和發佈需要手動操作,如果系統規模龐大則變得非常繁瑣和容易出錯。其次,配置文件不易實現動態更新,如果需要修改某項配置,需要重新部署整個應用。而對於分散式系統來說,這樣的操作會帶來不可忽視的停機時間和影響。

因此,引入分散式配置中心可以解決這些問題。分散式配置中心提供了一個集中式的管理界面,可以方便地進行配置修改和發佈。同時,它支持實時動態更新配置,可以使得配置的修改立即生效,無需重啟應用或重新部署。此外,分散式配置中心還提供了配置的版本管理、許可權控制、配置項的灰度發佈等功能,能夠更好地滿足分散式系統的配置管理需求。

 

什麼是分散式配置中心

分散式配置中心是一種用於管理和集中存儲分散式系統配置信息的工具或服務。它提供了一個集中化的平臺,方便開發人員對系統配置進行統一管理和調整,以滿足不同環境下的需求。

.Net 分散式配置中心通常具有以下特點:

  1. 集中管理:分散式配置中心將系統中各個組件或節點的配置信息集中存儲在一個地方,方便開發人員進行查看、修改和更新。

  2. 實時更新:分散式配置中心支持動態更新配置信息,當配置項發生改變時,可以實時通知系統中的節點或組件,使得配置的修改能夠立即生效,無需重啟應用。

  3. 版本控制:配置中心通常支持配置版本管理,可以記錄每次配置的修改歷史,並支持回滾到之前的版本。

  4. 許可權控制:為了保證配置的安全性,分散式配置中心提供了許可權管理機制,可以限制不同角色或用戶對配置的訪問和修改許可權。

  5. 灰度發佈:部分分散式配置中心還支持配置的灰度發佈,即將配置變更只應用於部分節點或用戶,以便逐步驗證和測試新的配置。

  6. 支持IConfiguration,IOptions模式讀取配置,原程式幾乎可以不用改造

通過使用分散式配置中心,團隊可以更加高效地管理和維護分散式系統的配置,降低系統配置管理的複雜度,提高系統的可維護性和靈活性。

 

2. Nacos 配置中心

文檔地址:GitHub - nacos-group/nacos-sdk-csharp: This nacos csharp sdk

安裝

如何使用

  1. nuget 安裝:

    1. nacos-sdk-csharp

    2. nacos-sdk-csharp.AspNetCore

    3. nacos-sdk-csharp.Extensions.Configuration

  2. appsetting.json 配置:

    {
        "Logging": {
            "LogLevel": {
                "Default": "Information",
                "Microsoft": "Warning",
                "Microsoft.Hosting.Lifetime": "Information"
            }
        },
        "AllowedHosts": "*",
        // 配置中心
        "NacosConfig": {
            "Listeners": [ // 配置文件,至少要有一個
                {
                    "Optional": true, // 是否可選,true:可以不創建,但控制台會給出警告,false:必須要有
                    "DataId": "app1-dev.json", // 配置文件
                    "Group": "DEFAULT_GROUP"
                }
            ],
            "Namespace": "netcore",// 此處不要寫public,必須設置一個你自己的命名空間
            "ServerAddresses": [ "http://localhost:8848/" ], // 伺服器地址
            "UserName": "nacos", // nacos 登錄賬號
            "Password": "nacos", // nacos 登錄密碼
            "ConfigUseRpc": false, // 配置中心是否使用Rpc協議通信
            "NamingUseRpc": false // 註冊中心是否使用RPC協議通信
        }
    }

     

  3. Program.cs 中添加服務

    var builder = WebApplication.CreateBuilder(args);
    // ...
    builder.Host.UseNacosConfig("NacosConfig"); // NacosConfig 是appsetting.json 配置中心節點的名稱

     

  4. 創建配置文件

     

 

 

  1. 如何使用

    private readonly IConfiguration _configuration;
    
    public UserController(IConfiguration configuration)
    {
        _configuration = configuration;
    }
    
    [HttpGet]
    public IActionResult GetUserList()
    {
        var s = _configuration["JwtTokenOption:TokenExpireTime"];
       
        return Ok(s);
    }
     

     

配置公共部分

如果是做微服務項目,其實每個項目的配置有很多東西都是共用的,例如:jwt 配置,日誌配置等等。

 

 

 

修改NacosConfig節點配置

"NacosConfig": {
    "Listeners": [
      {
        "Optional": true,
        "DataId": "app1-dev.json",
        "Group": "DEFAULT_GROUP"
      },
        // 公共配置
      {
        "Optional": true,
        "DataId": "app-common.json",
        "Group": "DEFAULT_GROUP"
      }
    ],
    "Namespace": "NetCloud",
    "serverAddresses": [
      "http://101.43.242.9:8848"
    ],
    "UserName": "nacos",
    "Password": "nacos",
    "ConfigUseRpc": false,
    "NamingUseRpc": false
  }

 

使用方式

同上。

直接使用IConfiguration 介面註入獲取配置即可

 

Nacos 多環境問題

當我們所有的環境都共用一套配置中心的時候,最讓我們苦惱的問題應該是要怎麼樣去隔離這些不同的環境!

手段有如下幾種:

  • 通過Namespace來區別

    例如:可以建立三個命名命名空間分別代表開發(dev),測試(test),生產(production)

  • 通過Group來區別

    預設的分組是DEFAULT_GROUP, 也可創建不同的分組代表不同的環境:開發(DEV_GROUP),測試(TEST_GROUP),生產(PRODUCTION_GROUP)

  • 通過DataID來區別

    DataID 顧名思義,就是數據文件ID,就是用於存放配置內容的配置文件名,可以創建不同的文件名來區分不同的環境。例如:

    開發(app-dev.json),測試(app-test.json),生產(app-production.json)

在Nacos中,推薦的做法是用NameSpace來區分。

 

使用步驟

  1. 首先要為每個環境建一個命名空間,用作區分的標識。

     

可以考慮用應用名.環境名的形式,只要統一就好。

  1. 為了演示,往每個命名空間都加一個test的配置,對應的值是環境名。

     

 

  1. 下麵要做的就是在不同環境的配置文件中指定對應的命名空間,這裡要用那個命名空間ID

     

 

 

 

3. Appolo

官方文檔:Apollo配置中心介紹 (apolloconfig.com)

官方 GitHub: https://github.com/ctripcorp/apollo

官方 Gitee:apollo: Apollo(阿波羅 (gitee.com)

 

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

安裝步驟

1. 下載安裝包(官方提供的)

  1. 下載 apollo-quick-start.zip百度網盤 請輸入提取碼 (baidu.com)9wwe

    此壓縮包由官方提供的下載鏈接

  2. 準備一臺linux centos 7伺服器,安裝open-jdk 1.8,mysql

  3. 將下載好的 apollo上傳至linux伺服器,解壓。

    # 解壓
    unzip apollo-quick-start.zip

     

  4. 執行apollo解壓後下的sql文件夾下的兩個mysql文件

    ApolloConfigDb.sql 與 ApolloPortalDb.sql

    導入成功後,可以通過執行以下sql語句來驗證:

    select `NamespaceId`, `Key`, `Value`, `Comment` from ApolloConfigDB.Item;

     

    NamespaceIdKeyValueComment
    1 timeout 100 sample timeout配置
    select `Id`, `AppId`, `Name` from ApolloPortalDB.App;

     

    IdAppIdName
    1 SampleApp Sample App

2、配置資料庫連接信息

Apollo服務端需要知道如何連接到你前面創建的資料庫,所以需要編輯demo.sh,修改ApolloPortalDB和ApolloConfigDB相關的資料庫連接串信息。

註意:填入的用戶需要具備對ApolloPortalDB和ApolloConfigDB數據的讀寫許可權。

#apollo config db info
apollo_config_db_url="jdbc:mysql://localhost:3306/ApolloConfigDB?characterEncoding=utf8&serverTimezone=Asia/Shanghai"
apollo_config_db_username=用戶名
apollo_config_db_password=密碼(如果沒有密碼,留空即可)

# apollo portal db info
apollo_portal_db_url="jdbc:mysql://localhost:3306/ApolloPortalDB?characterEncoding=utf8&serverTimezone=Asia/Shanghai"
apollo_portal_db_username=用戶名
apollo_portal_db_password=密碼(如果沒有密碼,留空即可)點擊複製錯誤複製成功

 

註意:不要修改demo.sh的其它部分

3. 安裝open-jdk 1.8

  1. 線上安裝open-jdk1.8

    yum install -y java-1.8.0-openjdk-devel.x86_64

     

  2. 配置環境變數

    1. vi /etc/profile
    
    2. 在末尾行添加
    #set java environment
    JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.11.0.9-1.el7_9.x86_64
    CLASSPATH=.:$JAVA_HOME/lib.tools.jar
    PATH=$JAVA_HOME/bin:$PATH
    export JAVA_HOME CLASSPATH PATH
    
    3. 使更改的配置立即生效
    source /etc/profile  

     

  3. 測試是否安裝成功:

    java -version

     

4. 啟動運行:

1. 解壓apollo-quick-start.zip
unzip apollo-quick-start.zip
2. 啟動
./demo.sh start

成功提示如下:
==== starting service ====
Service logging file is ./service/apollo-service.log
Started [10768]
Waiting for config service startup.......
Config service started. You may visit http://localhost:8080 for service status now!
Waiting for admin service startup....
Admin service started
==== starting portal ====
Portal logging file is ./portal/apollo-portal.log
Started [10846]
Waiting for portal startup......
Portal started. You can visit http://localhost:8070 now!

 

啟動成功之後出提示兩個運行地址:

  1. http://虛擬機ip:8080 這個是註冊中心地址(eureka)

  2. http://虛擬機ip:8070 這個是apollo 配置中心

    配置中心登錄賬號與密碼預設為:賬號:apollo, 密碼:admin

  3. 添加應用

    • 部門:選擇你的部門

    • appID(特別重要):一般與微服務名一致

    • 應用名稱: (建議格式 xx-yy-zz 例:apollo-server) ,也可以使用中心進行命名

    • 應用負責人:選擇任意一個負責人

    • 項目管理員:選擇任意一個項目管理員

     

  4. 管理秘鑰(可選)

     

     

  5. 添加命名空間

    預設的application 命名空間是針對於以.properties 尾碼名結尾的配置文件,這種尾碼名一般是Java項目中所使用的配置文件。

    我們需要添加咱們 .Net 中常用的Json配置文件。

     

     

  6. 新建配置(發佈生效)

     

 

5. 卸載Apollo

  1. 查看apollo 進程列表,找到對應的PID

    ps -ef | grep apollo

     

  2. 殺死進程

    kill 進程ID

     

     

 

創建客戶端

dotnet-git : https://github.com/ctripcorp/apollo.net/tree/dotnet-core

  1. 安裝nuget包

    Com.Ctrip.Framework.Apollo.Configuration

     

  2. 添加服務

    builder.Host.ConfigureAppConfiguration((context, build) =>
    {
        build.AddApollo(context.Configuration.GetSection("apollo"))
            // 註意:使用json配置時,需要指定命名空間類型為Json類型,見下方AddNamespace代碼
            // 如果有多個命名空間,可以AddNamespace 多次
            .AddNamespace("app", Com.Ctrip.Framework.Apollo.Enums.ConfigFileFormat.Json)
            .AddDefault();
    });

     

  3. 配置appsetting.json

    "apollo": {
        "AppId": "NetCloud.Apollo",
        "MetaServer": "http://127.0.0.1:8080",
        "ConfigServer": [ "http://127.0.0.1:8080" ],
        "Env": "DEV",
        // "Secret": "764c744d92a14bc8b65c4d86f324ac15", // 有則配置
    }

     

  1. 使用

    [ApiController]
    [Route("[controller]/[action]")]
    public class HomeController:ControllerBase
    {
    
        private readonly IConfiguration _configuration;
        public HomeController(IConfiguration configuration)
        {
            _configuration = configuration;
        }
    
        [HttpGet]
        public IActionResult Test1()
        {
            // 讀取apollo配置中心
            var connectionString = _configuration.GetConnectionString("MySql");
            return Ok(connectionString);
        }
    }

     

註意事項
  1. IOptions 不能夠實時獲取到最新

  2. IConfiguration/IOptionsMonitor 可以實時獲取最新配置

 

4. Consul 配置中心

前面介紹到了Consul 具有Key/Value 功能,意思就是用於做分散式配置中心。

4.1 安裝

省略

4.2 創建配置中心步驟

1. 單服務情況下

一般創建一個 appsettings.json配置文件即可

 

2. 多服務情況下

利用文件夾分層的方式,在Consul客戶端上一個項目對應一個文件夾,然後在各自文件夾下放各自的appsettings.json, 如:ConfigCenterTest/appsettings.json、GoodsService/appsettings.json,然後在Program載入配置文件的時候,動態獲取項目名稱,進行路徑的組裝即可。

 

(1)創建文件夾

 

(2) 這個是保存好的文件夾

 

(3) 編寫配置文件

 

4.3 接入.Net 6

  1. 安裝包:Winton.Extensions.Configuration.Consul

  2. 在Program 中加入如下代碼:

    builder.WebHost.ConfigureAppConfiguration((context, config) =>
    {
        var env = context.HostingEnvironment;
        context.Configuration = config.Build();
        string consul_url = context.Configuration["Consul_Url"];
        
        // 單服務文件命名
        string configFileName = "appsettings.json";
        // 多服務情況下,建議 服務名/文件名命名 ,例如 OrderService/appsettings.json
        // string configFileName = $"{env.ApplicationName}/appsettings.{env.EnvironmentName}.json";
        
        config.AddConsul(configFileName, options =>
        {
            options.Optional = true;
            options.ReloadOnChange = true;
            options.OnLoadException = exceptionContext => { exceptionContext.Ignore = true; };
            options.ConsulConfigurationOptions = cco => { cco.Address = new Uri(consul_url); };
        });
     
        context.Configuration = config.Build();
    });

     

    其中,context.Configuration["Consul_Url"]需要在項目中配置。

     

5. SummberBoot 集成配置中心

github 文檔:SummerBoot/README.zh-cn.md at master · TripleView/SummerBoot · GitHub

SummerBoot 是將SpringBoot的先進理念與C#的簡潔優雅合二為一,聲明式編程,專註於”做什麼”而不是”如何去做”。在更高層面寫代碼,更關心的是目標,而不是底層演算法實現的過程,SummerBoot,致力於打造一個人性化框架,讓.net開發變得更簡單優雅。

SummberBoot 目前支持的配置中心只有Nacos。

如何使用

  1. 刪除原有的Nacos配置(如果有則清除掉)

  2. 安裝nuget 包:

    SummerBoot 2.0.2

     

  3. appsetting.json 添加如下配置

    "nacos": {
        //--------使用nacos則serviceAddress和namespaceId必填------
        //nacos服務地址,如http://172.16.189.242:8848
        "serviceAddress": "http://127.0.0.1:8848/",
        "namespaceId": "NetCloud",
        
        //--------如果需要使用nacos配置中心,則ConfigurationOption必填------
        "configurationOption": {
          //配置的分組
          "groupName": "DEFAULT_GROUP",
          //配置的dataId,
          "dataId": "app-Development.json"
        }
      }

     

  4. Program 註入服務

    builder.Host.UseNacosConfiguration();

     

  5. 測試

    [ApiController]
    [Route("[controller]/[action]")]
    public class HomeController:ControllerBase
    {
        private readonly IConfiguration _configuration;
        public HomeController(IConfiguration configuration)
        {
            _configuration = configuration;
        }
    ​
        [HttpGet]
        public IActionResult Test1()
        {
            // 讀取nacos配置中心
            var connectionString = _configuration.GetConnectionString("MySql");
            return Ok(connectionString);
        }
    }
     

     

視頻配套鏈接:課程簡介 (cctalk.com)

 

海闊平魚躍,天高任我行,給我一片藍天,讓我自由翱翔。
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • `QListWidget` 是 Qt 中的一個列表框組件,用於顯示一列項目,並允許用戶進行選擇。每個項目可以包含一個圖標和文本,可以使用 `QListWidgetItem` 類來表示。`ListWidget`組件與`TreeWidget`有些相似,區別在於`TreeWidget`可以實現嵌套以及多字... ...
  • WebAPI部署到IIS 1 開啟IIS功能 控制面板->程式->程式和功能->啟用或關閉Windows功能,以下打勾: 2 下載對應版本的dotNet Core 本文為ASP .NET Core6.0版本,需下載對應6.0版本的運行時,下載地址:https://dotnet.microsoft.c ...
  • 1. 簡單需求 通過圖文識別讀取一個指定window視窗的文本。 獲取視窗句柄,截圖保存成bitmap ,調用圖文識別庫. 測試結果是對中文下的識別不是特別好。 需要註意的是,tessdata要下載指定目錄頁下。 2. 引用包 a. 引用 tesseract4.1 b. Emgu.CV組件 3. 上 ...
  • 前言 本人最近在社區里說想做稚暉君的那個瀚文鍵盤來著,結果遇到兩個老哥一個老哥送了我電路板,一個送了我焊接好元件的電路板,既然大家這麼捨得,那我也就真的投入製作了這把客制化鍵盤,當然我為了省錢也是特意把外殼模型重新切割,用3D印表機列印了整個外殼,不得不說省了八九百的CNC費用。鍵盤介紹我就不說了, ...
  • 1. 常見的數據結構 1. 棧(stack) 特點:先進後出,後進先出 2. 隊列(Queue) 特點:先進先出 3. 數組(Array) 查詢速度快:通過地址值與索引可快速定位到數據 刪除效率低:刪除數據後,要將每個數據前移 添加效率極低:添加位置後,每個數據都後移,再添加數據。 4. 鏈表 鏈接 ...
  • c# 更改快捷方式文件圖標c# 更改快捷方式文件圖標c# 更改快捷方式文件圖標c# 更改快捷方式文件圖標c# 更改快捷方式文件圖標c# 更改快捷方式文件圖標c# 更改快捷方式文件圖標c# 更改快捷方式文件圖標c# 更改快捷方式文件圖標 /// <summary> /// 更改快捷方式文件圖標 /// ...
  • 通過以上案例我們發現,Http請求調用服務實例屬實過於麻煩。其實對於請求同一個服務,很多步驟都是相同的,例如:服務名,地址,httpClient 創建步驟等。 RPC的出現,就是為瞭解決這一問題。 RPC: 即我們常說的遠程過程調用,就是像調用本地方法一樣調用遠程方法,通信協議大多採用二進位方式。 ...
  • 上篇文章講述了C#處理文件系統I/O知識點,本文將介紹C#網路編程知識點。隨著信息技術的不斷發展,網路編程在.NET開發中變得愈發重要。無論是構建Web應用、實現實時通信,還是處理分散式系統,C#網路編程都是必備的技能。以下是.NET開發者在網路編程中應該掌握的關鍵知識點。 一、http請求知識點 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...