.net core使用ocelot---第八篇 Consul

来源:https://www.cnblogs.com/xlxr45/archive/2019/08/08/11321966.html
-Advertisement-
Play Games

簡介 .net core使用ocelot 第一篇 簡單使用 .net core使用ocelot 第二篇 身份驗證使用 .net core使用ocelot 第三篇 日誌記錄 .net core使用ocelot 第四篇 限流熔斷 .net core使用ocelot 第五篇 服務質量 .net core使 ...


簡介

  .net core使用ocelot---第一篇 簡單使用  
  .net core使用ocelot---第二篇 身份驗證使用 
  .net core使用ocelot---第三篇 日誌記錄 
  .net core使用ocelot---第四篇 限流熔斷 
  .net core使用ocelot---第五篇 服務質量 
  .net core使用ocelot---第六篇 負載均衡 
  .net core使用ocelot---第七篇 服務發現 

         本文我們介紹Ocelot使用consul實現服務發現。

         我將使用Ocelot的13.5.2版本向您展示此功能。

Step1

         啟動Consul

         在本次演示,我將使用Docker運行consul的實例。(你也可以自己安裝consul,不需要docker)

   docker run -p 8500:8500 consul

   啟動後,我們會看到下麵的結果。

Step2

         新建一個在consul註冊了的API服務。

         為了演示,我將創建兩個Web API項目,它們埠不一樣但服務名一樣。

    編寫控制器的代碼如下:

[Route("api/[controller]")]  
[ApiController]  
public class ValuesController : ControllerBase  
{  
    // GET api/values  
    [HttpGet]  
    public ActionResult<IEnumerable<string>> Get()  
    {  
        var port = Request.Host.Port;  
  
        return new string[] { "value1", "value2", port.Value.ToString() };  
    }  
}  

  接下來將它註冊到consul,下麵的代碼,打個樣。

public static class AppExtensions  
{             
    public static IServiceCollection AddConsulConfig(this IServiceCollection services, IConfiguration configuration)  
    {  
        services.AddSingleton<IConsulClient, ConsulClient>(p => new ConsulClient(consulConfig =>  
        {  
            var address = configuration.GetValue<string>("Consul:Host");  
            consulConfig.Address = new Uri(address);  
        }));  
        return services;  
    }  
  
    public static IApplicationBuilder UseConsul(this IApplicationBuilder app)  
    {  
        var consulClient = app.ApplicationServices.GetRequiredService<IConsulClient>();  
        var logger = app.ApplicationServices.GetRequiredService<ILoggerFactory>().CreateLogger("AppExtensions");  
        var lifetime = app.ApplicationServices.GetRequiredService<IApplicationLifetime>();  
  
        if (!(app.Properties["server.Features"] is FeatureCollection features)) return app;  
  
        var addresses = features.Get<IServerAddressesFeature>();  
        var address = addresses.Addresses.First();  
  
        Console.WriteLine($"address={address}");  
  
        var uri = new Uri(address);  
        var registration = new AgentServiceRegistration()  
        {  
            ID = $"MyService-{uri.Port}",  
            // servie name  
            Name = "MyService",  
            Address = $"{uri.Host}",  
            Port = uri.Port  
        };  
  
        logger.LogInformation("Registering with Consul");  
        consulClient.Agent.ServiceDeregister(registration.ID).ConfigureAwait(true);  
        consulClient.Agent.ServiceRegister(registration).ConfigureAwait(true);  
  
        lifetime.ApplicationStopping.Register(() =>  
        {  
            logger.LogInformation("Unregistering from Consul");  
            consulClient.Agent.ServiceDeregister(registration.ID).ConfigureAwait(true);  
        });  
  
        return app;  
    }  
}  

  我們還得修改Startup.cs以便可註冊。

public class Startup  
{  
    public Startup(IConfiguration configuration)  
    {  
        Configuration = configuration;  
    }  
  
    public IConfiguration Configuration { get; }  
  
    public void ConfigureServices(IServiceCollection services)  
    {  
        services.AddConsulConfig(Configuration);  
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);  
    }  
  
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)  
    {  
        if (env.IsDevelopment())  
        {  
            app.UseDeveloperExceptionPage();  
        }  
  
        app.UseConsul();  
  
        app.UseMvc();  
    }  
}  

  當我們啟動我們的項目,會在Consul發現名為MyServices的實例,它包括兩個節點。

 

  為了看看新服務的具體細節,點開MyService,我們會看到兩個節點的具體信息。

  接下來創建APIGateway

Step3

         通過.NET Core CLI 添加下麵的包

dotnet add package Ocelot --version 13.5.2  
dotnet add package Ocelot.Provider.Consul --version 13.5.2 

 

   新建ocelot.json,內容如下。

{  
    "ReRoutes": [  
      {  
        "UseServiceDiscovery": true,   
        "DownstreamPathTemplate": "/{url}",   
        "DownstreamScheme": "http",  
        "ServiceName": "MyService",   
        "LoadBalancerOptions": {   
          "Type": "RoundRobin"  
        },  
        "UpstreamPathTemplate": "/{url}",   
        "UpstreamHttpMethod": [ "Get" ],   
        "ReRoutesCaseSensitive": false   
      }  
    ],  
    "GlobalConfiguration": {   
      "ServiceDiscoveryProvider": {   
        "Host": "localhost",  
        "Port": 8500,  
        "Type":"PollConsul",  
        "PollingInterval": 100  
      }  
    }  
}  

  使用服務發現我們在GlobalConfiguration中添加ServiceDiscoveryProvider節點。

名稱

描述

Host

表明Consul的主機

Port

指明Consul的埠

 Type

1. Consul, 意味每次請求Ocelot會從consul獲得服務信息。

2. PollConsul, 意味著Ocelot將向Consul推薦最新的服務信息

 PollingInterval

 告訴Ocelot多長時間調用Consul來更改服務配置

  在這裡,ReRoute依然很重要。因為它告訴Ocelot,當發出請求時我們希望使用的服務名稱和負載均衡器。 如果未指定負載均衡器,則Ocelot將不會對請求進行負載均衡。

  設置此選項後,Ocelot將從服務中查找下游主機和埠,發現提供程式,並查找任何可用服務的負載均衡請求。

  最後,我們需要在program.cs 中配置Ocelot。

public class Program  
{  
    public static void Main(string[] args)  
    {  
        CreateWebHostBuilder(args).Build().Run();  
    }  
  
    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>  
        WebHost.CreateDefaultBuilder(args)  
         .UseUrls("http://*:9000")  
         .ConfigureAppConfiguration((hostingContext, config) =>  
         {  
            config  
                .SetBasePath(hostingContext.HostingEnvironment.ContentRootPath)  
                .AddJsonFile("ocelot.json")  
                .AddEnvironmentVariables();  
         })  
        .ConfigureServices(services =>  
        {  
            services.AddOcelot()  
                .AddConsul();  
        })  
        .Configure(app =>  
        {  
            app.UseOcelot().Wait();  
        });  
}  

  啟動APIGateway,訪問http://localhost:9000/api/values.

  看一下列印的日誌。請求的詳細信息都在控制台顯示。

 

  源碼在此

  網盤鏈接:https://pan.baidu.com/s/17sqfGcYx8yEHRL_LwKAUlA
  提取碼:p3d0

總結

         在這篇文章中我們學習了ocelot使用consul實現服務發現簡單的例子。完結!!!!


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

-Advertisement-
Play Games
更多相關文章
  • 最近趕項目忽然想到一個問題,那就是在 .Net平臺下的C#代碼是怎麼從源代碼到機器可以識別的電腦的(只怪自己上學不好好讀書,現在又要重補一遍了!!!) 話不多說直接上調研結果: 預習知識: 1: IL 是微軟.NET平臺上衍生出的一門中間語言,.NET平臺上的各種高級語言(如C#,VB,F#)的編譯 ...
  • 圖片中物體(人物,動物或其它特定物品)的精確識別與提取是人工智慧領域重要的一個方面,通過機器學習,最終能達到不需要人工干預準確的進行識別。 以雲服務的方式提供 由於這些演算法依賴於大量的訓練或基礎數據,所以,對於一些成果,以靜態的演算法,每個應用獨立去完成漫漫的訓練不是個好辦法。因此,很多類似的成果會以 ...
  • 前面已經介紹過了 ".Net Core 程式發佈到 Docker 容器" 的內容。但是每次通過 SSH 鏈接到伺服器敲命令,運行腳本也是挺麻煩的一件事。程式員是最懶的,能讓電腦解決的問題絕不手動解決,如果當我們push一次代碼後自動build代碼,自動跑單元測試,如果測試通過,自動發佈程式,如果失敗 ...
  • SOA體系架構 微服務架構 微服務特點 微服務資料庫設計 傳統單一的中心化資料庫和微服務一個服務一個資料庫 微服務和限界上下文模式的關係 微服務的邏輯架構和物理架構 分散式數據管理的挑戰和解決方案 挑戰 1:如何定義微服務邊界 首先,需要關註應用的邏輯領域模型和相關數據。必須嘗試識別同一個應用中解耦 ...
  • 微信JS-SDK說明文檔 https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115 生成簽名 1.簽名規則 參與簽名的欄位包括noncestr(隨機字元串), 有效的jsapi_ticket, timestamp(時間戳), ...
  • 一. 上傳示例 Amazon Simple Storage Service 是互聯網存儲解決方案。該服務旨在降低開發人員進行網路規模級計算的難度。 Amazon S3 提供了一個簡單 Web 服務介面,可用於隨時在 Web 上的任何位置存儲和檢索任何數量的數據。此服務讓所有開發人員都能訪問同一個具備 ...
  • Serilog 自定義Enricher 來增加記錄的信息 Intro Serilog 是 .net 裡面非常不錯的記錄日誌的庫,結構化日誌記錄,而且配置起來很方便,自定義擴展也很方便 Serilog is a diagnostic logging library for .NET applicati ...
  • C#.NET WinFrom開發之嵌入Google瀏覽器 (CefSharp) 引入靜態頁面 CefWebBrowser = new ChromiumWebBrowser("http://" + Register.Host + ":" + Register.Port + "/Template/htm ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...