.Net微服務實踐(二)[網關]:Ocelot介紹和快速開始


上篇.Net微服務實踐(一):微服務框架選型 我們對微服務框架整體做了介紹,接下來我們從網關Ocelot開始,一一開始實踐

介紹

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

基本原理

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

集成方式

基本集成

用一台web service來host Ocelot,在這里有一個json配置文件,里面設置了所有對當前這個網關的配置。它會接收所有的客戶端請求,並路由到對應的下游服務器進行處理,再將請求結果返回。而這個上下游請求的對應關系也被稱之為路由。

集成IdentityServer

當我們涉及到認證和鑒權的時候,我們可以跟Identity Server進行結合。當網關需要請求認證信息的時候會與Identity Server服務器進行交互來完成。

網關集群

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

Consul服務發現

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

集成Service Fabric

快速開始

創建訂單服務

  • 新建一個新建asp.net core web api項目,命名為order-api, 模擬訂單服務
  • 在order-api項目中,添加一個order api
[ApiController]
public class OrderController : ControllerBase
{
   // GET: api/Product
    [Route("api/orders")]
    [HttpGet]
    public  IEnumerable<string> Get()
    {
        return new string[] { "劉明的訂單", "王天的訂單" };
    }
}
  • 服務啟動地址配置為http://localhost:5001

創建產品服務

  • 新建一個新建asp.net core web api項目,命名為product-api, 模擬產品服務
  • 在product-api項目中,添加一個product api
[ApiController]
public class ProductController : ControllerBase
{
    // GET: api/Product
    [Route("api/products")]
    [HttpGet]
    public IEnumerable<string> Get()
    {
        return new string[] { "筆記本", "口罩" };
    }

}
  • 服務啟動地址配置為http://localhost:5002

創建網關

  • 新建一個新建asp.net core web api項目,命名為ocelot-gateway, 這是網關

    項目結構圖

  • Nuget添加Ocelot package

  • 添加Ocelot配置文件, 命名為Ocelot.json (放在appsettings.json平級目錄)
    。我們暫且不管配置文件內容的含義,先快速把網關運行起來

{
  "ReRoutes": [
    {
      "DownstreamPathTemplate": "/api/orders",
      "DownstreamScheme": "http",
      "DownstreamHostAndPorts": [
        {
          "Host": "localhost",
          "Port": 5001
        }
      ],
      "UpstreamPathTemplate": "/api/orders",
      "UpstreamHttpMethod": [ "Get" ]
    },
    {
      "DownstreamPathTemplate": "/api/products",
      "DownstreamScheme": "http",
      "DownstreamHostAndPorts": [
        {
          "Host": "localhost",
          "Port": 5002
        }
      ],
      "UpstreamPathTemplate": "/api/products",
      "UpstreamHttpMethod": [ "Get" ]
    }
  ],
  "GlobalConfiguration": {
    "BaseUrl": "http://localhost:5000"
  }
}
  • 修改Program.cs文件,添加Ocelot配置文件
Host.CreateDefaultBuilder(args)
 .ConfigureAppConfiguration((hostingContext, config) =>
 {
     config
         .SetBasePath(hostingContext.HostingEnvironment.ContentRootPath)
         .AddJsonFile("appsettings.json", true, true)
         .AddJsonFile($"appsettings.{hostingContext.HostingEnvironment.EnvironmentName}.json", true, true)
         .AddJsonFile("Ocelot.json",false,true)
         .AddEnvironmentVariables();
 })
  • 修改Startup.cs, 在ConfigureServices中注入Ocelot組件
services.AddOcelot()
  • 修改Startup.cs, 在Configure中添加Ocelot中間件
app.UseOcelot().Wait();

-- 服務啟動地址配置為http://localhost:5000

運行驗證

最后

本篇我們介紹了Ocelot,它的實現原理,以及如何快速創建ocelot的helo world項目,下面我們會介紹Ocelot的主要特性:路由 .Net微服務實踐(三):Ocelot配置路由和請求聚合

示例代碼下載地址: https://github.com/lcyhjx/ocelot-demo/tree/master


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM