Ocelot API网关的实现剖析
轉(zhuǎn):https://www.cnblogs.com/shanyou/p/7787183.html
在微軟Tech Summit 2017 大會(huì)上和大家分享了一門(mén)課程《.NET Core 在騰訊財(cái)付通的企業(yè)級(jí)應(yīng)用開(kāi)發(fā)實(shí)踐》,其中重點(diǎn)是基于ASP.NET Core打造可擴(kuò)展的高性能企業(yè)級(jí)API網(wǎng)關(guān),以開(kāi)源的API網(wǎng)關(guān)Ocelot為基礎(chǔ)結(jié)合自己的業(yè)務(wù)特性,當(dāng)天課程只有40分鐘,有很多內(nèi)容都沒(méi)有展開(kāi),接下來(lái)就用一篇小文章來(lái)聊下Ocelot 的實(shí)現(xiàn)原理,大家在使用的過(guò)程中也可以一起來(lái)貢獻(xiàn)。 總體來(lái)說(shuō)這是一個(gè)ASP.NET Core 高級(jí)編程的內(nèi)容,之前在公眾號(hào)里已經(jīng)發(fā)過(guò)不少各位朋友寫(xiě)的文章,今天都會(huì)在這篇文章中引用,讓你進(jìn)一步深入學(xué)習(xí)。
?
我在github上的地址https://github.com/geffzhang?歡迎互粉,Ocelot在github的地址?https://github.com/TomPallister/Ocelot?, 非常給力的是在課程當(dāng)天完成了.NET Core 2.0的升級(jí),升級(jí)過(guò)程請(qǐng)看https://github.com/TomPallister/Ocelot/issues/114?。昨天我花了半小時(shí)就把我的另外一個(gè)POC項(xiàng)目Nanofabric???https://github.com/geffzhang/NanoFabric?升級(jí)到了.NET Core 2.0, 這個(gè)POC項(xiàng)目也是我的分享的項(xiàng)目的原型,可以這么說(shuō).NET Core 2.0 8月份正式發(fā)布,經(jīng)過(guò)3 個(gè)月時(shí)間的發(fā)展,社區(qū)生態(tài)已經(jīng)都已經(jīng)做好了準(zhǔn)備,開(kāi)發(fā)新項(xiàng)目可以采用.NET Core 2,Ocelot 是一個(gè)集成社區(qū)中眾多優(yōu)秀開(kāi)源項(xiàng)目的代表。
業(yè)務(wù)的飛速發(fā)展,產(chǎn)生的非常多的對(duì)外的服務(wù)接口,分散在組織的各個(gè)地方需要進(jìn)行統(tǒng)一的管理,而且我們的環(huán)境是linux和windows的混合環(huán)境,我們的目標(biāo)是統(tǒng)一在公司的Linux環(huán)境,.NET Core對(duì)于.NET 技術(shù)團(tuán)隊(duì)來(lái)說(shuō)是一個(gè)非常棒的技術(shù),而且.NET Core本身的架構(gòu)非常好,性能就更好了。
這里列出了Ocelot目前支持的特性:
- Routing
- 用戶可以指定上游請(qǐng)求之間的映射,并將其轉(zhuǎn)發(fā)到下游服務(wù)上的不同URL。
- Service Discovery
-
- Ocelot可以查看你的服務(wù)發(fā)現(xiàn),并找到它應(yīng)該轉(zhuǎn)發(fā)下游請(qǐng)求的服務(wù)。它可以在這些服務(wù)之間進(jìn)行負(fù)載平衡。.
- Authentication using IdentityServer
- 您可以將端點(diǎn)標(biāo)記為已認(rèn)證,并使用IdentityServer承載標(biāo)記對(duì)您的用戶進(jìn)行身份驗(yàn)證.
- Authorisation using Claims
- 如果使用 bearer tokens, 可以使用 claims 標(biāo)記特定 endpoints是授權(quán)的
- Claims Transformation
- Ocelot提供了一種語(yǔ)法來(lái)轉(zhuǎn)換給下游請(qǐng)求,并將聲明數(shù)據(jù)添加到標(biāo)題,URL參數(shù),其他聲明等等
- Quality of service
- Retries, circuit breaker, timeouts etc.
- Request / Correlation Ids
- Caching
- Logging
- Custom Middleware
更詳細(xì)的內(nèi)容參看文檔?https://github.com/TomPallister/Ocelot/wiki?
上面介紹了Ocelot的功能特性,接下來(lái)我們進(jìn)入介紹Ocelot 的實(shí)現(xiàn)原理剖析,核心是是ASP.NET Core Middleware 以及 ASP.NET Core DependencyInjection:
ASP.NET Core 傳統(tǒng)的ASP.NET 在架構(gòu)上有很大的改進(jìn),更加的模塊化,下圖形象的說(shuō)明了他們之間區(qū)別,Application 和 Middleware 是平等的,比如ASP.NET Core MVC也是一個(gè)Middleware,通過(guò)Middleware這樣的結(jié)構(gòu)我們非常容易的擴(kuò)展我們的應(yīng)用程序。
Ocelot就是使用Middleware來(lái)完成網(wǎng)關(guān)的所有功能,每個(gè)小功能就是一個(gè)Middleware,具體可以看代碼?https://github.com/TomPallister/Ocelot/blob/develop/src/Ocelot/Middleware/OcelotMiddlewareExtensions.cs?,Ocelot 是如何把各個(gè)Middleware串起來(lái)協(xié)同完成一個(gè)API網(wǎng)關(guān)的功能。 asp.net core 非常巧妙的設(shè)計(jì),把Middleware抽象成了一個(gè)委托RequestDelegate, ASP.NET Core 的每個(gè) Request 都會(huì)經(jīng)過(guò)每個(gè)所注冊(cè)的 Middleware,Response 也是逐一回傳,以先進(jìn)后出的方式處理每一個(gè)封包:
具體內(nèi)容參考:?ASP.NET Core HTTP 管道中的那些事兒?和?如何一秒鐘從頭構(gòu)建一個(gè) ASP.NET Core 中間件, 我們?cè)贛iddleware的編程過(guò)程中需要關(guān)注HttpContext 以及管道的注冊(cè)者和構(gòu)建者 ApplicationBuilder。
?
ASP.NET Core 使用了大量的 DI (Dependency Injection) 設(shè)計(jì),同樣我們?cè)贠celot的設(shè)計(jì)中也使用了大量的DI設(shè)計(jì),具體參看源碼https://github.com/TomPallister/Ocelot/blob/develop/src/Ocelot/DependencyInjection/ServiceCollectionExtensions.cs?
注冊(cè) Service 有分三種方式:
- Transient? 每次注入時(shí),都重新 new 一個(gè)新的實(shí)體。
- Scoped??? 每個(gè) Request 都重新 new 一個(gè)新的實(shí)體。
- Singleton 程序啟動(dòng)后會(huì) new 一個(gè)實(shí)體。也就是運(yùn)行期間只會(huì)有一個(gè)實(shí)體。
下面這張圖來(lái)自https://blog.johnwu.cc/article/asp-net-core-dependency-injection.html?,形象的演示了對(duì)象生命周期。
- A 為 Singleton
- B 為 Scoped
- C 為 Transient
上面介紹完了Ocelot開(kāi)發(fā)的基本原理,目前Ocelot 由17 個(gè)Middleware 來(lái)完成,在每個(gè)Middleware的內(nèi)部實(shí)現(xiàn)上還有涉及到很多業(yè)務(wù)的知識(shí),本篇文章先不做展開(kāi),后續(xù)寫(xiě)具體的文章詳細(xì)解析。接下來(lái)我們來(lái)說(shuō)說(shuō)如何自定義擴(kuò)展,在我們的項(xiàng)目中主要在三個(gè)方面進(jìn)行了擴(kuò)展:
1、自定義擴(kuò)展API 接口驗(yàn)證
Ocelot 默認(rèn)支持基于IdentityServer4的認(rèn)證,需要自定義認(rèn)證,可以參考?https://github.com/TomPallister/Ocelot/pull/110,添加自定義的驗(yàn)證,但是.net core 2.0 認(rèn)證部分基本上重寫(xiě)了。
2、自定義擴(kuò)展下游通訊協(xié)議
Ocelot 默認(rèn)支持Http的通訊,在我們的實(shí)際項(xiàng)目中有很多老的服務(wù)是RPC調(diào)用,使用的是私有的Relay通訊框架,在API網(wǎng)關(guān)上需要做協(xié)議轉(zhuǎn)換,自動(dòng)將Http的請(qǐng)求轉(zhuǎn)換成Relay的tcp通訊。
3、自定義管理控制臺(tái)
ocelot 有管理API,可以基于管理API 做自定義的管理控制臺(tái),github 有個(gè)?https://github.com/dbarkwell/Ocelot.ConfigEditor,這個(gè)項(xiàng)目實(shí)現(xiàn)了asp.net core mvc 的在線編輯路由。
總結(jié)
以上是生活随笔為你收集整理的Ocelot API网关的实现剖析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 卿本佳人奈何做贼可以形容什么(卿本佳人
- 下一篇: 出口货物退运返修流程(出口国外货物退运返