1. 程式人生 > >.net core使用ocelot---第一篇 簡單使用

.net core使用ocelot---第一篇 簡單使用

簡介原文地址

  接下來你會學習,基於asp.net core 用Ocelot實現一個簡單的API閘道器。或許你會疑問什麼是API閘道器,我們先看下面的截圖

  

  API閘道器是訪問你係統的入口,它包括很多東西,比如路由(Routing),身份驗證(Authentication),服務發現(Service discovery),日誌(Logging ),等等。

Ocelot

     Ocelot提供統一的訪問入口,適用於.net開發的微服務或者開發的面向服務架構,可以訪問Ocelot獲得更多資訊。

     我會用Ocelot實現一個簡單的例子。

Step1

    先建立三個專案,如下所示。

專案名稱

專案型別

描述

APIGateway

ASP.NET Core Empty

Demo的入口

CustomersAPIServices

ASP.NET Core Web API

API Service消費者相關操作

ProductsAPIServices

ASP.NET Core Web API

API Service 產品相關操作

 

 

Step2

     建立兩個API services,在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}";  
    }              
}  

 

 為了確定CustimersAPIServices的應用URL,我們應該在專案的類中新增UseUrls

public static IWebHost BuildWebHost(string[] args) =>  
        WebHost.CreateDefaultBuilder(args)  
            .UseStartup<Startup>()  
            .UseUrls("http://localhost:9001")  
            .Build();  

 

 在PriductsAPIServices專案中新建ProductsController

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

 

  

 同樣在專案的類中新增UseUrls

 

public static IWebHost BuildWebHost(string[] args) =>  
        WebHost.CreateDefaultBuilder(args)  
            .UseStartup<Startup>()  
            .UseUrls("http://localhost:9002")  
            .Build(); 

 

注意

    你可以通過專案的屬性對應用的URL進行配置。

  

Step3

    執行CustimersAPIServices 和ProductsAPIServices。開啟兩個cmd終端,cd到兩個服務的資料夾位置,輸入 "dotnet run" 啟動兩個專案。

 執行成功如下所示。

Step4

    接下來我們新建 APIGateway專案,首先安裝Ocelot安裝包。

Install-Package Ocelot

     安裝成功後,如下圖所示。

 

Step5

       在專案下新建configuration.json如下所示。

{  
    "ReRoutes": [  
        {  
            "DownstreamPathTemplate": "/api/customers",  
            "DownstreamScheme": "http",  
            "DownstreamHost": "localhost",  
            "DownstreamPort": 9001,  
            "UpstreamPathTemplate": "/customers",  
            "UpstreamHttpMethod": [ "Get" ]  
        },  
        {  
            "DownstreamPathTemplate": "/api/customers/{id}",  
            "DownstreamScheme": "http",  
            "DownstreamHost": "localhost",  
            "DownstreamPort": 9001,  
            "UpstreamPathTemplate": "/customers/{id}",  
            "UpstreamHttpMethod": [ "Get" ]  
        },  
        {  
            "DownstreamPathTemplate": "/api/products",  
            "DownstreamScheme": "http",  
            "DownstreamPort": 9002,  
            "DownstreamHost": "localhost",  
            "UpstreamPathTemplate": "/api/products",  
            "UpstreamHttpMethod": [ "Get" ]  
        }  
    ],  
    "GlobalConfiguration": {  
        "RequestIdKey": "OcRequestId",  
        "AdministrationPath": "/administration"  
    }  
}  

  該檔案是API閘道器的配置檔案,包括兩部分,ReRoutes和GlobalConfiguration。

  ReRoutes是告訴Ocelot如何操作上游的request請求,

  GlobalConfiguration有點黑客的感覺,允許對ReRoutes的設定進行重寫。

  用下面的片段介紹ReRoutes。

{  
    "DownstreamPathTemplate": "/api/customers/{id}",  
    "DownstreamScheme": "http",  
    "DownstreamHost": "localhost",  
    "DownstreamPort": 9001,  
    "UpstreamPathTemplate": "/customers/{id}",  
    "UpstreamHttpMethod": [ "Get" ]  
}  

 

  以Downstream開頭的項意味我們的請求會指向http://localhost:9001/api/customers/{id}

  以Upstream開頭的項意味我們應該使用/customers/{id} 的HTTP Get請求去訪問服務。

Step6

       修改Startup類,使用Ocelot。

public class Startup  
{  
    public Startup(IHostingEnvironment env)  
    {  
        var builder = new Microsoft.Extensions.Configuration.ConfigurationBuilder();  
        builder.SetBasePath(env.ContentRootPath)      
               //add configuration.json  
               .AddJsonFile("configuration.json", optional: false, reloadOnChange: true)  
               .AddEnvironmentVariables();  
  
        Configuration = builder.Build();  
    }  
  
    //change  
    public IConfigurationRoot Configuration { get; }  
  
    public void ConfigureServices(IServiceCollection services)  
    {  
        Action<ConfigurationBuilderCachePart> settings = (x) =>  
        {  
            x.WithMicrosoftLogging(log =>  
            {  
                log.AddConsole(LogLevel.Debug);  
  
            }).WithDictionaryHandle();  
        };  
        services.AddOcelot(Configuration, settings);  
    }  
      
    //don't use Task here  
    public async void Configure(IApplicationBuilder app, IHostingEnvironment env)  
    {  
        await app.UseOcelot();  
    }  
}  

 

  別忘了新增上面的configuration.json檔案。

Step7

       這一步至關重要,用來配置Ocelot。

     我們新建IWebHostBuilder的新例項,不要使用var!!!

public class Program  
{  
    public static void Main(string[] args)  
    {  
        IWebHostBuilder builder = new WebHostBuilder();  
        builder.ConfigureServices(s =>  
        {  
            s.AddSingleton(builder);  
        });  
        builder.UseKestrel()  
               .UseContentRoot(Directory.GetCurrentDirectory())  
               .UseStartup<Startup>()  
               .UseUrls("http://localhost:9000");  
  
        var host = builder.Build();  
        host.Run();  
    }  
}  

  同樣我們需要指明應用的URL。

Step8

     啟動APIGateway,使用cmd通過dotnet run 命令。啟動成功後,輸入http://localhost:9000

  當我們通過客戶端訪問http://localhost:9000/api/products真實的路由是http://localhost:9002/api/products

       當我們訪問http://localhost:9000/customers,真實的路由http://localhost:9001/api/customers

      當我們訪問http://localhost:9000/customers/1, 真實的路由是http://localhost:9001/api/customers/1。

原始碼:APIGatewayDemo

百度網盤

連結:https://pan.baidu.com/s/17sqfGcYx8yEHRL_LwKAUlA
提取碼:p3d0

總結

       這篇文章介紹了通過Ocelot建立API閘道器。希望可以幫到你。

     由於只是簡單的示例程式碼,Ocelot許多重要的特性比如服務發現,身份驗證,服務質量(qos),未在示例中體現。

&n