用ASP.NETCore構建可檢測的高可用服務
- 2020 年 2 月 12 日
- 筆記
一、前言
2019 中國 .NET 開發者峰會(.NET Conf China 2019)於2019年11月10日完美謝幕,校寶在線作為星牌贊助給予了峰會大力支持,我和項斌等一行十位同事以講師、志願者的身份公司參與到峰會的支持工作中,我自己很榮幸能夠作為講師與大家交流,分享了主題《用ASP.NET Core構建可檢測的高可用服務》,借這篇文章,將主題的內容分享給大家。

二、為什麼應用的可檢測性越來越重要
隨着技術架構的發展,系統的規模不斷擴大,尤其是隨着微服務架構的流行,應用的拆分顆粒度越來越細,個數越來越多,服務間的調用拓撲也越來越複雜,開發者在故障定位、問題排查、健壯性改進方面投入的時間越來越多。應用程序可檢測性的提高,可以幫助我們掌控系統運行的情況,洞悉系統內部發生的事件,給開發者提供持續提升系統高可用能力的決策依據。


這裡列舉出對應用程序的可檢測性有依賴的主要場景:
- 故障自動隔離,應用程序需要具備暴露自己運行狀況的能力,與負載均衡、kubernetes等基礎設施配合,識別故障並進行隔離
- 故障定位排查,應用程序給出的故障信息越精準,故障定位的效率越高
- 服務(接口)的可用率,接口可用率的抖動與系統運行健康狀況直接相關,與業務的成功率也直接相關
- 服務(接口)的性能,系統的性能問題,往往需要細粒度地進行識別和優化,性能檢測是打造高可用系統必不可少的工作

三、ASP.NET Core的可檢測三件套
1、概述
在構建ASP.NET Core應用時,有三大框架可以幫助我們實現應用的可檢測能力,實際上這些框架不止適用於ASP.NET Core,使用.NET Core開發的任何類型的應用,都可以用這三個框架:
- l 日誌框架
- l 診斷框架
- l 健康檢查框架

2、.NET Core的日誌框架
Microsoft.Extensions.Logging日誌框架是.NET Core提供的全新框架,將日誌記錄器抽象為ILogger接口,按照嚴重程度從低到高定義了日誌級別,提供了豐富的內置提供程序,且可擴展性極強,能夠輕鬆地實現自定義日誌提供程序,同時社區已經有豐富的實現,大量老牌的日誌框架也提供了適配實現。


小技巧:由於大量高頻的字符串拼接處理會對性能有明顯的影響,在編寫日誌記錄代碼時,需要特別注意,將日誌內容的字符串拼接推遲到日誌分析記錄的階段,可以避免無效的字符串拼接執行,降低系統的性能損耗。

3、.NET Core的診斷框架
考慮到跨平台的場景,.NET Core為我們帶來了全新的診斷框架,提供了兩個核心的類型,DiagnosticListener和DiagnosticSource,藉助這兩個類型,我們可以輕鬆將診斷代碼嵌入到我們的應用和組件中。同時新的診斷框架於.NET原有的診斷框架進行了適配,可以兼容老系統的診斷代碼。




4、.NET Core的健康檢查框架
為了讓我們能夠輕鬆構建與雲基礎設施協作的應用,ASP.NET Core在2.1版本開始,提供了健康檢查組件,我們可以用簡單的幾行代碼實現應用程序健康狀況的暴露,健康檢查框架有靈活的配置能力和可擴展能力,可以輕鬆適配各種檢測場景。



5、與雲基礎設施融合
藉助健康檢查組件,我們可以將應用的健康狀況暴露給負載均衡的健康檢查,也可以與Kubernetes的Liveness、Readiness集成,使我們具備故障自動隔離的能力,保障系統在應用重啟、滾動發佈、回滾等操作時的可用性。

藉助日誌框架和健康檢查框架,我們可以實時暴露系統的運行狀況,並以推、拉的方式將信息透出給監控系統,並配置對應的告警策略,我們可以在系統發生異動時,第一時間知曉故障的節點和故障原因,快速做出響應。

6、總結
- l 診斷框架,提供了在運行時偵測任意組件內部事件的能力。
- l 日誌框架,提供了將信息透出給系統外部的能力。
- l 健康檢查框架,提供了應用程序於雲基礎設施適配協作的能力。
藉助這三個框架,我們可以很便捷地將系統打造為可檢測的系統,並與現代化的雲基礎設施完美協作,實現系統的高可用。
四、願景
開發者的幸福感,應該來自於通過技術實現的社會價值和商業價值,而.NET強大的生產力能力,正是開發者的有力武器。作為.NET社區的一員,也期望.NET生態能夠幫助更多的開發者,藉助強大的Visual Studio以及Visual Studio Code工具,高效地實現價值,持續提高開發者的幸福感。