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

一.入門概述

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

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

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

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

 

  經過官方部署架構圖介紹,能夠了解到:Ocelot有5種部署方式包括:github

         (1) Ocelot基本實現web

         (2) Ocelot結合IS四、json

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

         (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項目介紹

   官方文檔

相關文章
相關標籤/搜索