基於.NET CORE微服務框架 -談談Cache中介軟體和快取降級

fanly11發表於2017-07-29

1、前言

surging受到不少.net同學的青睞,也提了不少問題,提的最多的是什麼時候整合API 閘道器,在這裡回答大家最近已經開始著手研發,應該在1,2個月內會有個初版API閘道器,其它像Token身份驗證,限流降級等功能完成時間會往後推

最近也更新了surging新的版本

更新內容:

1. Cache中介軟體基於Redis 所依賴的第三方庫已將servicestack.redis轉成stackexchange
2. 增加快取降級
3. 增加攔截快取降級的例子

開源地址:https://github.com/dotnetcore/surging

2.軟體環境

IDE:Visual Studio 2017 15.3 Preview ,vscode
框架:.NET core 2.0

vscode 技術支援:

3、Cache中介軟體的使用

  在剝析surging的架構思想這篇文章中大致提了下Cache中介軟體,大家也對Cache中介軟體有了初步印象,這一節我們將談談怎麼使用Cache中介軟體

1.建立配置檔案

cacheSettings.json

{ 
    "CachingSettings": [
      {
        "Id": "ddlCache",
        "Class": "Surging.Core.Caching.RedisCache.RedisContext,Surging.Core.Caching",
        "Properties": [
          {
            "Name": "appRuleFile",
            "Ref": "rule"
          },
          {
            "Name": "dataContextPool",
            "Ref": "ddls_sample",
            "Maps": [
              {
                "Name": "Redis",
                "Properties": [
                  {
                    "value": "127.0.0.1:6379::1"
                  }
                ]
              },
              {
                "Name": "MemoryCache"
              }
            ]
          },
          {
            "Name": "defaultExpireTime",
            "value": "120"
          },
          {
            "Name": "connectTimeout",
            "Value": "120"
          },
          {
            "Name": "minSize",
            "Value": "1"
          },
          {
            "Name": "maxSize",
            "Value": "10"
          }
        ]
      }
    ]
}

可以支援多個例項配置通過配置id來標識唯一,並且通過配置Maps,來初始化服務節點列表,通過雜湊一致性來選擇服務節點

配置引數列表

引數
作用

CachingSettings

包含多個例項的父級配置節

Id

唯一標識

Class

對於Context的適配
Properties Cache 相關配置節

Maps

配置服務節列表

minSize

物件池最小數

maxSize

objectpool最大數

2.程式碼配置

 

        /// <summary>
        /// 配置快取服務
        /// </summary>
        public static void ConfigureCache(IConfigurationBuilder build)
        {
            build
              .AddCacheFile("cacheSettings.json", optional: false);
        }   

以上我們就完成了快取中介軟體配置,接下來就可以通過以下程式碼進行呼叫

基於redis的快取呼叫

  cacheProvider = CacheContainer.GetInstances<ICacheProvider>(“ddlCache.Redis”);

 基於MemoryCache的快取呼叫

CacheContainer.GetInstances<ICacheProvider>("MemoryCache")

4、快取降級

對於服務所返回的資料,有些是不需要經常修改,可以通過快取返回資料,比如商品應用,商品分類,商品列表、使用者資訊,訂單資訊,購物車等,通過以上需求我們就要對於proxy進行攔截,返回快取或者刪除快取。

對於快取會有以下疑問

  1. 資料一致性:對於服務是分散式部署在各臺伺服器上, 快取儲存讀取也應該支援分散式,所以應該選擇支援分散式的快取框架,如:redis,couchbase,membercache
  2. 快取命中率:在無命中的情況下,無法直接通過快取獲取到想要的資料,而直接通過呼叫遠端服務獲取資料,這樣就會增加響應時間和影響吞吐量,所以我們必須引用工具進行監控

快取降級

 surging的快取降級就是針對於proxy進行攔截,如果有快取資料,則返回快取資料,否則呼叫Proceed方法呼叫遠端服務。

 在資料進行update,delete的時候就需要針對於依賴的快取進行刪除,可以通過proxy進行攔截的方式把快取進行刪除

 快取降級有以下優點

1.高效能:可以減少響應時間和提高吞吐量

2.高效:針對於業務邏輯的設計,無需考慮快取,做到了無縫整合

以下通過示例來介紹如何使用

在業務介面方法上新增如下特性

[Command(Strategy= StrategyType.Failover,FailoverCluster =3,RequestCacheEnabled =true)]  //RequestCacheEnabled =true 就是啟用快取

攔截獲取快取

 [InterceptMethod(CachingMethod.Get, Key = "GetUser_id_{0}", Mode = CacheTargetType.Redis, Time = 480)]

攔截刪除快取

[InterceptMethod(CachingMethod.Remove, "GetUser_id_{0}", "GetUserName_name_{0}", Mode = CacheTargetType.Redis)]

應用[CacheKey]來標識快取Key,如

    public class UserModel
    {

        [CacheKey(1)]
        public int UserId { get; set; }

        public string Name { get; set; }

        public int Age { get; set; }
    }

配置攔截器

.AddClientIntercepted(typeof(CacheProviderInterceptor))

5.測試

測試環境

CPU:Intel Core i7-4710MQ

記憶體:16G

硬碟:1T SSD+512G HDD

網路:區域網

開啟redis測試結果如下:
停用Redis測試結果如下:
 

6、總結

已經開始研發API閘道器,近期更新只會修復BUG和提交單元測試。如感興趣請多關注或者加入QQ群:542283494

 

相關文章