前言
關於網關(Ocelot)的分享,還遺留一些功能沒演示呢,接着來聊聊;這次重點針對網關Ocelot使用緩存、集成Polly做服務治理、集成IdentityServer4做認證授權來詳細說說;如果對上一篇感興趣,點這里(網關Ocelot功能演示安排的明明白白~~~)。
正文
1. 使用緩存
Ocelot中的緩存是對下游請求結果進行緩存處理,多次請求下游API時,在有效期內就可以從緩存中獲取,提升服務性能。
以下演示代碼還是接着上一次代碼舉例的,代碼地址為:https://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使用,就不詳細展開說明啦,詳解請查閱官網:https://cachemanager.michaco.net/documentation。
Ocelot中集成CacheManager非常簡單,簡單小三步:
-
引入Ocelot.Cache.CacheManager包;
-
注冊對應的服務;
-
添加配置文件,其實就是配置FileCacheOptions,上一小節已經使用啦;
這樣就完成集成了,運行網關和服務接口,然后訪問,同樣是每隔十秒才能重新獲取值; 基於內存的使用是不是很簡單,分布式訪問咋辦? 可不可以用Redis或者其他方式存儲,答案當然是肯定的,往下看看↓↓↓
1.3 集成CacheManager配合Redis做分布式緩存
首先得安裝好Redis環境,這塊我就不展開啦,如果小伙伴對Redis系列感興趣,也有專門的文章進行分享,進入Redis系列。
-
引入對應包,增加Redis相關配置即可,如下:
-
運行網關和服務接口,訪問,同樣也是每隔10秒才能獲取新值,不過這次不一樣的是數據在Redis中存儲啦,結果如下:
1.4 自定義緩存
自定義緩存通過繼承接口IOcelotCache,然后注冊到容器即可,So easy!!!
-
自定義一個緩存類,繼承IOcelotCache接口;
-
將緩存類注冊到容器中;
-
運行看結果,還是用之前上面配置文件的FileCacheOptions信息:
如果沒有特別定制化的需求,用現成造好的輪子也是很不錯的。
2. 集成Polly做服務治理
在WebAPI中,接口超時、訪問異常、並發量大等這種問題已經是家常便飯了,故障處理和彈性預防肯定少不了,上一節專門分享了一下Polly,這里就可以很絲滑般的集成進來啦,關於Polly的分享,請進入Polly-故障處理和彈性應對很有一手查看詳情。
Ocelot集成Polly超級給力,引入包,注冊服務,剩下的功能通過配置文件配置就輕松實現~~~
-
引入包,注冊服務
-
超時熔斷配置實現
為了方便測試,在ServiceAPI1中增加一個TimeoutTest的接口,如下:
然后配置超時熔斷,然后運行,通過網關訪問接口:
通過上面演示,如果超時,不讓請求一直處於等待,及時反饋信息;Ocelot默認超時時間為90s。同時上面還配置了熔斷機制,如果出現3次異常,就會熔斷3秒。
-
限流配置實現,這里就用ServiceAPI1中CacheTest接口做演示
當達到最大請求時,可以自定義返回消息和狀態碼,只需要全局配置中增加如下配置即可:
運行效果如下:
3. 集成IdentityServer4做認證授權
認證授權在API項目中是不可缺少的,而對於微服務項目,每一個服務都做一次驗證,顯得冗余,而且后期代碼維護性也不好,所以找一個公共的入口統一做認證是很不錯的解決方案,而在網關上集成認證授權功能完全符合條件。
關於IdentityServer4的相關知識,之前做過幾篇文章的分享,小伙伴可以進入IdentityServer4系列詳細查看,這里不展開講,重點還是演示Ocelot如何集成IdentityServer4;步驟如下:
-
准備一個IdentitiServer4的項目
為了不喧賓奪主,這里就直接用之前IdentityServer4 之Client Credentials走起來這篇文章中的AuthorizationServerDemo項目代碼,github源碼路徑是:https://github.com/zyq025/IDS4Demo。直接拷過來即可。
-
Ocelot項目中增加認證邏輯
-
修改配置文件
配置認證信息可以針對路由進行配置,其中AuthenticationProviderKey對應的值與網關項目中注冊服務定義的authenticationProviderKey值一致。 如果配置了認證信息,就會經過授權服務器進行認證校驗,否則不進行驗證。
-
運行結果如下:
通過上圖,對應的API被保護起來啦!那試試獲取一個Token,帶上Token訪問需認證的API地址,看看能否問;為了演示方便,這里要用到Postman工具啦,如下:
上面已經獲取到Token,如果小伙伴有疑惑,可以去看看之前IDS4的文章。 將得到的Token放在請求頭中去訪問需認證的API地址,如下:
最后可以正常訪問接口啦,統一在網關做共同的邏輯,避免各服務的功能實現冗余,在后期維護和替換也很方便。
源碼地址:https://github.com/zyq025/IDS4Demo,統一放在這里面了。
總結
到這Ocelot的常用功能已經演示完畢了,這些示例只是提供思路,具體應用還需要小伙伴花點心思結合需求進行落地。
下一步的安排繼續聊聊服務之間的調用、分布式最終一致性等開發應用,還會集成一些中間件進行日志監控和分析及鏈路追蹤,對於部署還會系列的分享Nignx、Docker、K8s。
一個被程序搞丑的帥小伙,關注"Code綜藝圈",跟我一起學~~~