缓存
Ocelot中使用 CacheManager (官方推荐包)来支持缓存,本文通过使用CacheManager来实现Ocelot缓存。
1、使用nuget给WebApiGateway项目(网关)安装Ocelot.Cache.CacheManager
,如图
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 实现缓存
}
如图
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");
}
}
如图
第一次访问api: http://localhost:5000/first/CacheManager/GetTimeNow
第二次访问api: http://localhost:5000/first/CacheManager/GetTimeNow
上面两次访问的时间明显发生了变化,也就是没有缓存机制的时候,每次都会发起新的请求,得到新的请求结果
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"
}
}
]
}
如图
本例中就是把http://localhost:5000/first/CacheManager/GetTimeNow和http://localhost:5000/second/CacheManager/GetTimeNow访问链接在CacheArea
缓冲区缓冲30秒
5、生成之后启动网关:访问http://localhost:5000/first/CacheManager/GetTimeNow,结果如下
上面两次请求在30秒内完成,所以返回的时间没有变化,下面是在30秒后发出的请求,上个周期缓存时间已经过了,所以时间发生了变化
结论
配置缓存之后,在配置的缓存时间内,多次请求同一个api,返回的结果是不变的,因为在缓存时间内的请求都是取的缓存区的数据。