.netcore ApiGateway实例,包含转发,轮询,缓存,限流,熔断

1.新建 服务

设置路由 为 api, controller 的路由也要设置,为get

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;

namespace ApiServiceA.Controllers
{
    [ApiController]
    //[Route("[controller]")]
    [Route("api")]

    public class WeatherForecastController : ControllerBase
    {
        private static readonly string[] Summaries = new[]
        {
            "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
        };

        private readonly ILogger<WeatherForecastController> _logger;

        public WeatherForecastController(ILogger<WeatherForecastController> logger)
        {
            _logger = logger;
        }

        [HttpGet]
        [Route("Get")]
        public async Task<IActionResult> GetAsync()
        {
            Console.WriteLine(nameof(ApiServiceA)+ $"time is :{DateTime.Now}");
            var result = await Task.Run(() =>
            {
                return $"This is from {HttpContext.Request.Host.Value}, path: {HttpContext.Request.Path}, time is :{DateTime.Now}";

            });
            return Ok(result);
        }
        /* public IEnumerable<WeatherForecast> Get()
         {
             var rng = new Random();
             return Enumerable.Range(1, 5).Select(index => new WeatherForecast
             {
                 Date = DateTime.Now.AddDays(index),
                 TemperatureC = rng.Next(-20, 55),
                 Summary = Summaries[rng.Next(Summaries.Length)]
             })
             .ToArray();
         }*/
    }
}

2.ApiGateway 实现:转发,轮询,缓存

添加nuget包 Ocelot ,增加 Ocelot.json文件

program.cs文件修改

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

startup.cs文件修改

//gateway网关:安装 Ocelot 15.0.7 支持.netcore31的最新版本 
//负载均衡:安装 Ocelot.Provider.Consul 15.0.7 支持.netcore31的最新版本  
//缓存熔断:Ocelot.Provider.Polly  15.0.7 支持.netcore31的最新版本  
services.AddOcelot().AddConsul().AddPolly(); 


app.UseOcelot().Wait();

Ocelot.json文件

{
  "ReRoutes": [
    {
      //下游服务配置
      "DownstreamPathTemplate": "/api/{url}", // 服务地址  url 变量
      "DownstreamScheme": "http",
      "DownstreamHostAndPorts": [ //服务ip和端口 ,可以多个,自行负载均衡
        {
          "Host": "localhost",
          "Port": 19001
        },
        {
          "Host": "localhost",
          "Port": 19002
        }
      ],
      //上游服务配置
      "UpstreamPathTemplate": "/ocelot/{url}", // 网关地址  url
      "UpstreamHttpMethod": [ "Get", "Post" ],
      //consul + 网关负载均衡
      "LoadBalancerOptions": {
        "Type": "RoundRobin" //轮询策略 LeastConnecion 最少连接数的服务器 NoLoadBalance 不负载均衡  RoundRobin 顺序,没个一次
      },
      //缓存 10秒内重复访问,不会进入到 service,会直接返回结果
      "UseServiceDiscovery": true,
      "FileCacheOptions": {
        "TtlSeconds": 10
      }, //限流
      "RateLimitOptions": {
        "ClientWhiteList": [ //数组,在请求头中包含ClientId=xxx的请求不受限流控制,其中ClientId这个key可以修改,xxx表示配置的白名单。
          "markadmin"
        ],
        "EnableRateLimiting": true, //是否启用限流
        "Period": "1m", // 1s,5m,1h,1d   限流控制的时间周期,输入单位支持s(秒), m(分), h(时), d(天)
        "PeriodTimespan": 30, //恢复等待时间,当访问超过限流限制的次数后,需要等待的时间,单位为s,如当一分钟内访问超过5次,就需要等待30秒后,访问才会重新有效
        "Limit": 5 //一个时间周期内允许访问的最大次数。 以上表示 1m中内置允许访问5次
      }
    }
  ]
  
  //,
  //"GlobalConfiguration": {
  //  //"RequestIdKey": "OcRequestId",
  //  //"AdministrationPath": "/administration",
  //  "BaseUrl": "http://localhost:4727",
  //  "ServiceDiscoveryProvider": {
  //    "Host": "localhost",
  //    "Port": 8500,
  //    "Type": "Consul"
  //  }
  //}
}

 

 

 

参考地址:

http://letyouknow.net/ocelot/index.html

https://www.cnblogs.com/zhangxiaoxia/p/12627208.html

 

demo地址:

https://gitee.com/luofengwuhen/ApiGateway.Demo.git

posted @ 2021-04-22 15:23  落风无痕  阅读(625)  评论(0)    收藏  举报