.Net5微服务之API网关Ocelot(负载,限流,熔断,+Consul)

什么是API网关

API网关是微服务架构中的唯一入口,它提供一个单独且统一的API入口用于访问内部一个或多个API。它可以具有身份验证,监控,负载均衡,缓存,请求分片与管理,静态响应处理等。API网关方式的核心要点是,所有的客户端和消费端都通过统一的网关接入微服务,在网关层处理所有的非业务功能。通常,网关也是提供REST/HTTP的访问API。服务端通过API-GW注册和管理服务。

Ocelot介绍

Ocelot是用.net Core实现的一款开源的网关,Ocelot其实就是一组按照顺序排列的.net core中间件。它接受到请求之后用request builder构建一个HttpRequestMessage对象并发送到下游服务,当下游请求返回到Ocelot管道时再由一个中间件将HttpRequestMessage映射到HttpResponse上返回客户端。

 

 

首先先nuget:ocelot,Ocelot.Provider.Consul,Ocelot.Provider.Polly

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddOcelot(new ConfigurationBuilder()
                  .AddJsonFile("configuration.json")
                  .Build())
                  .AddConsul()
                  .AddPolly();
        }

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            //请求被Ocelot处理
            app.UseOcelot();
        }

 

加入API网关中

创建 configuration.json

 在API网关的Ocelot配置文件中加入配置,配置如下

////*****************************单地址********************************
//{
//  "Routes": [
//    {
//      "DownstreamPathTemplate": "/api/{url}", //服务地址--url变量
//      "DownstreamScheme": "http",
//      "DownstreamHostAndPorts": [
//        {
//          "Host": "127.0.0.1",
//          "Port": 555 //服务端口
//        } //可以多个,自行负载均衡
//      ],
//      "UpstreamPathTemplate": "/T555/{url}", //网关地址--url变量   //冲突的还可以加权重Priority
//      "UpstreamHttpMethod": [ "Get", "Post" ]
//    }
//  ]
//}

//*****************************多地址多实例********************************
//{
//  "Routes": [
//    {
//      "DownstreamPathTemplate": "/api/{url}", //服务地址--url变量
//      "DownstreamScheme": "http",
//      "DownstreamHostAndPorts": [
//        {
//          "Host": "localhost",
//          "Port": 555 //服务端口
//        } //可以多个,自行负载均衡
//      ],
//      "UpstreamPathTemplate": "/T555/{url}", //网关地址--url变量   //冲突的还可以加权重Priority
//      "UpstreamHttpMethod": [ "Get", "Post" ]
//    },
//    {
//      "DownstreamPathTemplate": "/api/{url}", //服务地址--url变量
//      "DownstreamScheme": "http",
//      "DownstreamHostAndPorts": [
//        {
//          "Host": "localhost",
//          "Port": 888 //服务端口
//        }
//      ],
//      "UpstreamPathTemplate": "/T888/{url}", //网关地址--url变量
//      "UpstreamHttpMethod": [ "Get", "Post" ]
//    },
//        {
//      "DownstreamPathTemplate": "/api/{url}", //服务地址--url变量
//      "DownstreamScheme": "http",
//      "DownstreamHostAndPorts": [
//        {
//          "Host": "localhost",
//          "Port": 5728 //服务端口
//        }
//      ],
//      "UpstreamPathTemplate": "/T5728/{url}", //网关地址--url变量
//      "UpstreamHttpMethod": [ "Get", "Post" ]
//    }
//  ]
//}

////*****************************单地址多实例负载均衡********************************
//{
//  "Routes": [
//    {
//      "DownstreamPathTemplate": "/api/{url}", //服务地址--url变量
//      "DownstreamScheme": "http",
//      "DownstreamHostAndPorts": [
//        {
//          "Host": "localhost",
//          "Port": 555 //服务端口
//        } //可以多个,自行负载均衡
//        ,
//        {
//          "Host": "localhost",
//          "Port": 888 //服务端口
//        },
//        {
//          "Host": "localhost",
//          "Port": 5728 //服务端口
//        }
//      ],
//      "UpstreamPathTemplate": "/T/{url}", //网关地址--url变量   //冲突的还可以加权重Priority
//      "UpstreamHttpMethod": [ "Get", "Post" ],
//      "LoadBalancerOptions": {
//        "Type": "RoundRobin" //轮询      LeastConnection-最少连接数的服务器   NoLoadBalance不负载均衡
//      }
//    }
//  ]
//}


////*****************************单地址多实例负载均衡+Consul********************************
//{
//  "Routes": [
//    {
//      "DownstreamPathTemplate": "/api/{url}", //服务地址--url变量
//      "DownstreamScheme": "http",
//      "UpstreamPathTemplate": "/TConsul/{url}", //网关地址--url变量
//      "UpstreamHttpMethod": [ "Get", "Post" ],
//      "ServiceName": "GeneralNetCore", //consul服务名称
//      "LoadBalancerOptions": {
//        "Type": "RoundRobin" //轮询      LeastConnection-最少连接数的服务器   NoLoadBalance不负载均衡
//      },
//      "UseServiceDiscovery": true
//    }
//  ],
//  "GlobalConfiguration": {
//    "BaseUrl": "http://127.0.0.1:5000", //网关对外地址
//    "ServiceDiscoveryProvider": {
//      "Host": "localhost",
//      "Port": 8500,
//      "Type": "Consul" //由Consul提供服务发现
//    }
//  }
//}

//*****************************单地址多实例负载均衡+Consul+Polly********************************
{
  "Routes": [
    {
      "DownstreamPathTemplate": "/api/{url}", //服务地址--url变量
      "DownstreamScheme": "http",
      "UpstreamPathTemplate": "/consul/{url}", //网关地址--url变量
      "UpstreamHttpMethod": [ "Get", "Post" ],
      "ServiceName": "GeneralNetCore", //consul服务名称
      "LoadBalancerOptions": {
        "Type": "RoundRobin" //轮询      LeastConnection-最少连接数的服务器   NoLoadBalance不负载均衡
      },
      "UseServiceDiscovery": true,
      "QoSOptions": {
        "ExceptionsAllowedBeforeBreaking": 3, //允许多少个异常请求
        "DurationOfBreak": 10000, // 熔断的时间,单位为ms
        "TimeoutValue": 10000 //如果下游请求的处理时间超过多少则自如将请求设置为超时 默认90秒
      },
      "RateLimitOptions": {
        "ClientWhitelist": [], //白名单
        "EnableRateLimiting": true,
        "Period": "5m", //1s, 5m, 1h, 1d 
        "PeriodTimespan": 5, //多少秒之后客户端可以重试
        "Limit": 5 //统计时间段内允许的最大请求数量
      },
      "FileCacheOptions": {
        "TtlSeconds": 10
      } //"缓存"
    }
  ],
  "GlobalConfiguration": {
    "BaseUrl": "http://127.0.0.1:5000", //网关对外地址
    "ServiceDiscoveryProvider": {
      "Host": "localhost",
      "Port": 8500,
      "Type": "Consul" //由Consul提供服务发现
    },
    "RateLimitOptions": {
      "QuotaExceededMessage": "Too many requests, maybe later?", // 当请求过载被截断时返回的消息
      "HttpStatusCode": 429 // 当请求过载被截断时返回的http status
    }
  }
}