一次業務網關用ASP.NET Core 2.1重構的小結
目錄
- 前言
- 統一鑒權
- 服務限流
- 路由轉發
- 參數重組
- 鍊路跟蹤
- 熔斷降級
- 服務計次
- 業務名額監控
- 日志記錄
- 疊代更新
- 總結
對于API網關,業界貌似對它進行下劃分,有下面幾個分類/場景。
- 面向Web App
- 面向Mobile App
- 面向Partner OpenAPI
- 面向Partner ExternalAPI
- 其他。。。
在18年8月份的時候,有幸用.NET Core 2.1重構了一個對外的業務網關項目,這個項目的作用其實就是将公司内部能提供的資料能力公開出來,可以讓有需要的公司使用。
這個項目按照分類,應該是要歸類到 面向Partner OpenAPI 。
這個項目剛開始是用Nancy寫的,那個時候要向外提供一個新的能力的時候,都是要加這個能力的代碼,釋出後才能真正的對外提供,不過當時對外提供的東西比較少,負責的同僚也要閃人了,是以也還是可以接受。
在18年7月份的時候,越來越多的能力要對外提供,而且每次都要改代碼,受不了,就提出了重構。
這個項目目前每天大概有1500萬左右的有效調用量,部署在6台4c4g的CentOS虛拟機上面(其實用不了那麼多機器,每台機器的基本都是20%以下的cpu和10%左右的記憶體),用Jexus去托管。大入口是Nginx,是以最後的流向是:
Request -> Nginx -> Jexus -> dotnet
下面就分别來說說這個網關涉及到的一些東西。
鑒權這一塊用的還是很古老的做法,用的是使用者名和密碼的方式來處理,這個可以了解成是驗簽的一個過程。
這裡支援兩種形式,一種是參數明文傳輸,還有一種是參數加密傳輸。
其實就是有部分公司覺得我不能直接傳明文的123給你,要傳一個加密後的123,讓你解密然後去處理。
限流功能就是限制調用方過于頻繁的調用,這個限制,根據業務場景分為秒、天、月三個層級。
不同調用方,不同資料服務都有不同的限制,這個是基于Redis來實作的。
路由轉發用的是HttpClientFactory。
剛開始的時候還是用steeltoe來處理服務注冊和發現,不過發現并不好用,然後也有很多服務沒有接入 Eureka, 是以最後就沒有處理服務注冊和發現,而是直接用域名的方式來請求。
使用者的請求參數基本上都會是透傳給下遊服務,當然不能排除會有一些特殊的需求。
舉個簡單的例子說明一下,好比隻想讓調用方查廣州的天氣,不想讓他查深圳的天氣,而下遊服務是這兩個城市都可以查的,是以要有一些特殊的參數去告訴下遊服務。
這個時候,我們就需要對使用者的入參進行一次重組,重新構造了一個JSON參數丢給下遊服務,相當于特殊情況會有固定的參數格式給到下遊服務,用的是JObject來處理。
由于調用鍊有的時候非常複雜,為了記錄調用方一個請求完整的調用鍊,網關這邊會生成一個traceId在請求頭,路由轉發的時候會一起發過去。
不同服務在記錄日志的時候就會把這個traceId也統一記錄起來,這樣所有的日志都可以通過這個traceId從日志系統中找到。
下遊服務不一定能保證 7*24 小時的正常服務,有時可能因為資料庫處理逾時,網絡請求逾時,進而造成在一段時間内,不能正常響應。
這個時候網關就不應該每次都去真正的請求服務,而要斷開一段時間,直接傳回失敗給調用方。
這一塊是結合 HttpClientFactory 和 Polly 來實作的,省了很多麻煩。
計次可以說是這個網關的一大核心,因為要賺錢,要收調用方的錢。錢基本就是按次數算出來的。
之前寫過一篇部落格,實作是類似的。
按次計費接口的簡單實作思路。
需要知道最近某段時間範圍内,不同調用方,不同資料服務的調用情況(成功,失敗,有效,總次數等)
這裡用的是prometheus,程式負責寫名額資料,prometheus會去拉取這些資料,然後結合Grafana來做成不同的看闆來展示。
日志記錄為分兩大類,一類是程式日志,一類是調用日志。
程式日志目前是拓展NLog,把資料丢到Kafka,然後運維那邊會抽資料到Elasticsearch。
為了避免Kafka抽風,是以丢資料到Kafka失敗的話,會落盤到日志檔案,然後由Filebeat收集,然後丢到Elasticsearch。
最後的展現形式是 graylog, 大概如下

調用日志是和調用方結算的依據之一,是以這個的重要性還是挺高的。
目前用的是異步寫入加容錯。調用日志最終是落到資料庫歸檔。
更新對一個程式來說是必不可免的,是以有一個好的釋出流程可以減少一些困難。雖說重構後,這個項目也就更新了3次。
這裡用的是Go CD來釋出的,從測試到預發再到生産,流水線的操作。
雖然這個項目挺小的,但是也可以用“麻雀雖小,五髒俱全”來形容。
最後問問,最近有那位大佬招小弟嗎?有的話可以聯系一下我哈。
如果您認為這篇文章還不錯或者有所收獲,可以點選右下角的【推薦】按鈕,因為你的支援是我繼續寫作,分享的最大動力!
作者:Catcher Wong ( 黃文清 )
來源:http://catcher1994.cnblogs.com/
聲明:
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。如果您發現部落格中出現了錯誤,或者有更好的建議、想法,請及時與我聯系!!如果想找我私下交流,可以私信或者加我微信。