網關Ocelot功能演示完結,久等了~~~

前言

關於網關(Ocelot)的分享,還遺留一些功能沒演示呢,接著來聊聊;這次重點針對網關Ocelot使用快取、集成Polly做服務治理、集成IdentityServer4做認證授權來詳細說說;如果對上一篇感興趣,點這裡(網關Ocelot功能演示安排的明明白白~~~)。

正文

1. 使用快取

Ocelot中的快取是對下游請求結果進行快取處理,多次請求下游API時,在有效期內就可以從快取中獲取,提升服務性能。

以下演示程式碼還是接著上一次程式碼舉例的,程式碼地址為://github.com/zyq025/IDS4Demo/tree/main/OcelotDemo/OcelotCodeDemo

1.1 使用默認記憶體快取

其實只要增加下面紅框部分的配置,就可以使用快取了,如下:

配置說明:

  • TtlSeconds:配置有效期的時間,單位為秒;
  • Region:區域名,即分區快取數據;Oeclot可以提供快取管理介面,然後指定區域清除快取;其實就是在Ocelot那裡增加相關介面管理快取;

配置文件準備好了,在ServiceAPI1中新增一個測試介面,如下:

運行網關和ServiceAPI1項目,然後根據配置的路由規則訪問新增的介面:

到這有小夥伴會好奇,什麼快取操作都沒做,就一個簡單的配置就行了? 是的,Ocelot默認是有記憶體快取實現的,老版本的InMemoryCache是通過Dictionary來實現的,就是鍵值對存儲;新版本的是AspMemoryCache是通過IMemoryCache來實現的;所以只要配置開啟就可以用啦,只不過功能比較單一,但可以集成其他擴展快取,當然也可以自定義。

1.2 集成CacheManager做快取

CacheManager除了快取管理外,還封裝了很多功能,如事件、性能計數器、並發更新等,讓開發人員更容易處理和配置快取。這裡主要演示如何集成到Ocelot使用,就不詳細展開說明啦,詳解請查閱官網://cachemanager.michaco.net/documentation。

Ocelot中集成CacheManager非常簡單,簡單小三步:

  • 引入Ocelot.Cache.CacheManager包;

  • 註冊對應的服務;

  • 添加配置文件,其實就是配置FileCacheOptions,上一小節已經使用啦;

    這樣就完成集成了,運行網關和服務介面,然後訪問,同樣是每隔十秒才能重新獲取值; 基於記憶體的使用是不是很簡單,分散式訪問咋辦? 可不可以用Redis或者其他方式存儲,答案當然是肯定的,往下看看↓↓↓

1.3 集成CacheManager配合Redis做分散式快取

首先得安裝好Redis環境,這塊我就不展開啦,如果小夥伴對Redis系列感興趣,也有專門的文章進行分享,進入Redis系列

  • 引入對應包,增加Redis相關配置即可,如下:

    image-20210425170300577

  • 運行網關和服務介面,訪問,同樣也是每隔10秒才能獲取新值,不過這次不一樣的是數據在Redis中存儲啦,結果如下:

    image-20210425151920536

1.4 自定義快取

自定義快取通過繼承介面IOcelotCache,然後註冊到容器即可,So easy!!!

  • 自定義一個快取類,繼承IOcelotCache介面;

    image-20210426143820535

  • 將快取類註冊到容器中;

    image-20210426143935784

  • 運行看結果,還是用之前上面配置文件的FileCacheOptions資訊:

    image-20210426145331418

如果沒有特別訂製化的需求,用現成造好的輪子也是很不錯的。

2. 集成Polly做服務治理

在WebAPI中,介面超時、訪問異常、並發量大等這種問題已經是家常便飯了,故障處理和彈性預防肯定少不了,上一節專門分享了一下Polly,這裡就可以很絲滑般的集成進來啦,關於Polly的分享,請進入Polly-故障處理和彈性應對很有一手查看詳情。

Ocelot集成Polly超級給力,引入包,註冊服務,剩下的功能通過配置文件配置就輕鬆實現~~~

  • 引入包,註冊服務

    image-20210426151206131

  • 超時熔斷配置實現

    為了方便測試,在ServiceAPI1中增加一個TimeoutTest的介面,如下:

    image-20210426153031768

    然後配置超時熔斷,然後運行,通過網關訪問介面:

    image-20210426152940899

    通過上面演示,如果超時,不讓請求一直處於等待,及時回饋資訊;Ocelot默認超時時間為90s。同時上面還配置了熔斷機制,如果出現3次異常,就會熔斷3秒。

  • 限流配置實現,這裡就用ServiceAPI1中CacheTest介面做演示

    image-20210426163155144

    當達到最大請求時,可以自定義返回消息和狀態碼,只需要全局配置中增加如下配置即可:

    image-20210426162735269

    運行效果如下:

    image-20210426160312818

3. 集成IdentityServer4做認證授權

認證授權在API項目中是不可缺少的,而對於微服務項目,每一個服務都做一次驗證,顯得冗餘,而且後期程式碼維護性也不好,所以找一個公共的入口統一做認證是很不錯的解決方案,而在網關上集成認證授權功能完全符合條件。

關於IdentityServer4的相關知識,之前做過幾篇文章的分享,小夥伴可以進入IdentityServer4系列詳細查看,這裡不展開講,重點還是演示Ocelot如何集成IdentityServer4;步驟如下:

  • 準備一個IdentitiServer4的項目

    為了不喧賓奪主,這裡就直接用之前IdentityServer4 之Client Credentials走起來這篇文章中的AuthorizationServerDemo項目程式碼,github源碼路徑是://github.com/zyq025/IDS4Demo。直接拷過來即可。

  • Ocelot項目中增加認證邏輯

    image-20210427161101292

  • 修改配置文件

    image-20210427161308610

    配置認證資訊可以針對路由進行配置,其中AuthenticationProviderKey對應的值與網關項目中註冊服務定義的authenticationProviderKey值一致。 如果配置了認證資訊,就會經過授權伺服器進行認證校驗,否則不進行驗證。

  • 運行結果如下:

    image-20210427161925028

    通過上圖,對應的API被保護起來啦!那試試獲取一個Token,帶上Token訪問需認證的API地址,看看能否問;為了演示方便,這裡要用到Postman工具啦,如下:

    image-20210427162235681

    上面已經獲取到Token,如果小夥伴有疑惑,可以去看看之前IDS4的文章。 將得到的Token放在請求頭中去訪問需認證的API地址,如下:

    image-20210427162705433

    最後可以正常訪問介面啦,統一在網關做共同的邏輯,避免各服務的功能實現冗餘,在後期維護和替換也很方便。

源碼地址://github.com/zyq025/IDS4Demo,統一放在這裡面了。

總結

到這Ocelot的常用功能已經演示完畢了,這些示例只是提供思路,具體應用還需要小夥伴花點心思結合需求進行落地。

下一步的安排繼續聊聊服務之間的調用分散式最終一致性等開發應用,還會集成一些中間件進行日誌監控和分析及鏈路追蹤,對於部署還會系列的分享Nignx、Docker、K8s

一個被程式搞丑的帥小伙,關注”Code綜藝圈”,跟我一起學~~~

圖片