asp.net core系列 61 Ocelot 構建服務發現簡單示例

来源:https://www.cnblogs.com/MrHSR/archive/2019/04/28/10784562.html
-Advertisement-
Play Games

一.概述 Ocelot允許指定服務發現提供程式,如Consul或Eureka。 這二個中間件是用來實現:服務治理或秒服務發現,服務發現查找Ocelot正在轉發請求的下游服務的主機和埠。目前Ocelot僅在GlobalConfiguration部分支持配置服務發現功能,這意味著相同的服務發現提供程式 ...


一.概述

  Ocelot允許指定服務發現提供程式,如Consul或Eureka。 這二個中間件是用來實現:服務治理或秒服務發現,服務發現查找Ocelot正在轉發請求的下游服務的主機和埠。目前Ocelot僅在GlobalConfiguration部分支持配置服務發現功能,這意味著相同的服務發現提供程式將用於為ReRoute級別指定ServiceName的所有ReRoutes。這裡介紹下服務發現的二個中間件:Consul與Eureka。

  

  1. Consul介紹

    Consul服務發現是用GO語言的開源框架,是一個分散式, 高可用,數據中心感知的解決方案,用於跨任何運行時平臺和公共雲或私有雲連接。Consul是服務發現和配置工具。主要功能包括:

    (1) 服務發現 - Consul使用簡單的服務來註冊自己,並通過DNS或HTTP介面發現其他服務。還可以註冊外部服務,比如SaaS提供者。

    (2) 運行狀況檢查 -運行狀況檢查使Consul能夠快速向操作員發出有關群集中任何問題的警報, 與服務發現的集成可防止將流量路由到不健康的主機,並啟用服務級別的斷路器。

    (3) Key/Value存儲 - 靈活的Key/Value存儲可以存儲動態配置,功能標記,協調,領導者選舉等。簡單的HTTP API使其易於在任何地方使用。

    (4) 多數據中心 - Consul可以識別數據中心,並且可以支持任意數量的區域而無需複雜的配置。

    (5) 服務分段 - Consul 連接通過自動TLS加密和基於身份的授權實現安全的服務到服務通信。

    使用consul示例:https://www.cnblogs.com/Zhang-Xiang/p/10437488.html

 

  2. Eureka介紹

    Eureka服務發現是用java語言的開源框架,最新版本為19.9 (有報道後面2.0版本不開源)。是一種基於REST的服務,主要用於AWS雲,用於定位服務,以實現中間層伺服器的負載平衡和故障轉移。

    使用Eureka示例:Service Discovery Demo With Eureka

    示例介紹:https://www.c-sharpcorner.com/article/building-api-gateway-using-ocelot-in-asp-net-core-service-discoveryeureka/

 

二.演示項目介紹

  本篇重點瞭解Consul的使用,下麵參考開源項目Github , 本篇在部署上 對比 參考示例 有些小改動,項目使用了Ocelot + IdentityServer4 + Consul中間件。

 

  說明:

  (1) 用到的軟體包括:centos系統,  iis,  fiddler。其中centos系統用於做Consul服務註冊,iis做webapi的宿主承載,fiddler用於客戶端模擬測試。

  (2) 演示中 IdentityServer4服務認證和ApiGateway網關項目由vs2017 來做宿主承載,但也可以用iis承載。

項目名稱

Ip和埠

說明

ApiGateway

http://localhost:38039

 

網關項目。統一訪問入口點,在生產環境下ip要在廣域網,供第三方客戶端訪問。

做好網關路由配置,將自動轉發。

IdentityServer4

http://127.0.0.1:8021

Is4令牌服務。ip是在區域網, 通過web api來調用令牌

Service A/B

http://127.0.0.1:8010 (A)

http://127.0.0.1:8011 (B)

服務項目。ip是在區域網,由網關轉發進來訪問。

Consul 搭建

http://172.168.18.201:8500

服務發現。在linux中啟動Consul服務,預設是8500埠,用於監聽服務的健康狀態。

在linux中需要拼通服務ip及port, 反之一樣。可telnet命令。

配置服務註冊文件

fiddler客戶端模擬

 

調用服務A獲取IS4令牌,通過該令牌訪問服務A受保護的介面

   

. web api服務   

  參考開源項目,Service A和Service B服務項目相關配置都一樣,以Service A為例: 

  1.項目中有三個api介面

    (1) 一個必須要診斷介面api/Health 

    (1) 一個必須要的獲取令牌介面api/Session

    (3) 一個業務測試介面api/Values。 因為業務介面是受保護的,所以該介面加了[Authorize],需要令牌來訪問

    [Authorize]
    [Route("api/[controller]")]
    [ApiController]
    public class ValuesController : ControllerBase
    {
        // GET api/values
        [HttpGet]
        public ActionResult<IEnumerable<string>> Get()
        {
            return new[] { "value1", "value2" };
        }
    }

  2. 在啟動時,加了授權中間件,採用JwtBearer方案。設置了受信任的is4服務基地址,以及Audience保護的資源。

     services.AddAuthentication("Bearer")
                .AddJwtBearer("Bearer", options =>
                {
                    options.Authority = "http://127.0.0.1:8021";
                    options.RequireHttpsMetadata = false;
                    options.Audience = "ServiceB";
                });

  

四. ApiGateway項目

  1. 在網關項目中,配置ocelot文件

   {
  "ReRoutes": [
    {
      "DownstreamPathTemplate": "/api/{everything}",
      "DownstreamScheme": "http",
      //客戶端通過/ServiceA來訪問ServiceA的服務
      "UpstreamPathTemplate": "/ServiceA/{everything}",
      "UpstreamHttpMethod": [ "GET", "POST", "DELETE", "PUT" ],
      //服務發現Consul用到
      "ServiceName": "ServiceA",
      "LoadBalancerOptions": {
        "Type": "LeastConnection"
      }
    },
    {
      "DownstreamPathTemplate": "/api/{everything}",
      "DownstreamScheme": "http",
      "UpstreamPathTemplate": "/ServiceB/{everything}",
      "UpstreamHttpMethod": [ "GET", "POST", "DELETE", "PUT" ],
      "ServiceName": "ServiceB",
      "LoadBalancerOptions": {
        "Type": "LeastConnection"
      }
    }
  ],
  "GlobalConfiguration": {
    //配置Consul的信息
    "ServiceDiscoveryProvider": {
      "Host": "172.168.18.201",
      "Port": 8500,
      "Type": "Consul"
    }
  }
}

   2.啟動時添加網關中間件

    public static void Main(string[] args)
        {
            new WebHostBuilder()
                .UseKestrel()
                .UseContentRoot(Directory.GetCurrentDirectory())
                .ConfigureAppConfiguration((hostingContext, config) =>
                {
                    config
                        .SetBasePath(hostingContext.HostingEnvironment.ContentRootPath)
                        .AddJsonFile("appsettings.json", true, true)
                        .AddJsonFile($"appsettings.{hostingContext.HostingEnvironment.EnvironmentName}.json", true, true)
                        .AddJsonFile("ocelot.json")
                        .AddEnvironmentVariables();
                })
                .ConfigureServices(services =>
                {
                    services.AddOcelot().AddConsul();
                })
                .ConfigureLogging((hostingContext, logging) =>
                {
                    //add your logging
                })
                .UseIISIntegration()
                .Configure(app =>
                {
                    app.UseOcelot().Wait();
                })
                .Build()
                .Run();
        }

 

五. IdentityServer令牌服務

  參考開源IdentityServer項目代碼,在令牌服務中,使用AddDeveloperSigningCredential來添加臨時證書,在生產環境下,可以使用AddSigningCredential來添加證書。客戶端基於用戶名和密碼的方式來獲取令牌GrantTypes.ResourceOwnerPassword。

 

六 Consul搭建

  1. consul安裝

    --下載安裝包
        [root@hsr opt]# wget https://releases.hashicorp.com/consul/1.4.4/consul_1.4.4_linux_amd64.zip
    --將conusl命令移到bin目錄下,方便啟動
        [root@hsr opt]# mv consul /usr/local/bin/
    --測試安裝是否成功,ok
    [root@hsr ~]# consul
    Usage: consul [--version] [--help] <command> [<args>]

  2.添加服務註冊放到/usr/etc/

  3. 啟動客戶端agent 測試

  consul agent -dev -data-dir=/usr/etc  -config-dir=/usr/etc/consul.json -client 172.168.18.201

    啟動成功後,會每隔10秒檢查一次服務的健康狀態,如下所示:

           -dev開發模式,啟動該參數配置下,不會有任何持久化操作,即不會有任何數據寫入到磁碟

           -config-file 指定服務註冊文件

           -client指定當前ip,預設是127.0.0.1

           -data-dir指定agent儲存狀態的數據目錄

  4.關閉201防火牆, 在win系統上訪問服務發現管理界面如下:

    systemctl stop firewalld.service

  

七.fiddler測試

  1. 測試開始步驟:

    (1) 兩個服務ServerA/ServerB發佈到iis上。

    (2) 在vs2017中啟動ApiGateway網關項目和IS4項目。

    (3) 在linux系統中啟動consul(現只是監聽服務是否健康)
  2.測試ServerA服務

    (1)通過用戶名和密碼,獲取要訪問ServerA服務的令牌

    (2) 獲取受保護的api介面,將拿到的令牌加到headers中去請求

    (3) 請求http://localhost:38039/serviceA/values數據介面成功,如下所示:

 

 

  參考文獻

    服務發現

      參考項目示例

 

 


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

-Advertisement-
Play Games
更多相關文章
  • 提供了基於ASP.NET身份的實現,用於管理IdentityServer用戶的身份資料庫。此實現是IdentityServer中的擴展點,以便為用戶載入身份數據以將聲明發送到令牌。 這個支持的倉儲位於 "此處" ,NuGet包就在 "這裡" 。 要使用此庫,請正常配置ASP.NET Identity ...
  • 您可以向托管IdentityServer4的應用程式添加更多API端點。 您通常希望通過它們所托管的IdentityServer實例來保護這些API。這不是問題。只需將令牌驗證處理程式添加到主機(請參閱 "此處" ): 在您的API上,您需要添加 屬性並顯式引用您要使用的身份驗證方案(在此示例中 , ...
  • 一、題目要求 1、能夠自動生成四則運算練習題 2、可以定製題目數量 3、用戶可以選擇運算符 4、用戶設置最大數(如十以內、百以內等) 5、用戶選擇是否有括弧、是否有小數 6、用戶選擇輸出方式 二、編譯工具 CodeBlocks 三、結對伙伴 |姓名|班級|代碼地址| |: :|: :|: :| |牛 ...
  • 可以在 https://baseaddress/.well known/openid configuration 找到發現文檔。它包含有關IdentityServer的端點,密鑰材料和功能的信息。 預設情況下,所有信息都包含在發現文檔中,但通過使用配置選項,您可以隱藏各個部分,例如: 42.1擴展發 ...
  • 第41章 CORS IdentityServer中的許多端點將通過基於JavaScript的客戶端的Ajax調用進行訪問。鑒於IdentityServer最有可能托管在與這些客戶端不同的源上,這意味著需要配置 "跨源資源共用" (CORS)。 41.1 基於客戶端的CORS配置 配置CORS的一種方 ...
  • GraphQL是什麼 GraphQL既是一種用於API的查詢語言也是一種通過使用對應數據的類型系統,執行數據查詢的服務端運行時。GraphQL沒有局限於任何資料庫或存儲引擎,而是通過既有代碼及數據獲得支持。 Schema GraphQL的Schema是GraphQL服務端實現的核心部分。它負責描述能 ...
  • //通過StartCoroutine()開始一個協程//通過StopCoroutine();關閉一個協程//通過StopAllCoroutines()方法來實現關閉所有協程void Start(){Debug.Log("開始協程程式:執行開始時間:"+ Time.time);StartCorouti ...
  • 前言 分兩個項目,一個Gatway,一個SignalR 貼代碼 1、Gatway 1、引用Ocelot 2、添加一點點代碼 Startup.cs 3、簡單配置ocelot ocelot.json 2、signalr 1、Startup.cs 2、chat.js 3、Program.cs 測試 1、啟 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...