天天看點

一次業務網關用ASP.NET Core 2.1重構的小結

一次業務網關用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, 大概如下

一次業務網關用ASP.NET Core 2.1重構的小結

調用日志是和調用方結算的依據之一,是以這個的重要性還是挺高的。

目前用的是異步寫入加容錯。調用日志最終是落到資料庫歸檔。

更新對一個程式來說是必不可免的,是以有一個好的釋出流程可以減少一些困難。雖說重構後,這個項目也就更新了3次。

這裡用的是Go CD來釋出的,從測試到預發再到生産,流水線的操作。

一次業務網關用ASP.NET Core 2.1重構的小結

雖然這個項目挺小的,但是也可以用“麻雀雖小,五髒俱全”來形容。

最後問問,最近有那位大佬招小弟嗎?有的話可以聯系一下我哈。

一次業務網關用ASP.NET Core 2.1重構的小結

如果您認為這篇文章還不錯或者有所收獲,可以點選右下角的【推薦】按鈕,因為你的支援是我繼續寫作,分享的最大動力!

作者:Catcher Wong ( 黃文清 )

來源:http://catcher1994.cnblogs.com/

聲明:

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。如果您發現部落格中出現了錯誤,或者有更好的建議、想法,請及時與我聯系!!如果想找我私下交流,可以私信或者加我微信。

繼續閱讀