轉:http://www.javashuo.com/article/p-wtfmtrfv-es.htmlhtml
在微軟Tech Summit 2017 大會上和你們分享了一門課程《.NET Core 在騰訊財付通的企業級應用開發實踐》,其中重點是基於ASP.NET Core打造可擴展的高性能企業級API網關,以開源的API網關Ocelot爲基礎結合本身的業務特性,當天課程只有40分鐘,有不少內容都沒有展開,接下來就用一篇小文章來聊下Ocelot 的實現原理,你們在使用的過程當中也能夠一塊兒來貢獻。 整體來講這是一個ASP.NET Core 高級編程的內容,以前在公衆號裏已經發過很多各位朋友寫的文章,今天都會在這篇文章中引用,讓你進一步深刻學習。linux
我在github上的地址https://github.com/geffzhang 歡迎互粉,Ocelot在github的地址 https://github.com/TomPallister/Ocelot , 很是給力的是在課程當天完成了.NET Core 2.0的升級,升級過程請看https://github.com/TomPallister/Ocelot/issues/114 。昨天我花了半小時就把個人另一個POC項目Nanofabric https://github.com/geffzhang/NanoFabric 升級到了.NET Core 2.0, 這個POC項目也是個人分享的項目的原型,能夠這麼說.NET Core 2.0 8月份正式發佈,通過3 個月時間的發展,社區生態已經都已經作好了準備,開發新項目能夠採用.NET Core 2,Ocelot 是一個集成社區中衆多優秀開源項目的表明。git
業務的飛速發展,產生的很是多的對外的服務接口,分散在組織的各個地方須要進行統一的管理,並且咱們的環境是linux和windows的混合環境,咱們的目標是統一在公司的Linux環境,.NET Core對於.NET 技術團隊來講是一個很是棒的技術,並且.NET Core自己的架構很是好,性能就更好了。github
這裏列出了Ocelot目前支持的特性:編程
更詳細的內容參看文檔 https://github.com/TomPallister/Ocelot/wiki windows
上面介紹了Ocelot的功能特性,接下來咱們進入介紹Ocelot 的實現原理剖析,核心是是ASP.NET Core Middleware 以及 ASP.NET Core DependencyInjection:架構
ASP.NET Core 傳統的ASP.NET 在架構上有很大的改進,更加的模塊化,下圖形象的說明了他們之間區別,Application 和 Middleware 是平等的,好比ASP.NET Core MVC也是一個Middleware,經過Middleware這樣的結構咱們很是容易的擴展咱們的應用程序。mvc
Ocelot就是使用Middleware來完成網關的全部功能,每一個小功能就是一個Middleware,具體能夠看代碼 https://github.com/TomPallister/Ocelot/blob/develop/src/Ocelot/Middleware/OcelotMiddlewareExtensions.cs ,Ocelot 是如何把各個Middleware串起來協同完成一個API網關的功能。 asp.net core 很是巧妙的設計,把Middleware抽象成了一個委託RequestDelegate, ASP.NET Core 的每一個 Request 都會通過每一個所註冊的 Middleware,Response 也是逐一回傳,以先進後出的方式處理每個封包:框架
具體內容參考: ASP.NET Core HTTP 管道中的那些事兒 和 如何一秒鐘從頭構建一個 ASP.NET Core 中間件, 咱們在Middleware的編程過程當中須要關注HttpContext 以及管道的註冊者和構建者 ApplicationBuilder。asp.net
ASP.NET Core 使用了大量的 DI (Dependency Injection) 設計,一樣咱們在Ocelot的設計中也使用了大量的DI設計,具體參看源碼https://github.com/TomPallister/Ocelot/blob/develop/src/Ocelot/DependencyInjection/ServiceCollectionExtensions.cs
註冊 Service 有分三種方式:
下面這張圖來自https://blog.johnwu.cc/article/asp-net-core-dependency-injection.html ,形象的演示了對象生命週期。
上面介紹完了Ocelot開發的基本原理,目前Ocelot 由17 個Middleware 來完成,在每一個Middleware的內部實現上還有涉及到不少業務的知識,本篇文章先不作展開,後續寫具體的文章詳細解析。接下來咱們來講說如何自定義擴展,在咱們的項目中主要在三個方面進行了擴展:
一、自定義擴展API 接口驗證
Ocelot 默認支持基於IdentityServer4的認證,須要自定義認證,能夠參考 https://github.com/TomPallister/Ocelot/pull/110,添加自定義的驗證,可是.net core 2.0 認證部分基本上重寫了。
二、自定義擴展下游通信協議
Ocelot 默認支持Http的通信,在咱們的實際項目中有不少老的服務是RPC調用,使用的是私有的Relay通信框架,在API網關上須要作協議轉換,自動將Http的請求轉換成Relay的tcp通信。
三、自定義管理控制檯
ocelot 有管理API,能夠基於管理API 作自定義的管理控制檯,github 有個 https://github.com/dbarkwell/Ocelot.ConfigEditor,這個項目實現了asp.net core mvc 的在線編輯路由。