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

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

介紹

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

基本原理

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

集成方式

基本集成

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

集成IdentityServer
json

當咱們涉及到認證和鑑權的時候,咱們能夠跟Identity Server進行結合。當網關須要請求認證信息的時候會與Identity Server服務器進行交互來完成。api

網關集羣
服務器

只有一個網關是很危險的,也就是咱們一般所講的單點,只要它掛了,全部的服務全掛。這顯然沒法達到高可用,因此咱們也能夠部署多臺Ocelot網關。固然這個時候在多臺網關前,你還須要一臺負載均衡器app

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的主要特性:路由

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

相關文章
相關標籤/搜索