Ocelot中使用 CacheManager 來支援快取,官方檔案中強烈建議使用該包作為快取工具。
以下介紹透過使用CacheManager來實現Ocelot快取。
1、透過Nuget新增 Ocelot.Cache.CacheManager
包
在OcelotGetway專案中新增取用:
2、修改 Startup
中的 ConfigureServices
方法
修改如下:
services
.AddOcelot(new ConfigurationBuilder()
.AddJsonFile("configuration.json")
.Build())
.AddConsul()
.AddCacheManager(x => x.WithDictionaryHandle())
.AddAdministration("/administration", "secret");
3、修改 WebApiA 新增一個 TimeController
並新增如下程式碼:
using System;
using Microsoft.AspNetCore.Mvc;
namespace WebApiA.Controllers
{
[Produces("application/json")]
[Route("api/[controller]/[action]")]
public class TimeController : Controller
{
[HttpGet]
public string GetNow()
{
return DateTime.Now.ToString("hh:mm:ss");
}
}
}
啟動WebApiA專案並使用Postman多次請求 http://localhost:5000/api/Time/GetNow
可以看到每次傳回的時間不同。
4、修改OcelotGetway專案中的 configuration.json
,在 ReRoutes
中新增如下配置:
{
"DownstreamPathTemplate": "/api/Time/GetNow",
"DownstreamScheme": "http",
"DownstreamHostAndPorts": [
{
"Host": "localhost",
"Port": 5001
}
],
"UpstreamPathTemplate": "/Now",
"UpstreamHttpMethod": [ "Get" ],
"FileCacheOptions": {
"TtlSeconds": 60,
"Region": "somename"
}
}
對 FileCacheOptions
配置做下解釋:
-
TtlSeconds: 快取時間(秒)
-
Region: 快取區,表示改配置快取放到哪個區域,可以在配置管理中進行維護,後邊將做詳細介紹
用一句話解釋改配置:對連結http://localhost:5000/Now使用somename快取區進行60秒快取。
然後啟動OcelotGetway專案,使用Postman請求如下:
多次請求在一分鐘之內得到的傳回資料並未發生變化。
至此,快取配置完成。
5、使用配置管理清除快取
在配置管理篇中並沒有介紹清除快取api的使用,而是留到了本片來進行介紹。要使用配置管理需要先按照之前的文章進行配置。
以下介紹清除快取的方法。
使用Postman post請求http://localhost:5000/administration/connect/token如下:
得到token。
使用Postman delete請求
http://localhost:5000/administration/outputcache/somename
並bearer上述得到的token如下:
再次請求
http://localhost:5000/Now
,可以發現與上次請求的傳回時間不同。
註意:兩次請求http://localhost:5000/Now的時間間隔要控制在60s之內才能看出效果。
6、實現自己的快取
Ocelot提供了介面可以讓我們自己實現快取處理類,該類要實現 IOcelotCache
,並且要在 Startup中的 ConfigureServices
方法中的 AddOcelot
之後新增 services.AddSingleton
來註入自己的快取處理類改寫Ocelot中預設的快取處理。
如果需要實現檔案快取需要實現 IOcelotCache
介面並新增相應註入。
提供一個簡單版本的快取處理類(非常不建議生產環境使用):
using System;
using System.Collections.Generic;
using System.Linq;
using Ocelot.Cache;
namespace OcelotGetway
{
public class MyCache : IOcelotCache
{
private static Dictionary<string, CacheObj> _cacheObjs = new Dictionary<string, CacheObj>();
public void Add(string key, CachedResponse value, TimeSpan ttl, string region)
{
if (!_cacheObjs.ContainsKey($"{region}_{key}"))
{
_cacheObjs.Add($"{region}_{key}", new CacheObj()
{
ExpireTime = DateTime.Now.Add(ttl),
Response = value
});
}
}
public CachedResponse Get(string key, string region)
{
if (!_cacheObjs.ContainsKey($"{region}_{key}")) return null;
var cacheObj = _cacheObjs[$"{region}_{key}"];
if (cacheObj != null && cacheObj.ExpireTime >= DateTime.Now)
{
return cacheObj.Response;
}
_cacheObjs.Remove($"{region}_{key}");
return null;
}
public void ClearRegion(string region)
{
var keysToRemove = _cacheObjs.Where(c => c.Key.StartsWith($"{region}_"))
.Select(c => c.Key)
.ToList();
foreach (var key in keysToRemove)
{
_cacheObjs.Remove(key);
}
}
public void AddAndDelete(string key, CachedResponse value, TimeSpan ttl, string region)
{
if (_cacheObjs.ContainsKey($"{region}_{key}"))
{
_cacheObjs.Remove($"{region}_{key}");
}
_cacheObjs.Add($"{region}_{key}", new CacheObj()
{
ExpireTime = DateTime.Now.Add(ttl),
Response = value
});
}
}
public class CacheObj
{
public DateTime ExpireTime { get; set; }
public CachedResponse Response { get; set; }
}
}
原始碼下載 https://github.com/Weidaicheng/OcelotTutorial/tree/%E6%95%99%E7%A8%8B%EF%BC%888%EF%BC%89
完,下一篇介紹QoS
相關文章:
原文地址:https://www.jianshu.com/p/5034384a8e61
.NET社群新聞,深度好文,歡迎訪問公眾號文章彙總 http://www.csharpkit.com