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网关实现缓存

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网关实现缓存

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

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

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网关实现缓存
本例中就是把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网关实现缓存
02-05 .net core 3.1 使用 Ocelot搭建api网关实现缓存
上面两次请求在30秒内完成,所以返回的时间没有变化,下面是在30秒后发出的请求,上个周期缓存时间已经过了,所以时间发生了变化
02-05 .net core 3.1 使用 Ocelot搭建api网关实现缓存

结论

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

参考文章

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

02-05 .net core 3.1 使用 Ocelot搭建api网关实现缓存02-05 .net core 3.1 使用 Ocelot搭建api网关实现缓存 菜鸟爱飞不飞 发布了8 篇原创文章 · 获赞 0 · 访问量 51 私信 关注
上一篇:写个重新加载 ocelot 配置的接口


下一篇:Ocelot入门实践