1. 程式人生 > 實用技巧 >.net 微服務系列之Ocelot

.net 微服務系列之Ocelot

  Ocelot是一個用.NET Core實現並且開源的API閘道器,它功能強大,包括了:路由、請求聚合、服務發現、認證、鑑權、限流熔斷、並內建了負載均衡器與Service Fabric、Butterfly Tracing整合。這些功能只都只需要簡單的配置即可完成,下面我們會對這些功能的配置一一進行說明。

介紹

  簡單的來說Ocelot是一堆的asp.net coremiddleware組成的一個管道。當它拿到請求之後會用一個request builder來構造一個HttpRequestMessage發到下游的真實伺服器,等下游的服務返回response之後再由一個middleware將它返回的HttpResponseMessage對映到HttpResponse上。

API閘道器——它是系統的暴露在外部的一個訪問入口。這個有點像代理訪問的傢伙,就像一個公司的門衛承擔著定址、限制進入、安全檢查、位置引導、等等功能。

Ocelot的基本使用

  用一臺web service來host Ocelot,在這裡有一個json配置檔案,裡面設定了所有對當前這個閘道器的配置。它會接收所有的客戶端請求,並路由到對應的下游伺服器進行處理,再將請求結果返回。而這個上下游請求的對應關係也被稱之為路由。

  

整合Identity Server

  當我們涉及到認證和鑑權的時候,我們可以跟Identity Server進行結合。當閘道器需要請求認證資訊的時候會與Identity Server伺服器進行互動來完成。

  

閘道器叢集

  只有一個閘道器是很危險的,也就是我們通常所講的單點,只要它掛了,所有的服務全掛。這顯然無法達到高可用,所以我們也可以部署多臺閘道器。當然這個時候在多臺閘道器前,你還需要一臺負載均衡器。

  

Consul服務發現

  在Ocelot已經支援簡單的負載功能,也就是當下遊服務存在多個結點的時候,Ocelot能夠承擔起負載均衡的作用。但是它不提供健康檢查,服務的註冊也只能通過手動在配置檔案裡面新增完成。這不夠靈活並且在一定程度下會有風險。這個時候我們就可以用Consul來做服務發現,它能與Ocelot完美結合。

  

整合閘道器

  在asp.net core 2.0裡通過nuget即可完成整合,或者命令列dotnet add package Ocelot以及通過vs2017 UI新增Ocelot nuget引用都可以。

  Install-Package Ocelot

配置

  我們需要新增一個.json的檔案用來新增Ocelot的配置,以下是最基本的配置資訊。

{
    "ReRoutes": [],
    "GlobalConfiguration": {
        "BaseUrl": "https://api.mybusiness.com"
    }
}

  要特別注意一下BaseUrl是我們外部暴露的Url,比如我們的Ocelot執行在http://123.111.1.1的一個地址上,但是前面有一個nginx綁定了域名http://api.jessetalk.cn,那這裡我們的BaseUrl就是 http://api.jessetalk.cn。

將配置檔案加入ASP.NET Core Configuration

  我們需要通過WebHostBuilder將我們新增的json檔案新增進asp.net core的配置

public static IWebHost BuildWebHost(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .ConfigureAppConfiguration( (hostingContext,builder) => {
            builder
            .SetBasePath(hostingContext.HostingEnvironment.ContentRootPath)
            .AddJsonFile("Ocelot.json");
        })
        .UseStartup<Startup>()
        .Build();

配置依賴注入與中介軟體

在startup.cs中我們首先需要引用兩個名稱空間

using Ocelot.DependencyInjection;
using Ocelot.Middleware;

接下來就是新增依賴注入和中介軟體

public void ConfigureServices(IServiceCollection services)
{
    services.AddOcelot();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.UseOcelot().Wait();
}

Ocelot功能介紹

通過配置檔案可以完成對Ocelot的功能配置:路由、服務聚合、服務發現、認證、鑑權、限流、熔斷、快取、Header頭傳遞等。在配置檔案中包含兩個根節點:ReRoutes和GlobalConfiguration。ReRoutes是一個數組,其中的每一個元素代表了一個路由,我們可以針對每一個路由進行以上功能配置。下面是一個完整的路由配置

{
          "DownstreamPathTemplate": "/",
          "UpstreamPathTemplate": "/",
          "UpstreamHttpMethod": [
              "Get"
          ],
          "AddHeadersToRequest": {},
          "AddClaimsToRequest": {},
          "RouteClaimsRequirement": {},
          "AddQueriesToRequest": {},
          "RequestIdKey": "",
          "FileCacheOptions": {
              "TtlSeconds": 0,
              "Region": ""
          },
          "ReRouteIsCaseSensitive": false,
          "ServiceName": "",
          "DownstreamScheme": "http",
          "DownstreamHostAndPorts": [
              {
                  "Host": "localhost",
                  "Port": 51876,
              }
          ],
          "QoSOptions": {
              "ExceptionsAllowedBeforeBreaking": 0,
              "DurationOfBreak": 0,
              "TimeoutValue": 0
          },
          "LoadBalancer": "",
          "RateLimitOptions": {
              "ClientWhitelist": [],
              "EnableRateLimiting": false,
              "Period": "",
              "PeriodTimespan": 0,
              "Limit": 0
          },
          "AuthenticationOptions": {
              "AuthenticationProviderKey": "",
              "AllowedScopes": []
          },
          "HttpHandlerOptions": {
              "AllowAutoRedirect": true,
              "UseCookieContainer": true,
              "UseTracing": true
          },
          "UseServiceDiscovery": false
    }
  • Downstream是下游服務配置
  • UpStream是上游服務配置
  • Aggregates服務聚合配置
  • ServiceName, LoadBalancer, UseServiceDiscovery配置服務發現
  • AuthenticationOptions配置服務認證
  • RouteClaimsRequirement配置Claims鑑權
  • RateLimitOptions為限流配置
  • FileCacheOptions快取配置
  • QosOptions服務質量與熔斷
  • DownstreamHeaderTransform頭資訊轉發

我們接下來將對這些功能一一進行介紹和配置