02-05 .net core 3.1 使用 Ocelot搭建api网关实现缓存

缓存

Ocelot中使用 CacheManager (官方推荐包)来支持缓存,本文通过使用CacheManager来实现Ocelot缓存。

1、使用nuget给WebApiGateway项目(网关)安装Ocelot.Cache.CacheManager,如图

02-05 .net core 3.1 使用 Ocelot搭建api网关实现缓存_第1张图片

2、修改WebApiGateway项目的startup.cs中的ConfigureServices方法
public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers();
    //添加Ocelot,注意configuration.json的路径,我本身就放在了根路径下
    services.AddOcelot(new ConfigurationBuilder()
        .AddJsonFile("configuration.json", true, true).Build())
        .AddPolly() //添加 Ocelot.Provider.Polly 实现熔断
        .AddCacheManager(x => x.WithDictionaryHandle());  // 添加 Ocelot.Cache.CacheManager 实现缓存
}

如图
02-05 .net core 3.1 使用 Ocelot搭建api网关实现缓存_第2张图片

3、给下游的两个api添加CacheManagerController
public class CacheManagerController : ApiController
{
    /// 
    /// 测试缓存
    /// 
    /// 
    [HttpGet]
    public string GetTimeNow()
    {
        return DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
    }
}

如图
02-05 .net core 3.1 使用 Ocelot搭建api网关实现缓存_第3张图片
第一次访问api: http://localhost:5000/first/CacheManager/GetTimeNow
02-05 .net core 3.1 使用 Ocelot搭建api网关实现缓存_第4张图片
第二次访问api: http://localhost:5000/first/CacheManager/GetTimeNow
02-05 .net core 3.1 使用 Ocelot搭建api网关实现缓存_第5张图片
上面两次访问的时间明显发生了变化,也就是没有缓存机制的时候,每次都会发起新的请求,得到新的请求结果

4、修改configuration.json,配置缓存,在ReRoutes下配置FileCacheOptions
  • TtlSeconds:缓存时间(秒)
  • Region:缓存区,表示改配置缓存放到哪个区域,可以在配置管理中进行维护,我们还可以调用Ocelot的API来移除某个区下面的缓存,后面详细研究。
{
  //全局配置
  "GlobalConfiguration": {
    "BaseUrl": "http://localhost:5000/" //网关暴露的的地址。
  },
  //路由配置
  "ReRoutes": [
    // 第一个api
    {
      "UpstreamPathTemplate": "/first/{controller}/{action}", //上游Api请求路由规则
      "DownstreamPathTemplate": "/{controller}/{action}", //网关转发到下游路由规则
      "UpstreamHttpMethod": [ "GET", "POST", "DELETE", "PUT" ], //上下游支持请求方法
      "DownstreamScheme": "http", //下游服务配置
      "DownstreamHostAndPorts": [
        {
          "Host": "localhost", //下游地址
          "Port": 5001 //下游端口号
        }
      ],
      //缓存
      "FileCacheOptions": {
        "TtlSeconds": 30, //缓存时间(秒)
        "Region": "CacheArea" //缓存区(名称自定义),表示改配置缓存放到哪个区域,可以在配置管理中进行维护
      }
    },
    // 第二个api
    {
      "UpstreamPathTemplate": "/second/{controller}/{action}",
      "DownstreamPathTemplate": "/{controller}/{action}",
      "UpstreamHttpMethod": [ "GET", "POST", "DELETE", "PUT" ],
      "DownstreamScheme": "http",
      "DownstreamHostAndPorts": [
        {
          "Host": "localhost",
          "Port": 5002
        }
      ],
      //缓存
      "FileCacheOptions": {
        "TtlSeconds": 30,
        "Region": "CacheArea"
      }
    }
  ]
}

如图
02-05 .net core 3.1 使用 Ocelot搭建api网关实现缓存_第6张图片
本例中就是把http://localhost:5000/first/CacheManager/GetTimeNow和http://localhost:5000/second/CacheManager/GetTimeNow访问链接在CacheArea缓冲区缓冲30秒

5、生成之后启动网关:访问http://localhost:5000/first/CacheManager/GetTimeNow,结果如下

02-05 .net core 3.1 使用 Ocelot搭建api网关实现缓存_第7张图片
02-05 .net core 3.1 使用 Ocelot搭建api网关实现缓存_第8张图片
上面两次请求在30秒内完成,所以返回的时间没有变化,下面是在30秒后发出的请求,上个周期缓存时间已经过了,所以时间发生了变化
02-05 .net core 3.1 使用 Ocelot搭建api网关实现缓存_第9张图片

结论

配置缓存之后,在配置的缓存时间内,多次请求同一个api,返回的结果是不变的,因为在缓存时间内的请求都是取的缓存区的数据。

参考文章

.Netcore 2.0 Ocelot Api网关教程(8)- 缓存

你可能感兴趣的:(.net,core,网关,.net,core,网关)