.NET Core微服务之基于Ocelot实现API网关服务
一、啥是API網(wǎng)關(guān)?
API 網(wǎng)關(guān)一般放到微服務的最前端,并且要讓API 網(wǎng)關(guān)變成由應用所發(fā)起的每個請求的入口。這樣就可以明顯的簡化客戶端實現(xiàn)和微服務應用程序之間的溝通方式。以前的話,客戶端不得不去請求微服務A(假設(shè)為Customers),然后再到微服務B(假設(shè)為Orders),然后是微服務C(假設(shè)為Invoices)。客戶端需要去知道怎么去一起來消費這三個不同的service。使用API網(wǎng)關(guān),我們可以抽象所有這些復雜性,并創(chuàng)建客戶端們可以使用的優(yōu)化后的端點,并向那些模塊們發(fā)出請求。API網(wǎng)關(guān)的核心要點是:所有的客戶端和消費端都通過統(tǒng)一的網(wǎng)關(guān)接入微服務,在網(wǎng)關(guān)層處理所有的非業(yè)務功能(比如驗證、鑒權(quán)、監(jiān)控等等)。
關(guān)于API網(wǎng)關(guān),個人覺得園友楊曉東的這篇文章《談談微服務中的API網(wǎng)關(guān)》值得一讀。微服務架構(gòu)中的任何一個環(huán)節(jié),都是可以說很久的,而我沒有太多經(jīng)驗,也就不多談了。
二、開源項目:Ocelot
Ocelot是一個使用.NET Core平臺上的一個API Gateway,這個項目的目標是在.NET上面運行微服務架構(gòu)。Ocelot框架內(nèi)部集成了IdentityServer(身份驗證)和Consul(服務注冊發(fā)現(xiàn)),還引入了Polly(上一篇博文中提到過)來處理進行故障處理。目前,騰訊和微軟是Ocelot在官網(wǎng)貼出來的客戶,我想也是因為這兩家公司都是巨頭,所以要標榜一下,哈哈。
Ocelot github :?https://github.com/TomPallister/Ocelot
三、快速開始第一個API網(wǎng)關(guān)
3.1 安裝Ocelot
NuGet>Install-Package Ocelot
3.2 快速準備兩個API服務
(1)準備一個ClientService
創(chuàng)建一個ASP.NET Core WebAPI程序,保留默認ValuesController,做一下修改:
?
(2)準備一個ProductService
創(chuàng)建一個ASP.NET Core WebAPI程序,保留默認ValuesController,做一下修改:
3.3 靜態(tài)配置兩個API服務
(1)新建一個json文件:eg.configuration.json
首先,一個最基本的配置文件如下:
{"ReRoutes": [],"GlobalConfiguration": {"BaseUrl": "https://api.mybusiness.com"} }這里特別注意一下BaseUrl是我們外部暴露的Url,比如我們的Ocelot運行在http://123.111.11.1的一個地址上,但是前面有一個Nginx綁定了域名http://api.edisonchou.cn,那這里我們的BaseUrl就是 http://api.edisonchou.cn。現(xiàn)在我們的實驗環(huán)境不存在這個條件,所以我們暫時不需要配置這個option。下面我們根據(jù)模板將剛剛創(chuàng)建并啟動的兩個Service的信息進行了配置:
其中,我們得了解一下微服務架構(gòu)中的上游服務器和下游服務器,一般下游服務器指的是提供API服務的REST Service Server(比如WebAPI、WCF App等),而上游服務器則指的是提供Web網(wǎng)頁服務的Web Server(比如MVC Application,可能需要訪問REST Service)。那么,這里我們可以了解到:
Downstream 是下游服務配置 => 即我們剛剛創(chuàng)建的提供API服務的配置,我們會指定PathTemplate,Host和Port等信息(具體調(diào)哪一臺服務器是由我說了算)
UpStream 是上游服務配置 => 即服務消費方(eg.MVC Server, SPA App)的調(diào)用配置(你要怎么按照什么URL格式和什么HTTP類型調(diào)用我才能理解)
通過配置文件,我們可以猜測Ocelot的實現(xiàn)原理大致應該就是把客戶端對網(wǎng)關(guān)的請求(Request),按照configuration.json的映射配置,轉(zhuǎn)發(fā)給對應的后端http service,然后從后端http service獲取響應(Response)后,再返回給客戶端。當然,具體細節(jié)應該十分復雜,等后面有時間深入看看實現(xiàn)機制。
其他不再解釋,可以看明白,另外,需要對這個配置文件進行以下設(shè)置:為了確保直接運行時能夠找到這個configuration.json文件
*.通過配置文件可以完成對Ocelot的功能配置:路由、服務聚合、服務發(fā)現(xiàn)、認證、鑒權(quán)、限流、熔斷、緩存、Header頭傳遞等。在配置文件中包含兩個根節(jié)點:ReRoutes和GlobalConfiguration。ReRoutes是一個數(shù)組,其中的每一個元素代表了一個路由,我們可以針對每一個路由進行以上功能配置。
(2)改寫Program和StartUp類,才能正常使用Ocelot
①在Program類的BuildWebHost中讓程序讀取configuration.json文件
②在StartUp類中為Ocelot注入配置,并啟動Ocelot
3.3 測試一下
(1)先啟動ClientService和ProductService => 也可以通過在VS中更改啟動順序來指定
(2)再啟動APIGateway,在瀏覽器中直接訪問API網(wǎng)關(guān)所在的地址和端口(這里是192.168.2.231:8800)進行測試:先請求ClientService,再請求ProductService,可以看到API網(wǎng)關(guān)對請求進行了轉(zhuǎn)發(fā),服務消費方不需要記住每個service所在的IP和端口,而是只需要告訴網(wǎng)關(guān)我需要消費哪個service即可。
*.tip:這里配置的PathTemplate大小寫不敏感,可以選擇通過設(shè)置ReRouteIsCaseSensitive:true來實現(xiàn)大小寫敏感
到這里,第一個API網(wǎng)關(guān)的實現(xiàn)就結(jié)束了,但是對于眾多的微服務,如果我們都一一硬編碼地配置其IP和Port在配置文件中,不適合微服務架構(gòu)的風格,因為眾多的服務地址變化會讓靜態(tài)配置的工作變得越來越大。因此,我們學習了服務發(fā)現(xiàn),那么是否可以結(jié)合服務發(fā)現(xiàn)呢?Ocelot + Consul的方式為我們給出了答案。
四、Ocelot+Consul的結(jié)合
4.1 實驗節(jié)點部署結(jié)構(gòu)
這里仍然采用之前的Consul實驗集群,三個Consul Server節(jié)點(1個leader,2個follwer),一個Consul Client節(jié)點(部署了兩個服務ClientService和ProductService),以及一個API網(wǎng)關(guān)節(jié)點(基于Ocelot)。
4.2 啟動Consul
啟動方式以及步驟這里不再贅述,如不了解請瀏覽我的前兩篇博文《.NET Core微服務之基于Consul實現(xiàn)服務治理》以及《.NET Core微服務之基于Consul實現(xiàn)服務治理(續(xù))》。這里可以看到,我們已經(jīng)成功地注冊了ClientService和ProductService。
4.3 啟動API Gateway
(1)為了適配Consul服務發(fā)現(xiàn),減少服務IP和Port的hard-code,我們需要改一下配置文件:
Ocelot提供了基本的負載均衡選項(LoadBalanceOptions):輪詢和最小連接數(shù),如果我們部署了多個一樣的服務,那么我們設(shè)置一個選項。
(2)其他代碼無須更改,對于基本用法,我們要做的基本只是對配置文件的修改。配置完成后,即可啟動API網(wǎng)關(guān)項目。
4.4 測試
(1)請求ClientService
(2)請求ProductService
五、小結(jié)
本篇介紹了API網(wǎng)關(guān)的基礎(chǔ)概念以及一個基于適合于.NET Core的開源項目Ocelot,并通過兩個小案例(一個靜態(tài)配置服務,一個結(jié)合Consul服務發(fā)現(xiàn))來了解了API網(wǎng)關(guān)的作用和Ocelot的最基礎(chǔ)的用法。下一篇會繼續(xù)Ocelot的一些比較有用的功能(比如:限流、熔斷、緩存,以及結(jié)合Swagger),繼續(xù)做一些實踐,也希望到時可以總結(jié)下來與各位園友分享。
參考資料
楊曉東,《談談微服務中的API網(wǎng)關(guān)》
桂素偉,《Ocelot + Consul實踐》
楊中科,《.NET微服務直播課課件pdf》
李朝強,《ASP.NET Core API網(wǎng)關(guān)Ocelot》
jesse 騰飛,《.NET Core開源API網(wǎng)關(guān) – Ocelot中文文檔》
Ocelot官網(wǎng):https://github.com/ThreeMammals/Ocelot?=>?tip:?張善友大隊長為主要貢獻者之一
Ocelot官方文檔:http://ocelot.readthedocs.io/en/latest/index.html
相關(guān)文章:
.NET Core微服務之基于Consul實現(xiàn)服務治理
.NET Core微服務之基于Consul實現(xiàn)服務治理(續(xù))
.NET Core微服務之基于Polly+AspectCore實現(xiàn)熔斷與降級機制
原文地址: http://www.cnblogs.com/szlblog/p/9164419.html
.NET社區(qū)新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com
總結(jié)
以上是生活随笔為你收集整理的.NET Core微服务之基于Ocelot实现API网关服务的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Razor Page Library:开
- 下一篇: [译]RabbitMQ教程C#版 - 发