從壹開始前後端分離 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
更多相關文章
  • 2019-01-19 多重背包:每種東西有多個,因此可以把它拆分成多個01背包 優化:二進位拆分(拆成1+2+4+8+16+...,分別表示2的n次冪) 比如18=1+2+4+8+3,可以證明18以內的任何數都可以用這幾個數的和或差表示(每個數只能用一次)(0時則背包為空), 所以就把2個,4個.. ...
  • 最近想要做一個小東西,用到了下麵幾個中間件或者環境: Java Tomcat Maven MongoDB ZooKeeper Node 並且恰好碰到騰訊雲打折,雲主機原價100多一個月,花了30塊錢買了三個月。買下後立即動手準備開始環境配置。 說到環境,少則2小時,多則兩三天可能都要整矇蔽,環境好了 ...
  • 寫之前的說明 0. 其實吧。 這個東西已經寫好了,地址在:https://github.com/hjx601496320/JdbcPlus 這 系列 文章算是我寫的過程的總結吧。(恩系列,說明我可能會寫好久,╮(╯▽╰)╭) 1. 現在有很多的現成的orm框架,為什麼還要自己寫一個? 框架這種東西個 ...
  • 開始研究動態代理之前 先簡要談下動態代理的概念 在不改變原有類結構的前提下增強類的功能以及對類原有方法操作,註意是方法不是屬性(屬性一般被設計為private修飾,不可以直接被調用) 動態代理的基本實例不做闡述,網上一大把 不理解的同學可以直接去搜索。 今天說的是自己在項目中遇到的一個實際的動態代理 ...
  • 引入 gRPC 是谷歌推出的一個高性能優秀的 RPC 框架,基於 HTTP/2 實現。並且該框架對 .NET Core 有著優秀的支持。最近在做一個項目正好用到了 gRPC,遇到了需要串流傳輸的問題。 引入 項目創建 首先還是需要安裝 .net core sdk,可以去 http://dot.net ...
  • 項目上用到的,隨手做個記錄,哈哈。 直接上代碼: 1 using System; 2 using System.Data; 3 using System.Configuration; 4 using System.Collections.Generic; 5 using System.IO; 6 u ...
  • 在UWP應用開發中,我們常常有向用戶發送一些提示性消息的需求。這種時候我們一般會選擇MessageDialog、ContentDialog或者ToastNotification來完成功能。 但是,我們大多數時候僅僅是需要在應用內向用戶顯示一條提示消息(例如“登錄成功!”),不需要用戶對這條消息做出處 ...
  • 代碼期間,把代碼過程經常用的內容做個珍藏,下邊代碼是關於C#的String.Split 分割字元串用法詳解的代碼,應該對碼農們有些用途。 1) public string[] Split(params char[] separator)2) public string[] Split(char[] ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...