從壹開始前後端分離[.NetCore] 40 || 完美基於AOP的介面性能分析

来源:https://www.cnblogs.com/laozhang-is-phi/archive/2019/01/18/10287023.html
-Advertisement-
Play Games

旁白音:本文是不定時更新的.net core,當前主線任務的Nuxt+VueAdmin教程的 nuxt.js 之 tibug項目已上線,大家可以玩一玩:http://123.206.33.109:7090,具體的部署教程會在下周發表。 緣起 哈嘍大家周五好呀,今天是一個不定時更新的文章,是很簡單的一 ...


旁白音:本文是不定時更新的.net core,當前主線任務的Nuxt+VueAdmin教程的 nuxt.js 之 tibug項目已上線,大家可以玩一玩:http://123.206.33.109:7090,具體的部署教程會在下周發表。

緣起

哈嘍大家周五好呀,今天是一個不定時更新的文章,是很簡單的一篇文章,大家應該都能看懂,主要包含了兩個內容,一個是對AOP編程的進一步的理解(其中還有和過濾器比較),第二個就是一個簡單的小插件——記錄介面的調用時間調用情況,也就是很簡單的性能記錄,這個時候你肯定不要和 Metricss+influxdb+grafana 作比較了,它們功能雖然很大,但是用起來笨重,咱們這種入門級別的小項目暫時先不用這個了,說到這裡,昨天有小伙伴留言,說要不要在項目中增加消息隊列 ReditMQ ,我正在考慮中,看看如何使用,好啦廢話不多說,先來幾個小問題,熱熱身:

1、在平時開發的時候,大家是如何記錄當前 <介面/方法> 的調用時間的?// 手動寫起止時間相減 

2、如何對異常進行處理的,這裡有 <api層的異常>,以及 <service 層的異常> 的?// 加 try catch  

3、如何快速的找到當前介面的錯誤信息?// 查看日誌記錄

大家先帶著這幾個問題自己想一想,是不是和我的綠色解決方案一致,要是有更好的辦法也幫忙提給我,不勝感激!

不過!今天肯定不會用這些解決方案的,今天玩兒一個新花樣,應該也會有人玩兒過,彆著急,咱們往下看。

先來個實現圖,預熱下,以後調試介面,性能+錯誤信息一目瞭然:

 

一、複習篇——我們把AOP用在了哪裡?

時間是很快,我也已經從第一個專題,寫到了第三個專題,還記得當時第一次寫AOP的時候《框架之十 || AOP面向切麵編程淺解析:簡單日誌記錄 + 服務切麵緩存》,很多很多的小伙伴不是很明白,也不知道應用場景到底在哪裡,完全不瞭解落地幾何,現在也能在群里,時不時看到有小伙伴用到AOP編程,感覺很開心,至少幫到了一些人了,這就是最大的欣慰!那咱們在Blog.core 項目中,到底如何運用了 AOP 呢?

 

1、切麵緩存

這一塊相信已經有小伙伴知道,並且用到了,我也是在很多地方使用到了,比如在基於策略的許可權認證文章中《JWT完美實現許可權與介面的動態分配》,通過了對角色模塊的切麵緩存,很好的實現了快速授權的目的,不僅代碼整潔,而且功能也實現了:

 // 將最新的角色和介面列表更新
 var data = await _roleModulePermissionServices.GetRoleModule();
 var list = (from item in data
             where item.IsDeleted == false
             orderby item.Id
             select new PermissionItem
             {
                 Url = item.Module?.LinkUrl,
                 Role = item.Role?.Name,
             }).ToList();

// 通過AOP緩存獲取角色模塊信息 [Caching(AbsoluteExpiration
= 10)] public async Task<List<RoleModulePermission>> GetRoleModule() { var roleModulePermissions = await dal.Query(a => a.IsDeleted == false); //....... return roleModulePermissions; }

 

另外還有在當前第三系列教程中,獲取Bug信息的時候,也用到了切麵緩存(所以,如果你用了文章開頭的 tibug 系統,提交了一個 bug,但是沒有立刻顯示出來,就是這個原因,10分鐘緩存):

綜上所言,經過多次使用,我個人表示真的是一個神器,在完全不露痕跡的情況下,實現了緩存,是不是很好用?

這個時候你會問,單獨為了緩存的話,AOP不是很透徹,那還有其他的用處麽?請往下看。前提是上邊的這種基於AOP的緩存你要看懂了,先在腦子裡回顧下整體流程。

 

2、切麵日誌

 上邊咱們說了緩存,我個人感覺還有一個很大的用戶就是切麵日誌,這個具體的內容以前已經說過了,這裡就不多說了,想瞭解原理和詳細說明,請看《AOP面向切麵編程淺解析:簡單日誌記錄 + 服務切麵緩存》,這裡只是複習下流程:

        public void Intercept(IInvocation invocation)
        {
            //記錄被攔截方法信息的日誌信息
            var dataIntercept = $"{DateTime.Now} " +
                $"當前執行方法:{ invocation.Method.Name} ";

            //在被攔截的方法執行完畢後 繼續執行當前方法,註意是被攔截的是非同步的
            invocation.Proceed();

            dataIntercept += ($"方法執行完畢,返回結果:{invocation.ReturnValue}");

            #region 輸出到日誌文件     
            #endregion
        }

只需要我們 ServiceConfigure 中開啟服務以後,就可以在指定文件中,看到每次的切麵介面調用情況,註意這裡是 service 層的,不是 controller 的日誌,這個時候就是 AOP 和過濾器 Filter 的區別了:

1、Filter過濾器是基於當前Http請求的,也就是介面層面的,顆粒度比較大;

2、而AOP是基於服務切麵的,是 Service 層的請求,顆粒度比較小;

那既然AOP能記錄調用日誌,能捕獲異常麽,上次群里有一個小伙伴問到了,這裡就點名錶揚了,挺棒的,能自己思考,那如何捕獲呢? 

 

3、切麵異常 

在平時的開發中,我們經常會遇到各種 Bug ,在 controller 里的錯誤就不說了,編譯的時候基本都能看出來,但是很多 service 層的錯誤,真是難找,比如我故意寫的這個bug,一個不重要的方法:

  public void NoImportantMethod()
  {
      int a = 1;
      int b = 0;
      int c = a / b;
  }

這個錯誤是如何捕獲的,大家還記得麽,就是我們用全局變數異常過濾器 Filter 捕獲的《三十五║ 完美實現全局異常日誌記錄》:

 

我們平時可能會在 api 中使用這樣的service層方法,然後下邊也會有其他的一些方法,因為這個方法不重要,比如僅僅是閱讀數量+1,那我們就不能讓當前介面崩了

 public async Task<MessageModel<Response>> Get()
 {
     var data = new MessageModel<Response>();
     
     // 一個不重要的方法
     _advertisementServices.NoImportantMethod();
    
     // 核心功能:說愛你
     Love love = New Love();
     love.SayLoveU();

     return data;
 }

這個我們我們會在 NoImportantMethod() 這裡報異常,直接崩潰出去,你感覺這樣的設計合理麽?我們不能因為一個不重要的動作就不說核心的 我愛你 了吧

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • --創建存儲過程create proc usp_userInfo@pageSize int=7,--每頁顯示條數@pageIndex int=1,--每頁顯示頁數@pageCount int output ,--顯示總的條數@recodNumber int output--顯示總的頁數asbegin ...
  • 很多小伙伴都用過Lambda表達式和linq表達式,用起來也得心應手,但是有的小伙伴 對匿名對象的查詢與接收比較迷茫,(沒有定義相應的實體),怎麼在where()裡面進行 條件篩選呢?常規用法我就不說了,我們來說一下匿名對象怎麼操作。 我們先看一下Lambda表達式的形式: 然後用過Dictiona ...
  • demo地址:https://github.com/PuzzledAlien/log4net_demo/tree/master/DotNetCoreConsole_V3 Windows 10 安裝部署 ElasticSearch 請參考上一篇文章 "Windows 10 安裝 ElasticSear ...
  • 本教程會對基本的.Net Core 進行一個大概的且不會太深入的講解, 在您看完本系列之後, 能基本甚至熟練的使用.Net Core進行Web開發, 感受到.Net Core的魅力. 本教程知識點大體分為以下幾個階段 ASP.Net Core MVC基礎知識 SqlSugar ORM (進行資料庫交 ...
  • HtmlAgilityPack簡介 HtmlAgilityPack是一個開源的解析HTML元素的類庫,最大的特點是可以通過XPath來解析HMTL,如果您以前用C#操作過XML,那麼使用起HtmlAgilityPack也會得心應手。目前版本更新的是非常的快,最新更新時間還是19年的呢! XPath介 ...
  • 1.獲取ip和埠 string str = (Request.HttpContext.Connection.LocalIpAddress.MapToIPv4().ToString() + ":" + Request.HttpContext.Connection.LocalPort); 輸出str, ...
  • C# -- 使用 DriveInfo 獲取磁碟驅動器信息 1. 代碼實現 2. 運行結果: ...
  • 四. 文件配置提供程式AddIniFile、 AddXmlFile、AddJsonFile FileConfigurationProvider 是從文件系統載入配置的基類。 以下配置提供程式專用於特定文件類型: (1) INI 配置提供程式 IniConfigurationProvider: Fil ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...