天天看點

Ocelot API網關的實作剖析

在微軟Tech Summit 2017 大會上和大家分享了一門課程《.NET Core 在騰訊财付通的企業級應用開發實踐》,其中重點是基于ASP.NET Core打造可擴充的高性能企業級API網關,以開源的API網關Ocelot為基礎結合自己的業務特性,當天課程隻有40分鐘,有很多内容都沒有展開,接下來就用一篇小文章來聊下Ocelot 的實作原理,大家在使用的過程中也可以一起來貢獻。 總體來說這是一個ASP.NET Core 進階程式設計的内容,之前在公衆号裡已經發過不少各位朋友寫的文章,今天都會在這篇文章中引用,讓你進一步深入學習。

Ocelot API網關的實作剖析
我在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 是一個內建社群中衆多優秀開源項目的代表。
Ocelot API網關的實作剖析
Ocelot API網關的實作剖析
業務的飛速發展,産生的非常多的對外的服務接口,分散在組織的各個地方需要進行統一的管理,而且我們的環境是linux和windows的混合環境,我們的目标是統一在公司的Linux環境,.NET Core對于.NET 技術團隊來說是一個非常棒的技術,而且.NET Core本身的架構非常好,性能就更好了。
Ocelot API網關的實作剖析
Ocelot API網關的實作剖析
這裡列出了Ocelot目前支援的特性:

  • Routing
    • 使用者可以指定上遊請求之間的映射,并将其轉發到下遊服務上的不同URL。
  • Service Discovery
    • Ocelot可以檢視你的服務發現,并找到它應該轉發下遊請求的服務。它可以在這些服務之間進行負載平衡。.
  • Authentication using IdentityServer
    • 您可以将端點标記為已認證,并使用IdentityServer承載标記對您的使用者進行身份驗證.
  • Authorisation using Claims
    • 如果使用 bearer tokens, 可以使用 claims 标記特定 endpoints是授權的
  • Claims Transformation
    • Ocelot提供了一種文法來轉換給下遊請求,并将聲明資料添加到标題,URL參數,其他聲明等等
  • Quality of service
    • Retries, circuit breaker, timeouts etc.
  • Request / Correlation Ids
  • Caching
  • Logging
  • Custom Middleware

更詳細的内容參看文檔 https://github.com/TomPallister/Ocelot/wiki 

上面介紹了Ocelot的功能特性,接下來我們進入介紹Ocelot 的實作原理剖析,核心是是ASP.NET Core Middleware 以及 ASP.NET Core DependencyInjection:

Ocelot API網關的實作剖析

ASP.NET Core 傳統的ASP.NET 在架構上有很大的改進,更加的子產品化,下圖形象的說明了他們之間差別,Application 和 Middleware 是平等的,比如ASP.NET Core MVC也是一個Middleware,通過Middleware這樣的結構我們非常容易的擴充我們的應用程式。

Ocelot API網關的實作剖析

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 也是逐一回傳,以先進後出的方式處理每一個封包:

Ocelot API網關的實作剖析

具體内容參考: ASP.NET Core HTTP 管道中的那些事兒 和 如何一秒鐘從頭建構一個 ASP.NET Core 中間件, 我們在Middleware的程式設計過程中需要關注HttpContext 以及管道的注冊者和建構者 ApplicationBuilder。

ASP.NET Core 使用了大量的 DI (Dependency Injection) 設計,同樣我們在Ocelot的設計中也使用了大量的DI設計,具體參看源碼https://github.com/TomPallister/Ocelot/blob/develop/src/Ocelot/DependencyInjection/ServiceCollectionExtensions.cs 

注冊 Service 有分三種方式:

  • Transient  每次注入時,都重新 new 一個新的實體。
  • Scoped    每個 Request 都重新 new 一個新的實體。
  • Singleton 程式啟動後會 new 一個實體。也就是運作期間隻會有一個實體。

下面這張圖來自https://blog.johnwu.cc/article/asp-net-core-dependency-injection.html ,形象的示範了對象生命周期。

  • A 為 Singleton
  • B 為 Scoped
  • C 為 Transient

上面介紹完了Ocelot開發的基本原理,目前Ocelot 由17 個Middleware 來完成,在每個Middleware的内部實作上還有涉及到很多業務的知識,本篇文章先不做展開,後續寫具體的文章詳細解析。接下來我們來說說如何自定義擴充,在我們的項目中主要在三個方面進行了擴充:

1、自定義擴充API 接口驗證

Ocelot API網關的實作剖析

Ocelot 預設支援基于IdentityServer4的認證,需要自定義認證,可以參考 https://github.com/TomPallister/Ocelot/pull/110,添加自定義的驗證,但是.net core 2.0 認證部分基本上重寫了。

2、自定義擴充下遊通訊協定

Ocelot API網關的實作剖析

Ocelot 預設支援Http的通訊,在我們的實際項目中有很多老的服務是RPC調用,使用的是私有的Relay通訊架構,在API網關上需要做協定轉換,自動将Http的請求轉換成Relay的tcp通訊。

3、自定義管理控制台

Ocelot API網關的實作剖析

ocelot 有管理API,可以基于管理API 做自定義的管理控制台,github 有個 https://github.com/dbarkwell/Ocelot.ConfigEditor,這個項目實作了asp.net core mvc 的線上編輯路由。

歡迎大家關注微信号opendotnet,微信公衆号名稱:dotNET跨平台。公衆号文章彙總網站 http://www.csharpkit.com , 掃下面的二維碼或者收藏下面的二維碼關注吧(長按下面的二維碼圖檔、并選擇識别圖中的二維碼)

繼續閱讀