asp.net core系列 59 Ocelot 構建基礎項目示例

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

一.入門概述 從這篇開始探討Ocelot,Ocelot是一個.NET API網關,僅適用於.NET Core,用於.NET面向微服務/服務的架構中。當客戶端(web站點、ios、 app 等)訪問web api時,需要先統一入口點進入Ocelot網關(Ocelot可以做很多事情例如路由,身份驗證,服 ...


一.入門概述

  從這篇開始探討Ocelot,Ocelot是一個.NET API網關,僅適用於.NET Core,用於.NET面向微服務/服務的架構中。當客戶端(web站點、ios、 app 等)訪問web api時,需要先統一入口點進入Ocelot網關(Ocelot可以做很多事情例如路由,身份驗證,服務發現,日誌記錄等,下麵列出了功能基本),再由Ocelot分發到web api。Ocelot官方希望IS4一起使用,實現令牌輕鬆集成。

  Ocelot是一組按特定順序排列的中間件,查看源碼會發現Ocelot是一堆的middleware組成的一個管道。

  Ocelot操控HttpRequest對象到其配置指定的狀態,在中間件中Ocelot創建一個HttpRequestMessage對象,該對象用於向下游服務(wep api)發出請求。發出請求的中間件是Ocelot管道中的最後一件事。它不會調用下一個中間件。

  當下游服務response返回Ocelot管道時,將檢索下游服務的響應。有一個中間件將HttpResponseMessage映射到HttpResponse對象並返回給客戶端。

 

  通過官方部署架構圖介紹,可以瞭解到:Ocelot有5種部署方式包括:

         (1) Ocelot基本實現

         (2) Ocelot結合IS4、

         (3) Ocelot多個實現(高可用,負載)

         (4) Ocelot結合Consul(健康檢查,服務註冊)、

         (5) Ocelot結合Service Fabric。

  查看部署架構圖,在架構圖中,Ocelot網關暴露在廣域網的一個訪問入口,供客戶端調用。而web api是在區域網中,由Ocelot來轉發。

 

  Ocelot的功能基本包括:

                   路由

                   請求聚合

                   Consul和Eureka的服務發現

                   Service Fabric

                   WebSockets

                   Authentication認證

                   Authorisation授權

                   限速

                   高速緩存

                   重試策略/ QoS

                   負載均衡

                   日誌/跟蹤/關聯

                   標頭/查詢字元串/聲明轉換

                   自定義中間件/委托處理程式

                   配置/管理REST API

                   Platform / Cloud Agnostic

 

         安裝Nuget包

                  Install-Package Ocelot

 

二.Ocelot 基礎項目演示

  下麵通過貢獻者的開源項目來學習Ocelot,掌握一個基礎項目應用,學習起來也更直觀。示例有三個項目:一個是網關APIGateway項目,有二個是web api服務。 項目實現的功能是:客戶端統一通過網關作為入口點訪問,實現路由的功能。github開源地址   架構如下圖所示:

  

  2.1 CustomersAPIServices項目

    該項目是一個web api項目,用來處理客戶事務的API服務。該地址為http://localhost:9001, 可以在“項目選項”中指定url,也可以在Host啟動時配置。

    (1) Program類添加UseUrls

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                   .UseStartup<Startup>().UseUrls("http://*:9001"); 

    (2)CustimersAPIServices項目中創建一個CustomersController 

   [Route("api/[controller]")]
    public class CustomersController : Controller
    {        
        [HttpGet]
        public IEnumerable<string> Get()
        {
            return new string[] { "Catcher Wong", "James Li" };
        }

        [HttpGet("{id}")]
        public string Get(int id)
        {
            return $"Catcher Wong - {id}";
        }            
    }

 

   2.2 ProductsAPIServices項目 

    該項目是一個web api項目,處理產品某事的API服務。該地址為http://localhost:9002, 可以在“項目選項”中指定url,也可以在Host啟動時配置。

    (1) Program類添加UseUrls

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                   .UseStartup<Startup>().UseUrls("http://*:9002");   

    (2) 在ProductsAPIServices項目中創建ProductsController

    [Route("api/[controller]")]
    public class ProductsController : Controller
    {
        
        [HttpGet]
        public IEnumerable<string> Get()
        {
            return new string[] { "Surface Book 2", "Mac Book Pro" };
        }
    }

 

  2.3 APIGateway項目

    該項目是Ocelot網關項目,先安裝Ocelot包。在項目中添加一個Ocelot的json配置文件,這裡創建的是configuration.json文件。

    (1) configuration.json(配置Ocelot)

    {
  //ReRoutes:處理上游請求的對象(客戶端),每個數組{} 就是配置:上游地址和對應下游地址
  "ReRoutes": [
    {
      //以Downstream開頭的,是要轉發到下游伺服器的地址(CustomersAPIServices),與nginx轉發類似
      //下麵所有Downstream開頭的,組成一個轉發url,轉發地址是http://localhost:9001/api/customers
      "DownstreamPathTemplate": "/api/customers",
      "DownstreamScheme": "http",
      // "DownstreamHost": "localhost",
      // "DownstreamPort": 9001,
      //轉發到下游伺服器的主機和埠。
      "DownstreamHostAndPorts": [
        {
          "Host": "localhost",
          "Port": 9001
        }
      ],
      //Upstream開頭是指上游伺服器(客戶端)訪問地址,通過http get方式訪問。
      //也就是說客戶端訪問http://localhost:9000/customers 實際是轉發到了http://localhost:9001/api/customers的服務
      "UpstreamPathTemplate": "/customers",
      "UpstreamHttpMethod": [ "Get" ]
    },
    {
      "DownstreamPathTemplate": "/api/customers/{id}",
      "DownstreamScheme": "http",
      // "DownstreamHost": "localhost",
      // "DownstreamPort": 9001,
      "DownstreamHostAndPorts": [
        {
          "Host": "localhost",
          "Port": 9001
        }
      ],
      "UpstreamPathTemplate": "/customers/{id}",
      "UpstreamHttpMethod": [ "Get" ]
    },
    {
      "DownstreamPathTemplate": "/api/products",
      "DownstreamScheme": "http",
      // "DownstreamPort": 9002,
      // "DownstreamHost": "localhost",
      "DownstreamHostAndPorts": [
        {
          "Host": "localhost",
          "Port": 9002
        }
      ],
      "UpstreamPathTemplate": "/api/products",
      "UpstreamHttpMethod": [ "Get" ]
    }
  ],
  //全局配置,允許覆蓋ReRoutes特定設置
  "GlobalConfiguration": {
    "RequestIdKey": "OcRequestId",
    "AdministrationPath": "/administration"
  }
}

    (2) Startup類,使用Ocelot

          public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                   //.UseStartup<Startup>()
                //設置網關url
                   .UseUrls("http://*:9000")
                   .ConfigureAppConfiguration((hostingContext, config) =>
               {
                   config
                       .SetBasePath(hostingContext.HostingEnvironment.ContentRootPath)
                    //添加Ocelot配置文件
                       .AddJsonFile("configuration.json")
                       .AddEnvironmentVariables();
               })
               .ConfigureServices(s =>
               {
                //添加服務
                   s.AddOcelot();
                   s.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
               })
                .Configure(a =>
                {        
                //添加中間件            
                    a.UseOcelot().Wait();
                });

    

  最後開始測試:

    (1) 啟動CustomersAPIServices web api服務程式 http://localhost:9001

    (2) 啟動ProductsAPIServices web api服務程式  http://localhost:9002

    (3) 啟動 APIGateway 網關服務程式  http://localhost:9000

    

 

三. 關於ReRoutes路由介紹

  在上面示例中,使用了基本的路由配置,在ocelot路由配置中,還有許多特性,比如:   

  (1) 給DownstreamPathTemplate和UpstreamPathTemplate設置占位符,來捕捉所有類型的ReRoute,是使用直接代理。

  (2) 設置上游(客戶端)的主機頭來匹配 "UpstreamHost": "somedomain.com"。

  (3) 設置路由的優先順序,Priority的數字越高代表級別越高。

  (4) 設置動態路由,不必提供ReRoute配置。

  (5) 設置查詢字元串,根據url的參數unitId={unitId}來匹配轉發。

  

 

參考文獻

  構建基礎Ocelot項目介紹

   官方文檔

  

  

 


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

-Advertisement-
Play Games
更多相關文章
  • Java數據類型轉換的部分練習和註意點(double類型減法、類型轉型、變數相加) ...
  • 1 多態 1.1 多態性 Java 引用變數有兩個類型:一個是編譯時類型,一個是運行時類型。前者是代碼中聲明這個變數時的類型,後者是由實際對象的類型決定的。當編譯類型和運行類型不一樣時,產生多態。 這個例子中 nc 的編譯時類型是 BaseClass , 運行類型是 SubClass,在調用 nc ...
  • python基礎知識之註釋,算數運算符,變數,輸入和格式化輸出;註釋包括註釋的分類,註釋使用註意事項;算數運算符包括常見的算數運算符,算數運算符的優先順序;變數包括變數的使用,變數的類型,不同變數類型之間的計算,標識符;以及用戶輸入和格式化輸出等 ...
  • 簡介 api網關是提供給外部調用的統一入口,類似於dns,所有的請求統一先到api網關,由api網關進行指定內網鏈接。 ocelot是基於netcore開發的開源API網關項目,功能強大,使用方便,它包含了負載均衡、路由、請求聚合、服務發現、許可權認證等功能。 基礎準備 開發環境:vs2017 net ...
  • private List<string> barList; public List<string> BarList { get { return barList; } set { barList = value; } } DataSet dt = new DataSet(); DataSet dt2 ...
  • 這個系列的初衷是便於自己總結與回顧,把筆記本上面的東西轉移到這裡,態度不由得謹慎許多,下麵是我參考的資源: ASP.NET Core 中文文檔目錄 官方文檔 記在這裡的東西我會不斷的完善豐滿,對於文章裡面一些局限於我自己知識積累的觀點,希望沒有跳走堅持看完的朋友,能夠予以指正和鼓勵. 這個系列的初衷 ...
  • 創建項目雙擊Unity,選擇New Project:我們將它命名為rts,懸著其他本地磁碟例如C:,選擇3D然後點擊Create Project:然後我們通過File->Save Scene,保存當前的場景為“scene”(不需要“”)攝像機Unity會自動添加相機到工程中。如下圖所示,我們在Hie ...
  • vbCrLf 在 .NET 剛剛推出的時候,VB作為一款被微軟用來“襯托”C 的語言,在許多細節設計上遠不如C 方便。 比如在C 中寫一個多行文本,就有各種方式: 可以看出C 在字元的賦值寫法上十分靈活多變,然而你若是想用VB寫一個多行文本,那可廢了老勁了: 因為VB沒有轉義符,而且當時的VB也不支 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...