1. 程式人生 > >LindDotNetCore~Ocelot實現微服務閘道器

LindDotNetCore~Ocelot實現微服務閘道器

回到目錄

閘道器在硬體裡有自己的定義,而在軟體架構裡也有自己的解釋,它就是所有請求的入口,請求打到閘道器上,經過處理和加工,再返回給客戶端,這個處理過程中當然就是閘道器的核心,也是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這個子站上!

這樣,我們的閘道器就算是跑起來了,所有專案有自己的路由模版,根據路由來查詢服務!所有服務在外面看上去都像一個網站!

回到目錄