.Netcore 2.0 Ocelot Api網(wǎng)關(guān)教程(8)- 緩存

Ocelot中使用 CacheManager 來(lái)支持緩存蒲跨,官方文檔中強(qiáng)烈建議使用該包作為緩存工具译断。
以下介紹通過(guò)使用CacheManager來(lái)實(shí)現(xiàn)Ocelot緩存授翻。

1、通過(guò)Nuget添加 Ocelot.Cache.CacheManager

在OcelotGetway項(xiàng)目中添加引用:


Add cache package.png

2、修改 Startup 中的 ConfigureServices 方法

修改如下:

services
    .AddOcelot(new ConfigurationBuilder()
    .AddJsonFile("configuration.json")
          .Build())
    .AddConsul()
    .AddCacheManager(x => x.WithDictionaryHandle())
    .AddAdministration("/administration", "secret");

3堪唐、修改 WebApiA 添加一個(gè) 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");
        }
    }
}

啟動(dòng)WebApiA項(xiàng)目并使用Postman多次請(qǐng)求 http://localhost:5000/api/Time/GetNow

Now1.png

Now2.png

可以看到每次返回的時(shí)間不同巡语。

4、修改OcelotGetway項(xiàng)目中的 configuration.json淮菠,在 ReRoutes 中添加如下配置:

{
    "DownstreamPathTemplate": "/api/Time/GetNow",
    "DownstreamScheme": "http",
    "DownstreamHostAndPorts": [
      {
        "Host": "localhost",
        "Port": 5001
      }
    ],
    "UpstreamPathTemplate": "/Now",
    "UpstreamHttpMethod": [ "Get" ],
    "FileCacheOptions": {
      "TtlSeconds": 60,
      "Region": "somename"
    }
}

對(duì) FileCacheOptions 配置做下解釋:

  • TtlSeconds: 緩存時(shí)間(秒)
  • Region: 緩存區(qū)男公,表示改配置緩存放到哪個(gè)區(qū)域,可以在配置管理中進(jìn)行維護(hù)合陵,后邊將做詳細(xì)介紹
    用一句話解釋改配置:對(duì)鏈接http://localhost:5000/Now使用somename緩存區(qū)進(jìn)行60秒緩存枢赔。
    然后啟動(dòng)OcelotGetway項(xiàng)目,使用Postman請(qǐng)求如下:
    Now from cache.gif

    多次請(qǐng)求在一分鐘之內(nèi)得到的返回?cái)?shù)據(jù)并未發(fā)生變化拥知。
    至此踏拜,緩存配置完成。

5低剔、使用配置管理清除緩存

配置管理篇中并沒(méi)有介紹清除緩存api的使用速梗,而是留到了本片來(lái)進(jìn)行介紹。要使用配置管理需要先按照之前的文章進(jìn)行配置襟齿。
以下介紹清除緩存的方法姻锁。
使用Postman post請(qǐng)求http://localhost:5000/administration/connect/token如下:

get token.png

得到token。
使用Postman delete請(qǐng)求http://localhost:5000/administration/outputcache/somename并bearer上述得到的token如下:
delete somename token.png

再次請(qǐng)求http://localhost:5000/Now猜欺,可以發(fā)現(xiàn)與上次請(qǐng)求的返回時(shí)間不同位隶。

注意:兩次請(qǐng)求http://localhost:5000/Now的時(shí)間間隔要控制在60s之內(nèi)才能看出效果。

6开皿、實(shí)現(xiàn)自己的緩存

Ocelot提供了接口可以讓我們自己實(shí)現(xiàn)緩存處理類(lèi)钓试,該類(lèi)要實(shí)現(xiàn) IOcelotCache<CachedResponse>,并且要在 Startup中的 ConfigureServices 方法中的 AddOcelot 之后添加 services.AddSingleton<IOcelotCache<CachedResponse>, MyCache>(); 來(lái)注入自己的緩存處理類(lèi)覆蓋Ocelot中默認(rèn)的緩存處理副瀑。
如果需要實(shí)現(xiàn)文件緩存需要實(shí)現(xiàn) IOcelotCache<FileConfiguration> 接口并添加相應(yīng)注入弓熏。
提供一個(gè)簡(jiǎn)單版本的緩存處理類(lèi)(非常不建議生產(chǎn)環(huán)境使用):

using System;
using System.Collections.Generic;
using System.Linq;
using Ocelot.Cache;

namespace OcelotGetway
{
    public class MyCache : IOcelotCache<CachedResponse>
    {
        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; }
    }
}

源碼下載

完,下一篇介紹QoS

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末糠睡,一起剝皮案震驚了整個(gè)濱河市挽鞠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌狈孔,老刑警劉巖信认,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異均抽,居然都是意外死亡嫁赏,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)油挥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)潦蝇,“玉大人款熬,你說(shuō)我怎么就攤上這事∪疗梗” “怎么了贤牛?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)则酝。 經(jīng)常有香客問(wèn)我殉簸,道長(zhǎng),這世上最難降的妖魔是什么沽讹? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任般卑,我火速辦了婚禮,結(jié)果婚禮上爽雄,老公的妹妹穿的比我還像新娘椭微。我一直安慰自己,他們只是感情好盲链,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布蝇率。 她就那樣靜靜地躺著,像睡著了一般刽沾。 火紅的嫁衣襯著肌膚如雪本慕。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,370評(píng)論 1 302
  • 那天侧漓,我揣著相機(jī)與錄音锅尘,去河邊找鬼。 笑死布蔗,一個(gè)胖子當(dāng)著我的面吹牛藤违,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播纵揍,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼顿乒,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了泽谨?” 一聲冷哼從身側(cè)響起璧榄,我...
    開(kāi)封第一講書(shū)人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎吧雹,沒(méi)想到半個(gè)月后骨杂,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡雄卷,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年搓蚪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片丁鹉。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡妒潭,死狀恐怖悴能,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情杜耙,我是刑警寧澤搜骡,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布拂盯,位于F島的核電站佑女,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏谈竿。R本人自食惡果不足惜团驱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望空凸。 院中可真熱鬧嚎花,春花似錦、人聲如沸呀洲。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)道逗。三九已至兵罢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間滓窍,已是汗流浹背卖词。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留吏夯,地道東北人此蜈。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像噪生,于是被迫代替她去往敵國(guó)和親裆赵。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容