LindDotNetCore~Ocelot實現微服務閘道器
阿新 • • 發佈:2018-12-30
閘道器在硬體裡有自己的定義,而在軟體架構裡也有自己的解釋,它就是所有請求的入口,請求打到閘道器上,經過處理和加工,再返回給客戶端,這個處理過程中當然就是閘道器的核心,也是Ocelot的核心,我們可以把使用者授權,校驗,快取,認證等很多關注點在閘道器中實現!
定義
API閘道器是一個伺服器,是系統的唯一入口。從面向物件設計的角度看,它與外觀模式類似。API閘道器封裝了系統內部架構,為每個客戶端提供一個定製的API。它可能還具有其它職責,如身份驗證、監控、負載均衡、快取、請求分片與管理、靜態響應處理。
例如:手機和WEB網站都需要呼叫API介面,它們直接與閘道器進行通訊,而不用關心具體的服務是A還是B
專案Demo
安裝Ocelot包:Install-Package Ocelot
建立兩個專案,閘道器主專案,DemoA和DemoB,這樣A和B兩個專案都會指定閘道器專案,通過訪問閘道器就可以訪問這兩個專案了.
Gateway閘道器專案,埠是5000
DemoA專案,埠是5001
DemoB專案,埠是5002
在Gateway專案新增配置檔案configuration.json,將它複製到輸出目錄,右鍵-屬性-始終複製
{ "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": [] } } ] }
現時在閘道器裡配置子服務時,也支援路由規則,如控制器,Action時,如果你希望匹配以某個字元作為字首的Restful標準的,可以通過下面程式碼進行配置
{ "DownstreamPathTemplate": "/api/{controller}", "DownstreamScheme": "http", "DownstreamPort": 5001, "DownstreamHost": "localhost", "UpstreamPathTemplate": "/api/{controller}", "UpstreamHttpMethod": [ "Get", "Post", "Put", "Delete" ], },
在閘道器的啟動時,把配置檔案注入
public static IWebHost BuildWebHost(string[] args) { IWebHostBuilder builder = new WebHostBuilder(); //注入WebHostBuilder return builder.ConfigureServices(service => { service.AddSingleton(builder); }).ConfigureAppConfiguration(conbuilder => { conbuilder.AddJsonFile("configuration.json"); }).UseKestrel() .UseUrls("http://*:5000") .UseStartup<Startup>() .Build(); }
新增ocelot的中介軟體和服務
services.AddOcelot(Configuration as ConfigurationRoot); app.UseOcelot().Wait();
除錯多個專案,這時我們的 5000和5001埠都會被監聽,我們輸入之間配置的api/polly路徑,然後就可以看到它會自己繫結到5001這個子站上!
這樣,我們的閘道器就算是跑起來了,所有專案有自己的路由模版,根據路由來查詢服務!所有服務在外面看上去都像一個網站!