1. 程式人生 > >.NET架構師知識普及

.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的時候,直接返回失敗,成功的資料儲存到訊息佇列中,之後儲存到資料庫,秒殺的商品比較少的,直接用一個執行緒安全的列表就可以