Ocelot 入门Demo系列(01-Ocelot极简单Demo及负载均衡的配置)
來源:https://www.cnblogs.com/7tiny/p/10493805.html
【前言】
Ocelot是一個用.NET Core實現(xiàn)并且開源的API網(wǎng)關(guān),它功能強大,包括了:路由、請求聚合、服務(wù)發(fā)現(xiàn)、認(rèn)證、鑒權(quán)、限流熔斷、并內(nèi)置了負(fù)載均衡器與Service Fabric、Butterfly Tracing集成。這些功能只都只需要通過一個統(tǒng)一的Ocelot.Json配置文件簡單的配置即可完成。
簡單的來說Ocelot是一堆的asp.net core?middleware組成的一個管道。
當(dāng)它拿到請求之后會用一個request builder來構(gòu)造一個HttpRequestMessage發(fā)到下游的真實服務(wù)器,等下游的服務(wù)返回response之后再由一個middleware將它返回的HttpResponseMessage映射到HttpResponse上。
Ocelot的基本使用
用一臺web service來host Ocelot,在這里有一個json配置文件,里面設(shè)置了所有對當(dāng)前這個網(wǎng)關(guān)的配置。它會接收所有的客戶端請求,并路由到對應(yīng)的下游服務(wù)器進(jìn)行處理,再將請求結(jié)果返回。而這個上下游請求的對應(yīng)關(guān)系也被稱之為路由。
集成Identity Server
當(dāng)我們涉及到認(rèn)證和鑒權(quán)的時候,我們可以跟Identity Server進(jìn)行結(jié)合。當(dāng)網(wǎng)關(guān)需要請求認(rèn)證信息的時候會與Identity Server服務(wù)器進(jìn)行交互來完成。
網(wǎng)關(guān)集群
只有一個網(wǎng)關(guān)是很危險的,也就是我們通常所講的單點,只要它掛了,所有的服務(wù)全掛。這顯然無法達(dá)到高可用,所以我們也可以部署多臺網(wǎng)關(guān)。當(dāng)然這個時候在多臺網(wǎng)關(guān)前,你還需要一臺負(fù)載均衡器。
Consul?服務(wù)發(fā)現(xiàn)
在Ocelot已經(jīng)支持簡單的負(fù)載功能,也就是當(dāng)下游服務(wù)存在多個結(jié)點的時候,Ocelot能夠承擔(dān)起負(fù)載均衡的作用。但是它不提供健康檢查,服務(wù)的注冊也只能通過手動在配置文件里面添加完成。這不夠靈活并且在一定程度下會有風(fēng)險。這個時候我們就可以用Consul來做服務(wù)發(fā)現(xiàn),它能與Ocelot完美結(jié)合。
【Demo】
本篇文章為Ocelot入門的第一步要走的步驟,使用Ocelot作為微服務(wù)的網(wǎng)關(guān)
Ocelot網(wǎng)關(guān)api的創(chuàng)建
三個下游Demo微服務(wù)接口的創(chuàng)建
?網(wǎng)關(guān)輪詢負(fù)載均衡的演示
【實現(xiàn)過程】
一、創(chuàng)建下游微服務(wù)
1.?新建3個asp.net?core?webapi項目,分別命名為Service1,Service2,Service3
2.?將三個項目的啟動端口分別設(shè)置為39991,39992,39993
在每個服務(wù)的屬性設(shè)置中將服務(wù)的host端口略作修改,分別叫做39991,39992,39993
3.?將默認(rèn)的/api/values接口的返回值稍做修改,讓其比較明顯對應(yīng)三個端口
?打開默認(rèn)生成的/api/Values控制器Action,改造原來的Get方法返回值,讓其對應(yīng)三個端口以便提高區(qū)分度
例如Service1:
Service2和Service3依次修改
二、Ocelot網(wǎng)關(guān)Api
1.?新建一個asp.net?core?webapi項目,命名為OcelotGateway
2.?該項目引入Nuget: Ocelot?最新穩(wěn)定版
3.?根目錄添加配置文件Ocelot.json,添加上述三個api地址信息
根目錄下新建一個Jso文件
內(nèi)容如下(最簡單的配置,采用默認(rèn)路由模板):
1 {
2 "ReRoutes": [
3 {
4 // - 上游服務(wù)配置
5 "UpstreamPathTemplate": "/{url}",
6 "UpstreamHttpMethod": [ "Get", "Post", "Put", "Delete" ],
7
8 // - 下游服務(wù)配置
9 "DownstreamPathTemplate": "/{url}",
10 "DownstreamScheme": "http",
11 "DownstreamHostAndPorts": [
12 {
13 "Host": "localhost",
14 "Port": 39991
15 },
16 {
17 "Host": "localhost",
18 "Port": 39992
19 },
20 {
21 "Host": "localhost",
22 "Port": 39993
23 }
24 ],
25
26 // - LoadBalancer將決定負(fù)載均衡的算法,三種取值
27 // RoundRobin:輪流發(fā)送
28 // LeastConnection:將請求發(fā)往最空閑的那個服務(wù)器
29 // NoLoadBalance:總是發(fā)往第一個請求或者是服務(wù)發(fā)現(xiàn)
30 "LoadBalancerOptions": {
31 "Type": "RoundRobin"
32 }
33 }
34 ],
35 "GlobalConfiguration": {
36 "BaseUrl": "https://api.mybusiness.com"
37 }
38 }
里面指定了相關(guān)配置項:
上游服務(wù)器請求路由模板
下游服務(wù)器轉(zhuǎn)發(fā)時的請求路由模板
下游服務(wù)器的三個相同api的不同地址(模擬負(fù)載均衡)
負(fù)載均衡的策略(輪詢)
4.?調(diào)整OcelotGateway項目的Programe和Start需要配置的相關(guān)代碼(詳情見代碼)
?修改Program.cs文件,引入Ocelot.Json
改造StartUp.cs文件的配置項,.netcore請求管道內(nèi)加入Ocelot
三、運行
1.?先同時運行三個下游微服務(wù),可以看到三個瀏覽器窗口分別返回了三個接口對應(yīng)的返回值
可以在vs中設(shè)置多啟動項,讓三個服務(wù)同時啟動
然后我們運行三個服務(wù),可以看到三個瀏覽器窗口分別打開了三個服務(wù),并返回了Demo api的返回值
三個微服務(wù)啟動成功
2.?運行OcelotGateway項目,可以看到返回了第一個下游微服務(wù)的返回值
我們單獨運行OcelotGateway項目
可以看到Ocelot服務(wù)也被host成功
并且通過通用模板轉(zhuǎn)發(fā)到了其中一個微服務(wù)上,返回了響應(yīng)值。
3.?刷新Gateway項目的窗口,可以看到根據(jù)我們配置的輪詢復(fù)雜均衡策略分別輪詢地返回了三個接口的結(jié)果
?既然我們配置了輪詢的負(fù)載均衡,那么我們刷新Gateway項目地址看是否會分別請求到三個微服務(wù)上。
?Gif版本:
可以看到,相同的請求被轉(zhuǎn)發(fā)到了不通的api接口上,且是按我們配置的負(fù)載均衡策略順序輪詢轉(zhuǎn)發(fā)
【項目源碼】
項目源碼已托管至GitHub:https://github.com/sevenTiny/Demo.Ocelot
說明:為了更好地展示我們的項目配置是漸進(jìn)性的,我們采用分支策略來展示不同階段的Demo成果,master分支為當(dāng)前所有配置的功能總和
例如:roadmap-01分支對應(yīng)我們本篇文章的源代碼,對應(yīng)說明文檔 “01-Ocelot極簡單Demo及負(fù)載均衡的配置”
原文地址:https://www.cnblogs.com/7tiny/p/10493805.html
.NET社區(qū)新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com
總結(jié)
以上是生活随笔為你收集整理的Ocelot 入门Demo系列(01-Ocelot极简单Demo及负载均衡的配置)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SignalR2结合ujtopo实现拓扑
- 下一篇: 开源组件ExcelReport 3.x.