歡迎光臨
每天分享高質量文章

.Netcore 2.0 Ocelot Api閘道器教程(8)- 快取

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如下:


delete somename token.png

再次請求

http://localhost:5000/Now

,可以發現與上次請求的傳回時間不同。

註意:兩次請求http://localhost:5000/Now的時間間隔要控制在60s之內才能看出效果。

6、實現自己的快取

Ocelot提供了介面可以讓我們自己實現快取處理類,該類要實現 IOcelotCache,並且要在 Startup中的 ConfigureServices 方法中的 AddOcelot 之後新增 services.AddSingleton, MyCache>(); 來註入自己的快取處理類改寫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