Consul+Ocelot+Polly在.NetCore中使用(.NET5)-網關Ocelot+Consul

相關文章

Consul+Ocelot+Polly在.NetCore中使用(.NET5)-Consul服務註冊,服務發現

Consul+Ocelot+Polly在.NetCore中使用(.NET5)-網關Ocelot+Consul

一、簡介

 前一篇Consul中有個問題是,所有客戶端都要和Consul進行連接,且直接拿到了所有的服務實例,這就直接把全部的服務實例暴露出來了,所以需要用網關來隔離客戶端和服務實例,

所有api請求都從網關進入。

 

 

 Ocelot作為一個網關應用,主要的功能有路由、請求聚合、服務發現、統一認證、統一鑒權、限流熔斷、並內置了負載均衡器等的集成。而且這些功能都只需要簡單的配置即可完成。

 

二、使用Ocelot

2.1應用配置

新建一個.NetCore項目作網關應用。

安裝NuGet包 

Ocelot

Startup.cs中把ConfigureServices(),Configure()裏面的代碼都去掉,加上Ocelot接管代碼。

  public void ConfigureServices(IServiceCollection services)
        {
            services.AddOcelot();
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            app.UseOcelot();
        }

這些操作完,程序就再也不是asp.net core,也不是什麼webApi的程序了,就是一個Ocelot網關應用。

2.2路由配置

網關最重要的功能就是路由,根據路由把功能轉發到其它應用去,它本身的應用有ip地址,別人可能訪問它,但它怎麼知道哪個請求轉到哪個應用去呢,這些全靠配置。

首先在 Program.cs里的CreateHostBuilder()加入配置文件信息

public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration(c =>
            {
                c.AddJsonFile("ocelot.json", optional: false, reloadOnChange: true);
            })
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });

根目錄下增加配置文件ocelot.json。

  {
    "Routes": [
      {
        //轉發到下游服務地址--url變量
        "DownstreamPathTemplate": "/api/{url}",
        //下游http協議
        "DownstreamScheme": "http",
        //負載方式,
        "LoadBalancerOptions": {
          "Type": "RoundRobin" // 輪詢
        },
        "DownstreamHostAndPorts": [
          {
            "Host": "172.16.2.9",
            "Port": 5201 //服務端口
          }, //可以多個,自行負載均衡
          {
            "Host": "172.16.2.9",
            "Port": 5202 //服務端口
          },
          {
            "Host": "172.16.2.9",
            "Port": 5203 //服務端口
          }
        ],
        //上游地址
        "UpstreamPathTemplate": "/T1/{url}", //網關地址--url變量   //衝突的還可以加權重Priority
        "UpstreamHttpMethod": [ "GET", "POST", "DELETE", "PUT" ]
      }
    ]
  }

 

這裡的是路由配置,注釋說明已經很清楚,假如網關程序啟動後的地址為//172.16.2.9:5200

當訪問://172.16.2.9:5200/T1/Test/GetName  網關會把請求轉發到//172.16.2.9:5201/T1/Test/GetName,//172.16.2.9:5202/T1/Test/GetName,//172.16.2.9:5203/T1/Test/GetName,根據負載算法決定轉發規則。

LoadBalancer是來決定負載的算法

  • LeastConnection:將請求發往最空閑的那個服務器

  • RoundRobin:輪流轉發

  • NoLoadBalance:總是發往第一個請求或者是服務發現

Routes裏面可以配多個路由轉發。

2.3驗證

在前面的Consul註冊的程序中(5201,5202,5203端口程序)加入一個接口

    [Route("api/[controller]/[action]")]
    public class TestController : Controller
    {
        private IConfiguration _configuration;
        public TestController(IConfiguration configuration)
        {
            _configuration = configuration;
        }
        public IActionResult GetName()
        {
            string port = _configuration["port"];
            return Json($"端口:{port},姓名:張三");
        }
    }

 

啟動Ocelot的網關程序,端口為5200

 

 訪問地址://ip:5200/T1/Test/GetName

 

 刷新一下

可以看到,已經成功轉發到上面配置好的路由地址。

2.4Ocelot結合Consul進行服務發現

上面的示例是沒有經過Consul的,是直接轉發到相應地址,這顯示又面臨了服務地址管理的問題了,所以需要結束Consul自動發現服務的地址。

 把ocelot.json的文件加入consul配置信息

  {
    "Routes": [
      {
        //轉發到下游服務地址--url變量
        "DownstreamPathTemplate": "/api/{url}",
        //下游http協議
        "DownstreamScheme": "http",
        //負載方式,
        "LoadBalancerOptions": {
          "Type": "RoundRobin" // 輪詢
        },
        //"DownstreamHostAndPorts": [
        //  {
        //    "Host": "172.16.2.9",
        //    "Port": 5201 //服務端口
        //  }, //可以多個,自行負載均衡
        //  {
        //    "Host": "172.16.2.9",
        //    "Port": 5202 //服務端口
        //  },
        //  {
        //    "Host": "172.16.2.9",
        //    "Port": 5203 //服務端口
        //  }
        //],
        //上游地址
        "UpstreamPathTemplate": "/T1/{url}", //網關地址--url變量   //衝突的還可以加權重Priority
        "UpstreamHttpMethod": [ "GET", "POST", "DELETE", "PUT" ],
        "UseServiceDisConvery": true, //使用服務發現
        "ServiceName": "api"//Consul服務名稱
      }
    ],
    "GlobalConfiguration": {
      //Ocelot應用地址
      "BaseUrl": "//172.16.2.9:5200",
      "ServiceDiscoveryProvider": {
        //Consul地址
        "Host": "172.16.2.84",
        //Consul端口
        "Port": 8500,
        "Type": "Consul"//由Consul提供服務發現,每次請求Consul
      }
    }
  }

可以看到,這裡已經把寫死的下游地址去掉了,加入了Consul的信息。

安裝NuGet包 

Ocelot.Provider.Consul

Startup.cs中ConfigureServices(IServiceCollection services)加入.AddConsul();

 public void ConfigureServices(IServiceCollection services)
        {
            services.AddOcelot()
                .AddConsul();
        }

配置完成,驗證效果,啟動項目。

 

 再次訪問//ip:5200/T1/Test/GetName

 

 刷新一下

 

 

 控制台信息

 

 到這就已經成功完成 Ocelot+Consul的網關和服務發現功能了。