主頁 > .NET開發 > .Net Core with 微服務 - Consul 配置中心

.Net Core with 微服務 - Consul 配置中心

2021-07-10 06:02:24 .NET開發

上一次我們介紹了Elastic APM組件,這一次我們繼續介紹微服務相關組件配置中心的使用方法,本來打算介紹下攜程開源的重型配置中心框架 apollo 但是體系實在是太過于龐大,還是讓我愛不起來,因為前面我們已經介紹了使用Consul 做為服務注冊發現的組件,那么干脆繼續使用 Consul 來作為配置中心吧,Consul 除了服務注冊發現功能,還有個 Key/Value 存盤的功能,我們把本地的 appsettings.json 檔案的內容搬到 Key/Value 上就可以實作配置中心了,

把服務的配置遷移至 Consul

讓我們來改造一下前面系列文章里的 member_center 專案,把組態檔都遷移到 consul 上面去,

在 consul 控制臺點擊 “Key/Value” 選單,點擊 “create” 按鈕新建一個 Key/Value 物件,

Key/Value 支持按檔案夾分類,當我們的 Key 以 / 結尾的時候,consul 會認為這是一個檔案夾,
我們在這里輸入 “member_center/” 在創建檔案夾,

在創建的檔案夾目錄下繼續點擊 “create” 按鈕,

在 key 文本框里輸入 “confing.json” ,
在 Value 文本框內把原來 appsettings.json 檔案的全部內容復制粘貼進去,

{
  "consul_server": "http://192.168.18.164:8500"
}

把原來 appsettings.json 檔案的內容全部洗掉,只輸入一行 consul_server 的配置,用來指示 consul 服務的地址,

Install-Package Winton.Extensions.Configuration.Consul 

在 member_center 專案上通過nuget安裝 Winton.Extensions.Configuration.Consul 這個組件,

    public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.ConfigureAppConfiguration((ctx,cfg)=> {
                        var localconfig = new ConfigurationBuilder()
                                    .SetBasePath(Directory.GetCurrentDirectory())
                                    .AddJsonFile("appsettings.json").AddEnvironmentVariables().Build();
                        var consul_server = localconfig["consul_server"];

                        cfg.AddConsul("member_center/config.json",op=> {
                            op.ConsulConfigurationOptions = cco =>
                            {
                                cco.Address = new Uri(consul_server);
                            };
                            op.ReloadOnChange = true;
                        });
                    });
                    webBuilder.ConfigureKestrel(options =>
                    {
                        options.ListenAnyIP(6002);
                    });
                    webBuilder.UseStartup<Startup>();
                });

在 program 檔案的 CreateHostBuilder 方法內配置使用 Consul 做為配置的提供源,首先從本地讀取 consul_server 的地址,通過 AddConsul 方法指示需要從 consul 讀取的組態檔的路徑,完成以上操作后我們的服務已經可以讀取到 Consul 存盤的配置了,

   [ApiController]
    [Route("[controller]")]
    public class ConsulController : ControllerBase
    {
        IConfiguration _configuration;
        public ConsulController(IConfiguration configuration)
        {
            _configuration = configuration;
        }

        [HttpGet("getConfig")]
        public string GetConfig(string key)
        {
            return _configuration[key];
        }
    }

我們新建一個GetConfig方法來演示下能否讀取到配置,
直接在 Controller 建構式注入 IConfiguration 來讀取配置,這跟我們普通本地配置的讀取方式完全一致,

http://localhost:6002/consul/getconfig?key=hotreload_test



在瀏覽器上訪問一下這個action對應的url,并且指定一個key=hotreload_test,可以看到輸出的結果跟我們在 consul 上配置的值是一致的,


修改一下 consul 上面的配置值,重新讀取一下這個配置,可以看到新的值已經被讀取到了,證明我們的熱更新也可以運行了,

把 Ocelot 網關的配置遷移至 Consul

上面我們演示了如何把普通服務的配置遷移至 consul,下面演示下如何把 Ocelot 的配置遷移到 Consul 上,
Ocelot 網站其實也就是一個 webapi 專案,本質上跟上面的服務沒啥區別,我們根據上面的演示,其實可以很容易的把 Ocelot 專案的配置遷移到 Consul 上,那么為什么需要單獨說一下 Ocelot 網關的遷移呢?
本來 Ocelot 的路由配置需要把下游服務的地址跟埠在組態檔里寫死,那樣的話,我們的 Consul 服務注冊發現就沒有意義了,我們的下游服務都是可能動態變化的,所以我們需要讓 Ocelot 結合 Consul 的服務注冊發現功能來把下游服務器的配置動態化,這就導致 Ocelot 專案跟 Consul 的融合會比一般的服務復雜一點,

Install-Package Ocelot.Provider.Consul

首先我們在專案上使用 nuget 安裝 Ocelot.Provider.Consul 這個組件,

{
  "consul_server": "http://192.168.18.164:8500"
}

同樣我們需要在本地的 appsettings.json 檔案內指定 consul_server 的地址,再把 routes.json 檔案的內容全部遷移至 consul 的 key/value 上去,這個不在贅述,

注意,這里不是簡單的復制粘貼 routes.json 檔案的內容,
我們需要把原來的 DownstreamHostAndPorts 配置全部刪掉,替換成服務名,并且指定負載均衡的演算法,

"ServierName" : "hotel_base",
"LoadBalanceOptions": {
    "Type": "LeastConnection"
}

在 "GlobalConfiguration" 節點指定 "ServiceDiscoveryProvider":

"ServiceDiscoveryProvider": {
    "Scheme": "http",
    "Host": "192.168.18.164",
    "Prot": 8500,
    "Type": "Consul"
}

ServiceDiscoveryProvider 節點指示了使用 Consul 做為服務發現的組件及Consul服務的基本資訊,

        public static void Main(string[] args)
        {
            new WebHostBuilder()
              .UseKestrel()
              .UseContentRoot(Directory.GetCurrentDirectory())
              .ConfigureAppConfiguration((hostingContext, config) =>
              {
                  var localconfig = new ConfigurationBuilder()
                                .SetBasePath(Directory.GetCurrentDirectory())
                                .AddJsonFile("appsettings.json").AddEnvironmentVariables().Build();
                  var consul_server = localconfig["consul_server"];

                  config.AddConsul("gateway/routes.json", op => {
                      op.ConsulConfigurationOptions = cco =>
                      {
                          cco.Address = new Uri(consul_server);
                      };
                      op.ReloadOnChange = true;
                  });

                  config.AddEnvironmentVariables();
              })
              .ConfigureServices(s => {
                  s.AddOcelot()
                  .AddConsul()
                  .AddTransientDefinedAggregator<HotelDetailInfoForMobileAggregator>();
              })
              .ConfigureLogging((hostingContext, logging) =>
              {
                  logging.AddConsole();
               })
              .UseIISIntegration()
              .Configure(app =>
              {
                  app.UseOcelot().Wait();
              })
              .Build()
              .Run();
        }

我們改造一下 program 檔案的 main 方法,在ConfigureAppConfiguration的配置方法內首先獲取 consul_server 的地址,通過AddConsul方法指示獲取組態檔的地址,
以上跟服務的配置遷移都是一致的,除了以上操作使用 Consul 作為 ServiceDiscoveryProvider 還需要在 ConfigureServices 方法的配置函式內指定 consul 相關的依賴注入,

   s.AddOcelot()
    .AddConsul()


我們運行起來所有的服務跟網關專案,訪問一下 /api/hotel 這個路由,可以看到請求被正確的轉發到了對應的服務上了,

總結

以上我們演示了如何把服務的配置遷移到 Consul 的 Key/Value 物件上并且實作了配置的讀取及熱更新,演示了 Ocelot 網關的路由配置如何遷移到 Consul 的 Key/Value 物件上并且不再寫死下游服務的配置資訊,而是使用 Consul 的服務發現能力動態獲取下游服務的配置資訊,通過以上演示我們可以發現整個程序還是非常簡單易用的,雖然 Consul 做為配置中心功能相對于 apollo 等功能還不夠強大,比如沒有版本管理,用戶權限,審計等功能,但是對于一些小的微服務專案也已經足夠了,如果你的微服務體系中使用了 Consul 做為服務注冊發現的組件,那么可以直接使用 Consul 來做為配置中心,這樣在能夠獲得基本的配置中心能力同時也省去了再部署一套單獨的配置中心的繁瑣操作,

廣告時間

如果你覺得 Consul 的配置中心功能過于簡單,那么還可以試試由本人開源的 AgileConfig 輕量級配置中心專案,它部署簡單,使用簡單,支持配置管理,熱更新,版本管理,基本的用戶權限管理等功能,歡迎試用,
專案地址: https://github.com/kklldog/AgileConfig ,

演示專案地址

https://github.com/kklldog/myhotel_microservice

相關文章

NET Core with 微服務 - 什么是微服務
.Net Core with 微服務 - 架構圖
.Net Core with 微服務 - Ocelot 網關
.Net Core with 微服務 - Consul 注冊中心
.Net Core with 微服務 - Seq 日志聚合
.Net Core with 微服務 - Elastic APM

關注我的公眾號一起玩轉技術

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/289023.html

標籤:.NET技术

上一篇:.Net Core with 微服務 - Consul 配置中心

下一篇:UWP 寫入圖片 Exif 資訊

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • WebAPI簡介

    Web體系結構: 有三個核心:資源(resource),URL(統一資源識別符號)和表示 他們的關系是這樣的:一個資源由一個URL進行標識,HTTP客戶端使用URL定位資源,表示是從資源回傳資料,媒體型別是資源回傳的資料格式。 接下來我們說下HTTP. HTTP協議的系統是一種無狀態的方式,使用請求/ ......

    uj5u.com 2020-09-09 22:07:47 more
  • asp.net core 3.1 入口:Program.cs中的Main函式

    本文分析Program.cs 中Main()函式中代碼的運行順序分析asp.net core程式的啟動,重點不是剖析原始碼,而是理清程式開始時執行的順序。到呼叫了哪些實體,哪些法方。asp.net core 3.1 的程式入口在專案Program.cs檔案里,如下。ususing System; us ......

    uj5u.com 2020-09-09 22:07:49 more
  • asp.net網站作為websocket服務端的應用該如何寫

    最近被websocket的一個問題困擾了很久,有一個需求是在web網站中搭建websocket服務。客戶端通過網頁與服務器建立連接,然后服務器根據ip給客戶端網頁發送資訊。 其實,這個需求并不難,只是剛開始對websocket的內容不太了解。上網搜索了一下,有通過asp.net core 實作的、有 ......

    uj5u.com 2020-09-09 22:08:02 more
  • ASP.NET 開源匯入匯出庫Magicodes.IE Docker中使用

    Magicodes.IE在Docker中使用 更新歷史 2019.02.13 【Nuget】版本更新到2.0.2 【匯入】修復單列匯入的Bug,單元測驗“OneColumnImporter_Test”。問題見(https://github.com/dotnetcore/Magicodes.IE/is ......

    uj5u.com 2020-09-09 22:08:05 more
  • 在webform中使用ajax

    如果你用過Asp.net webform, 說明你也算是.NET 開發的老兵了。WEBform應該是2011 2013左右,當時還用visual studio 2005、 visual studio 2008。后來基本都用的是MVC。 如果是新開發的專案,估計沒人會用webform技術。但是有些舊版 ......

    uj5u.com 2020-09-09 22:08:50 more
  • iis添加asp.net網站,訪問提示:由于擴展配置問題而無法提供您請求的

    今天在iis服務器配置asp.net網站,遇到一個問題,記錄一下: 問題:由于擴展配置問題而無法提供您請求的頁面。如果該頁面是腳本,請添加處理程式。如果應下載檔案,請添加 MIME 映射。 WindowServer2012服務器,添加角色安裝完.netframework和iis之后,運行aspx頁面 ......

    uj5u.com 2020-09-09 22:10:00 more
  • WebAPI-處理架構

    帶著問題去思考,大家好! 問題1:HTTP請求和回傳相應的HTTP回應資訊之間發生了什么? 1:首先是最底層,托管層,位于WebAPI和底層HTTP堆疊之間 2:其次是 訊息處理程式管道層,這里比如日志和快取。OWIN的參考是將訊息處理程式管道的一些功能下移到堆疊下端的OWIN中間件了。 3:控制器處理 ......

    uj5u.com 2020-09-09 22:11:13 more
  • 微信門戶開發框架-使用指導說明書

    微信門戶應用管理系統,采用基于 MVC + Bootstrap + Ajax + Enterprise Library的技術路線,界面層采用Boostrap + Metronic組合的前端框架,資料訪問層支持Oracle、SQLServer、MySQL、PostgreSQL等資料庫。框架以MVC5,... ......

    uj5u.com 2020-09-09 22:15:18 more
  • WebAPI-HTTP編程模型

    帶著問題去思考,大家好!它是什么?它包含什么?它能干什么? 訊息 HTTP編程模型的核心就是訊息抽象,表示為:HttPRequestMessage,HttpResponseMessage.用于客戶端和服務端之間交換請求和回應訊息。 HttpMethod類包含了一組靜態屬性: private stat ......

    uj5u.com 2020-09-09 22:15:23 more
  • 部署WebApi隨筆

    一、跨域 NuGet參考Microsoft.AspNet.WebApi.Cors WebApiConfig.cs中配置: // Web API 配置和服務 config.EnableCors(new EnableCorsAttribute("*", "*", "*")); 二、清除默認回傳XML格式 ......

    uj5u.com 2020-09-09 22:15:48 more
最新发布
  • C#多執行緒學習(二) 如何操縱一個執行緒

    <a href="https://www.cnblogs.com/x-zhi/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2943582/20220801082530.png" alt="" /></...

    uj5u.com 2023-04-19 09:17:20 more
  • C#多執行緒學習(二) 如何操縱一個執行緒

    C#多執行緒學習(二) 如何操縱一個執行緒 執行緒學習第一篇:C#多執行緒學習(一) 多執行緒的相關概念 下面我們就動手來創建一個執行緒,使用Thread類創建執行緒時,只需提供執行緒入口即可。(執行緒入口使程式知道該讓這個執行緒干什么事) 在C#中,執行緒入口是通過ThreadStart代理(delegate)來提供的 ......

    uj5u.com 2023-04-19 09:16:49 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    <a href="https://www.cnblogs.com/huangxincheng/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/214741/20200614104537.png" alt="" /&g...

    uj5u.com 2023-04-18 08:39:04 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    一:背景 1. 講故事 前段時間協助訓練營里的一位朋友分析了一個程式卡死的問題,回過頭來看這個案例比較經典,這篇稍微整理一下供后來者少踩坑吧。 二:WinDbg 分析 1. 為什么會卡死 因為是表單程式,理所當然就是看主執行緒此時正在做什么? 可以用 ~0s ; k 看一下便知。 0:000> k # ......

    uj5u.com 2023-04-18 08:33:10 more
  • SignalR, No Connection with that ID,IIS

    <a href="https://www.cnblogs.com/smartstar/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/u36196.jpg" alt="" /></a>...

    uj5u.com 2023-03-30 17:21:52 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:15:33 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:13:31 more
  • C#遍歷指定檔案夾中所有檔案的3種方法

    <a href="https://www.cnblogs.com/xbhp/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/957602/20230310105611.png" alt="" /></a&...

    uj5u.com 2023-03-27 14:46:55 more
  • C#/VB.NET:如何將PDF轉為PDF/A

    <a href="https://www.cnblogs.com/Carina-baby/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2859233/20220427162558.png" alt="" />...

    uj5u.com 2023-03-27 14:46:35 more
  • 武裝你的WEBAPI-OData聚合查詢

    <a href="https://www.cnblogs.com/podolski/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/616093/20140323000327.png" alt="" /><...

    uj5u.com 2023-03-27 14:46:16 more