.NET架構師知識普及

来源:https://www.cnblogs.com/zhao123/archive/2019/06/28/11104207.html
-Advertisement-
Play Games

今天看到一篇漫畫,[3年.NET開發應聘大廠慘遭淘汰,如何翻身打臉面試官?],好多問題,一下子還真的回答不了,這裡對這些問題進行了整理,增加下腦容量,哈哈。俗話說不想當將軍計程車兵不是好士兵,不想當架構師的程式員,不是一個努力要進步的程式員,努力加油,不斷學習。有人說架構師都是一批禿頂的人,程式員都是 ...


今天看到一篇漫畫,[3年.NET開發應聘大廠慘遭淘汰,如何翻身打臉面試官?],好多問題,一下子還真的回答不了,這裡對這些問題進行了整理,增加下腦容量,哈哈。俗話說不想當將軍計程車兵不是好士兵,不想當架構師的程式員,不是一個努力要進步的程式員,努力加油,不斷學習。有人說架構師都是一批禿頂的人,程式員都是一群XX,其實現實是,架構師好多不是禿頂,不用擔心自己成了架構師變成禿頂,那都是嚇人的。程式員也是懂得浪漫的,要不然那麼多浪漫的程式,那麼多酷炫的技巧都是怎麼實現的。

1.C#中的委托是什麼?事件是不是一種委托?

委托是一種引用類型,表示對具有特定參數列表和返回類型的方法的引用。委托用於將方法作為參數傳遞給其他方法。事件就是通過委托調用的方法。
例如:

public class DelegateTest
{
    public delegate int AddDelegate(int a, int b); //定義委托類型
    public AddDelegate addDelegate; //定義委托
    public event AddDelegate AddDelegateForEvent; //定義事件

    public int Add(int a, int b) {
        Console.WriteLine($"a:{a},b:{b}");
        return a + b;
    }
    //委托和事件的使用
    public static void Test() {
        DelegateTest text = new DelegateTest();
        text.addDelegate = text.Add; ;
        text.addDelegate(1, 2);

        text.AddDelegateForEvent += text.addDelegate;
        text.AddDelegateForEvent += text.addDelegate;
        text.AddDelegateForEvent(10, 20);//或者下麵的使用
        //AddDelegate d = text.AddDelegateForEvent;
        //d(10, 20);
        //結果
        //a: 1,b: 2
        //a: 10,b: 20
        //a: 10,b: 20
    }
    //Func和Action的使用
    public static void Test2() {
        Func<int, int, int> add = (int a, int b) => { return a + b; };
        Action<int, int> addVoid = (int a, int b) => { int c = a + b; };
    }
}

C#中委托這篇文章,對委托有更多的介紹。Fun和Action是微軟封裝的委托,一個有返回值,一個沒有,C#高級功能(三)Action、Func,Tuple這篇文章介紹的比較詳細。

2.聊聊.NET的管道和.NET Core的中間件

.NET的管道:在管道模型運行開始前,首先HTTP的請求被被傳遞到HttpRuntime類的一個實例中,然後這個實例對象檢測請求並找到被接受的那個應用程式,接下來管道模型就使用HttpApplicationFactory對象來創建一個HttpApplication對象來處理這個請求(在此同時也將創建HttpContext,HttpRequest和HttpResponse),一個HttpApplication可以包含一系列HttpModule對象。

ASP.NET MVC請求生命周期

URL Routing Module →→ Matching Route Entry →→ Route Handle →→ Http Handle →→ Controller Factory →→ Controller →→ Action Invoker →→ Module Binders →→ Authentication Filter →→ Authorization Filter →→ Action Filter →→ Action Execution →→ Action Filter →→ Action Result
簡單就是:Url →→ Route →→ Controller →→ Action →→ View

其他的ASP.NET生命周期的文章,ASP.NET生命周期 , WebForm頁面運行周期--頁面關係

.NET Core的中間件

中間件是一種裝配到應用管道中以處理請求和響應的程式,使用Run、Map和Use擴展方法來配置請求委托。請求委托用於構建請求管道,處理每個HTTP請求。每個委托可以在下一個委托之前和之後執行操作。委托還可以決定不將請求傳遞給下一個委托,這稱為請求管道的短路。短路通常是可取的,因為它避免了不必要的工作。

public class Startup
{
    //此處省略部分代碼,創建一個新的Core web項目,可以自行查看
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseCookiePolicy();

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });
    }
}

Configure方法中的就是中間件,中間件組件的順序定義了在請求上調用它們的順序,以及響應的相反順序,此排序對於安全性,性能和功能至關重要。
常用的中間件順序
1. 異常/錯誤處理
2. HTTP 嚴格傳輸安全協議,HTTP協議介紹
3. HTTPS 重定向
4. 靜態文件伺服器
5. Cookie 策略實施
6. 身份驗證
7. 會話
8.MVC

中間件例子:

 public class LogMiddleware
{
    private readonly RequestDelegate _next;
    public LogMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task Invoke(HttpContext context)
    {
        Debug.WriteLine("程式運行 開始。");
        await _next(context);
        Debug.WriteLine("程式運行 結束。");
    }
}

public static class LogMiddlewareExtensions {
    public static IApplicationBuilder UseLog(this IApplicationBuilder app) {
        return app.UseMiddleware<LogMiddleware>();
    }
}

在Configure中 app.UseLog();就可,程式運行,會在VS調試輸出的地方顯示
程式運行 開始。
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:Information: Route matched with {action = "Index", controller = "Home"}. Executing action ----此處省略部分輸出
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:Information: Executed action WebCore.Controllers.HomeController.Index (WebCore) in 13.9555ms
程式運行 結束。

3.說說資料庫的隔離級別,資料庫有哪些鎖

資料庫事物的四大特性:原子性、一致性、隔離性、持續性(永久性)。原子性:要麼全做,要麼全不做;一致性:事務執行的結果必須是使資料庫從一個一致性狀態變到另一個一致性狀態。一致性與原子性是密切相關的;隔離性:一個事務的執行不能被其他事務干擾;永久性:一個事務一旦提交,它對資料庫中數據的改變就應該是永久性的。
事務的隔離性:未提交讀(Read uncommitted),已提交讀(Read committed),可重覆讀(Repeatable read),可串列化(Serializable )。未提交讀:最低級別,任何情況都無法保證;已提交讀:可避免臟讀的發生;可重覆讀:可避免臟讀、不可重覆讀的發生;串列化:可避免臟讀、不可重覆讀、幻讀的發生。舉例:未提交讀:A更新了數據沒有提交B可以看到;已提交讀:A更新了數據沒有提交B看不到,提交之後可以看到;可重覆讀:A插入一條數據,提交之後,B看不到,B事物結束之後,在查詢可以看到;可串列化:A執行完之後B才可執行。(所有的一切操作都是並行操作)
資料庫中的鎖:分為獨占鎖(即排它鎖),共用鎖和更新鎖,細分又可分為表鎖、行鎖、頁鎖等。
為什麼需要所?當併發事務同時訪問一個資源時,有可能導致數據不一致,因此需要一種機制來將數據訪問順序化,以保證資料庫數據的一致性。
共用鎖表示對數據進行select操作,多個事務可以同時為一個對象加共用鎖。排他鎖也叫寫鎖,排他鎖表示對數據進行insert、update或delete操作,如果一個事務對對象加了排他鎖,其他事務就不能再給它加任何鎖了。更新鎖在的初始化階段用來鎖定可能要被修改的資源,這可以避免使用共用鎖造成的死鎖現象。

4.口述下如何設計一個SOA框架

SOA的全稱是Service Oriented Architecture,即面向服務的架構。它可以根據需求通過網路對應用組件進行分散式部署、組合和使用,服務層是SOA的基礎,可以直接被應用調用,從而有效控制系統松耦合。簡單來說就是A功能佈置在A伺服器,B功能佈置在B伺服器,他們都開放出介面供C。。等訪問,C不用知道A,B是如何實現的,只管用就可以了。簡單的例子webservice、WCF、web api等等。

SOA框架的文章,Web Service 和WCF的比較

5.SOA和微服務架構之間的主要區別是什麼?

我的理解是:SOA和微服務是一脈相承的,兩者都是中立性,語言無關,協議跨平臺。微服務的目的是有效的拆分應用,服務的細粒度,重用組合,甚至是每個操作(或方法)都是獨立開發的服務,足夠小到不能再進行拆分。SOA更適合大型企業中的業務過程編排、應用集成。

6.瞭解各個framework的底層不?

C#源碼文件 →→ C#編譯器 →→ 程式集 →→ 本機語言
底層的庫:CLR(Common Language Runtime)公共語言運行時,CTS(Common Type System)通用類型系統,CLS(Common Language Specfication)公共語言規範,CIL(Common Intermediate Language)公共中間語言,CLI(Common Language Infrastructure)公共語言基礎結構

7.說說瀏覽器頁面的渲染過程

DNS查詢 →→ TCP鏈接 →→ HTTP請求 → 伺服器響應 →→ 客戶端渲染(HTML,CSS,JS)

8.說說中介模式的設計原理和應用場景

中介者模式是用來降低類類之間的耦合的,因為如果類類之間有依賴關係的話,不利於功能的拓展和維護,只要修改一個對象,其它關聯的對象都得進行修改,如果使用中介者模式,只需關心和Mediator類的關係,具體類類之間的關係及調度交給Mediator就行。房產中介、QQ游戲平臺、聊天室、QQ群和簡訊平臺

9.請問如何構架一個高負載的系統?

應用服務和數據服務分離,使用緩存改善網站性能,使用應用伺服器集群改善網站的併發處理能力,資料庫讀寫分離,使用反向代理和CDN加速網站響應,使用分散式文件系統和分散式資料庫系統,使用NoSQL和搜索引擎,對業務拆分,建立分散式服務。

10..NET系統如何實現水平擴展、如何解決高併發問題

水平擴展:利用Nginx建立分散式系統,增加伺服器,增加CPU
解決高併發問題:增加緩存、禁止用戶重覆操作、建立請求隊列

11.說說IIS的工作原理?

對比IIS來說,它依賴HTTP.SYS的內置程式來監聽外部的HTTP請求,如果請求的是一個可訪問的URL,HTTP.SYS會將這個請求交給IIS工作進程,把信息保存到HttpWorkRequest中,在相互隔離的應用程式域AppDomain中載入HttpRuntime,調用HttpRuntime的ProcessRequest方法,之後就是我們的程式操作,最後返回數據流,並重新返回到HTTP.SYS,HTTP.SYS在將數據返回給客戶端瀏覽器。

Win10下IIS配置圖解MVC項目發佈圖解IIS添加網站圖解

12.手寫一個千萬併發的商品秒殺功能

Redis緩存秒殺的商品ID,數量,一個請求數量減少一個,數量等於0的時候,直接返回失敗,成功的數據保存到消息隊列中,之後保存到資料庫,秒殺的商品比較少的,直接用一個線程安全的列表就可以了。


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

-Advertisement-
Play Games
更多相關文章
  • Zookeeper 從設計模式角度來看,是一個基於觀察者模式設計的分散式服務管理框架,它負責存儲和管理大家都關心的數據,然後接受觀察者的註冊,一旦這些數據的狀態發生變化,Zookeeper 就將負責通知已經在 Zookeeper 上註冊的那些觀察者做出相應的反應,從而實現集群中類似 Master/S... ...
  • 6.28自我總結 客戶端與伺服器之間文件傳輸斷電續傳 `通過判斷文件大小,以及文件在讀取中的指針位置的調整來解決斷電續傳問題' 1.程式目錄 2.程式思路 第一步:我們什麼都不懂,但是有幾個模塊肯定會有一個是conf中的setting來存一些常量 第二步:我們也需要一個db文件來存內容 第三步:我們 ...
  • 定義 用原型實例指定創建對象的種類,並且通過複製這些原型創建新的對象。 類圖如下: 原型模式涉及3個角色。 客戶(Client)角色:該角色提出創建對象的請求。 抽象原型(Prototype)角色:該角色是一個抽象角色,通常由一個Java介面或抽象類實現,給出所有的具體原型類所需要的介面。 具體原型 ...
  • 性能分析工具小試 1. perf sudo yum install perf* 註:這個也可以用源碼安裝,比如我系統目錄:/usr/src/kernels/3.10.0-862.el7.x86_64/tools/perf 這裡邊直接帶有perf 首先編譯debug版程式,比如編譯了test程式,然後 ...
  • 先做個自我介紹,我13年考上一所很爛專科民辦的學校,學的是生物專業,具體的學校名稱我就不說出來獻醜了。13年我就輟學了,我在那樣的學校,一年學費要1萬多,但是根本沒有人學習,我實在看不到希望,我就退學了。退學後我也迷茫,大專都沒有畢業,我真的不知道我能幹什麼,我在糾結著我能做什麼。所以輟學後我一段時 ...
  • 在上一篇文章Exceptionless - .Net Core開源日誌框架中就說到如何對Exceptionless進行本地化部署,不過我也跟大家說了,僅限於能用的階段。那今天我就繼續來探討一下如何再用好。 ...
  • 在前面隨筆《ABP開發框架前後端開發系列---(9)ABP框架的許可權控制管理》中介紹了基於ABP框架服務構建的Winform客戶端,客戶端通過Web API調用的方式進行獲取數據,從而實現了對組織機構、角色、用戶、許可權等管理,其中沒有涉及菜單部分,本篇隨筆介紹在ABP框架中實現菜單的管理,菜單是作為... ...
  • 隨著工業互聯的發展,掃碼槍在很多場合都有所應用,超市、商場以及一些智能工廠。今天主要講如何通過C#實現與新大陸掃碼槍(OY10)進行通信,對於掃碼槍的配置,這裡就不多說了,結合說明書就可以實現。這裡值得註意的是,如果安裝驅動後,電腦設備管理器中看不到COM口,可能需要掃一個條形碼來設置一下,具體參考 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...