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