做者:markjiang7m2
原文地址:http://www.javashuo.com/article/p-arjfcwsg-er.html
源碼地址:https://gitee.com/Sevenm2/OcelotDemohtml
今天要給你們介紹的Ocelot是一個基於 .net core的開源WebAPI服務網關項目,它的功能很是強大,包括了路由、請求聚合、服務發現、認證鑑權、限流、負載均衡等功能。而這些功能均可以直接經過修改json配置文件便可使用,很是方便。Ocelot是系統中對外暴露的一個請求入口,全部外部接口都必須經過這個網關才能向下遊API發出請求,就如地鐵中的安檢系統,全部人都必須通過安檢才能乘坐地鐵。git
我將經過具體案例對Ocelot的功能進行一一展開說明,而本文中涉及案例的完整代碼均可以從個人代碼倉庫進行下載。github
經過VS2017新建一個基於 .net core WebAPI項目,而後經過nuget直接搜索Ocelot
或者使用如下命令行添加Ocelot的引用。json
Install-Package Ocelot
在項目的根目錄添加一個.json
配置文件,文件名自定義,此案例爲Ocelot.json.添加配置以下:c#
{ "ReRoutes": [], "GlobalConfiguration": { } }
能夠看到在咱們的配置文件中包含兩個配置項,ReRoutes是一個數組,將會包含服務器的路由配置,GlobalConfiguration則是一個全局配置項。我會在下文中經過各類案例詳細說明配置項中的具體內容以及如何使用,所以,在這裏暫時不展開說明。
將該配置文件添加到 .net core configuration中
Program.csapi
public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) .ConfigureAppConfiguration((hostingContext, builder) => { builder.AddJsonFile("Ocelot.json"); }) .UseStartup<Startup>();
由於 .net core支持當配置文件被修改後會從新加載,因此若是咱們須要支持從新加載,可修改成:數組
public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) .ConfigureAppConfiguration((hostingContext, builder) => { builder.AddJsonFile("Ocelot.json", optional: false, reloadOnChange: true); }) .UseStartup<Startup>();
將Ocelot做爲中間件註冊,須要添加兩個命名空間
Startup.cs緩存
using Ocelot.DependencyInjection; using Ocelot.Middleware;
public void ConfigureServices(IServiceCollection services) { services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2); services.AddOcelot(); } public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseMvc(); app.UseOcelot().Wait(); }
至此,咱們的Ocelot就已經搭建完成了。下面咱們經過具體案例來講明如何修改配置進行相關功能的使用。服務器
咱們先來認識一下到底包含哪些參數,以及這些參數的含義。前面咱們有介紹到,配置文件中包含兩個配置項:ReRoutes和GlobalConfiguration。
咱們先來看GlobalConfiguration,它是一個全局配置項,一般咱們都要在這個配置項中添加一個屬性BaseUrl
,BaseUrl就是Ocelot服務對外暴露的Url。app
"GlobalConfiguration": { "BaseUrl": "http://localhost:4727" }
ReRoutes是一個數組,其中的每個元素表明了一個路由,而一個路由所包含的全部可配置參數以下:
{ "DownstreamPathTemplate": "/", "UpstreamPathTemplate": "/", "UpstreamHttpMethod": [ "Get" ], "AddHeadersToRequest": {}, "AddClaimsToRequest": {}, "RouteClaimsRequirement": {}, "AddQueriesToRequest": {}, "RequestIdKey": "", "FileCacheOptions": { "TtlSeconds": 0, "Region": "" }, "ReRouteIsCaseSensitive": false, "ServiceName": "", "DownstreamScheme": "http", "DownstreamHostAndPorts": [ { "Host": "localhost", "Port": 8001, } ], "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 }
固然,咱們在實際使用過程當中不須要設置全部的參數,只須要根據實際須要進行配置便可。
路由是Ocelot最基本的功能。Ocelot接收到來自上游服務的請求,通過驗證後,將請求轉發到下游服務,所以,咱們首先要配置路由當中上下游服務參數。
{ "DownstreamPathTemplate": "/api/ocelot/{Id}", "DownstreamScheme": "http", "DownstreamHostAndPorts": [ { "Host": "localhost", "Port": 8001, } ], "UpstreamPathTemplate": "/ocelot/{Id}", "UpstreamHttpMethod": ["Get"] }
{}
中的內容表明動態參數所以,當上遊服務向地址http://localhost:4727/ocelot/5
發出請求時,Ocelot會將請求轉發到下游服務http://localhost:8001/api/ocelot/5
。
本案例提供了下游服務Demo - OcelotDownAPI,將OcelotDownAPI發佈到IIS端口便可使用。下游服務在接收到請求後返回一個字符串用於代表本身的身份。
[HttpGet("{id}")] public async Task<IActionResult> Get(int id) { var result = await Task.Run(() => { return $"This is from {HttpContext.Request.Host.Value}, path: {HttpContext.Request.Path}"; }); return Ok(result); }
測試結果:
若是但願Ocelot可以轉發全部的請求,則能夠配置以下:
{ "DownstreamPathTemplate": "/{url}", "DownstreamScheme": "http", "DownstreamHostAndPorts": [ { "Host": "localhost", "Port": 8001, } ], "UpstreamPathTemplate": "/{url}", "UpstreamHttpMethod": ["Get"] }
這樣就能將全部Get請求轉發到下游服務。不過這樣配置的優先級是最低的,一旦匹配到其它路由模板,會優先選擇。
若是但願Ocelot只轉發來自某個特定上游服務Host的請求,則能夠配置以下:
{ "DownstreamPathTemplate": "/{url}", "DownstreamScheme": "http", "DownstreamHostAndPorts": [ { "Host": "localhost", "Port": 8001, } ], "UpstreamPathTemplate": "/{url}", "UpstreamHttpMethod": ["Get"], "UpstreamHost": "localhost:4023" }
這樣Ocelot就只會轉發來自localhost:4023的請求。須要注意的是,若是路由配置中包含兩個除UpstreamHost
之外都相同的路由,即其中一個帶有UpstreamHost
,而另一個沒有,則Ocelot會優先選擇帶有UpstreamHost
的路由。
設置路由的優先級。咱們能夠定義ReRoutes
路由數組中響應的優先級。0是最低的優先級,數字越大,優先級越高。
[ { "UpstreamPathTemplate": "/ocelot/{Id}" "Priority": 0 }, { "UpstreamPathTemplate": "/ocelot/10" "Priority": 1 }, ]
本文主要介紹了Ocelot的功能,並經過簡單的案例講述如何構建Ocelot網關以及對Ocelot的基本應用。因爲Ocelot功能很是的強大,若是將全部的案例都放到同一篇文章中會致使篇幅過長,不便於閱讀,所以,我將會針對Ocelot功能寫成系列文章,但願你們繼續捧場。
參考文獻
本文在編寫過程當中引用或參考瞭如下文章中的部份內容,若有侵權,請聯繫修改或刪除。
https://www.cnblogs.com/jesse2013/p/net-core-apigateway-ocelot-docs.html