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


前言

關於網關(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相關配置即可,如下:

    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源碼路徑是:https://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

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

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

總結

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

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

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

圖片


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM