從這篇開始探討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,掌握一個基礎項目應用,學習起來也更直觀。示例有三個項目:一個是網關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
在上面示例中,使用了基本的路由配置,在ocelot路由配置中,還有許多特性,好比:
(1) 給DownstreamPathTemplate和UpstreamPathTemplate設置佔位符,來捕捉全部類型的ReRoute,是使用直接代理。
(2) 設置上游(客戶端)的主機頭來匹配 "UpstreamHost": "somedomain.com"。
(3) 設置路由的優先級,Priority的數字越高表明級別越高。
(4) 設置動態路由,沒必要提供ReRoute配置。
(5) 設置查詢字符串,根據url的參數unitId={unitId}來匹配轉發。
參考文獻