今天看到一篇漫畫,[3年.NET開發應聘大廠慘遭淘汰,如何翻身打臉面試官?],好多問題,一會兒還真的回答不了,這裏對這些問題進行了整理,增長下腦容量,哈哈。俗話說不想當將軍的士兵不是好士兵,不想當架構師的程序員,不是一個努力要進步的程序員,努力加油,不斷學習。有人說架構師都是一批禿頂的人,程序員都是一羣XX,其實現實是,架構師好多不是禿頂,不用擔憂本身成了架構師變成禿頂,那都是嚇人的。程序員也是懂得浪漫的,要否則那麼多浪漫的程序,那麼多酷炫的技巧都是怎麼實現的。html
委託是一種引用類型,表示對具備特定參數列表和返回類型的方法的引用。委託用於將方法做爲參數傳遞給其餘方法。事件就是經過委託調用的方法。
例如:程序員
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這篇文章介紹的比較詳細。web
.NET的管道:在管道模型運行開始前,首先HTTP的請求被被傳遞到HttpRuntime類的一個實例中,而後這個實例對象檢測請求並找到被接受的那個應用程序,接下來管道模型就使用HttpApplicationFactory對象來建立一個HttpApplication對象來處理這個請求(在此同時也將建立HttpContext,HttpRequest和HttpResponse),一個HttpApplication能夠包含一系列HttpModule對象。面試
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頁面運行週期--頁面關係api
中間件是一種裝配到應用管道中以處理請求和響應的程序,使用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
程序運行 結束。服務器
數據庫事物的四大特性:原子性、一致性、隔離性、持續性(永久性)。原子性:要麼全作,要麼全不作;一致性:事務執行的結果必須是使數據庫從一個一致性狀態變到另外一個一致性狀態。一致性與原子性是密切相關的;隔離性:一個事務的執行不能被其餘事務干擾;永久性:一個事務一旦提交,它對數據庫中數據的改變就應該是永久性的。
事務的隔離性:未提交讀(Read uncommitted),已提交讀(Read committed),可重複讀(Repeatable read),可串行化(Serializable )。未提交讀:最低級別,任何狀況都沒法保證;已提交讀:可避免髒讀的發生;可重複讀:可避免髒讀、不可重複讀的發生;串行化:可避免髒讀、不可重複讀、幻讀的發生。舉例:未提交讀:A更新了數據沒有提交B能夠看到;已提交讀:A更新了數據沒有提交B看不到,提交以後能夠看到;可重複讀:A插入一條數據,提交以後,B看不到,B事物結束以後,在查詢能夠看到;可串行化:A執行完以後B纔可執行。(全部的一切操做都是並行操做)
數據庫中的鎖:分爲獨佔鎖(即排它鎖),共享鎖和更新鎖,細分又可分爲表鎖、行鎖、頁鎖等。
爲何須要所?當併發事務同時訪問一個資源時,有可能致使數據不一致,所以須要一種機制來將數據訪問順序化,以保證數據庫數據的一致性。
共享鎖表示對數據進行select操做,多個事務能夠同時爲一個對象加共享鎖。排他鎖也叫寫鎖,排他鎖表示對數據進行insert、update或delete操做,若是一個事務對對象加了排他鎖,其餘事務就不能再給它加任何鎖了。更新鎖在的初始化階段用來鎖定可能要被修改的資源,這能夠避免使用共享鎖形成的死鎖現象。
SOA的全稱是Service Oriented Architecture,即面向服務的架構。它能夠根據需求經過網絡對應用組件進行分佈式部署、組合和使用,服務層是SOA的基礎,能夠直接被應用調用,從而有效控制系統鬆耦合。簡單來講就是A功能佈置在A服務器,B功能佈置在B服務器,他們都開放出接口供C。。等訪問,C不用知道A,B是如何實現的,只管用就能夠了。簡單的例子webservice、WCF、web api等等。
SOA框架的文章,Web Service 和WCF的比較
個人理解是:SOA和微服務是一脈相承的,二者都是中立性,語言無關,協議跨平臺。微服務的目的是有效的拆分應用,服務的細粒度,重用組合,甚至是每一個操做(或方法)都是獨立開發的服務,足夠小到不能再進行拆分。SOA更適合大型企業中的業務過程編排、應用集成。
C#源碼文件 →→ C#編譯器 →→ 程序集 →→ 本機語言
底層的庫:CLR(Common Language Runtime)公共語言運行時,CTS(Common Type System)通用類型系統,CLS(Common Language Specfication)公共語言規範,CIL(Common Intermediate Language)公共中間語言,CLI(Common Language Infrastructure)公共語言基礎結構
DNS查詢 →→ TCP連接 →→ HTTP請求 → 服務器響應 →→ 客戶端渲染(HTML,CSS,JS)
中介者模式是用來下降類類之間的耦合的,由於若是類類之間有依賴關係的話,不利於功能的拓展和維護,只要修改一個對象,其它關聯的對象都得進行修改,若是使用中介者模式,只需關心和Mediator類的關係,具體類類之間的關係及調度交給Mediator就行。房產中介、QQ遊戲平臺、聊天室、QQ羣和短信平臺
應用服務和數據服務分離,使用緩存改善網站性能,使用應用服務器集羣改善網站的併發處理能力,數據庫讀寫分離,使用反向代理和CDN加速網站響應,使用分佈式文件系統和分佈式數據庫系統,使用NoSQL和搜索引擎,對業務拆分,創建分佈式服務。
水平擴展:利用Nginx創建分佈式系統,增長服務器,增長CPU
解決高併發問題:增長緩存、禁止用戶重複操做、創建請求隊列
對比IIS來講,它依賴HTTP.SYS的內置程序來監聽外部的HTTP請求,若是請求的是一個可訪問的URL,HTTP.SYS會將這個請求交給IIS工做進程,把信息保存到HttpWorkRequest中,在相互隔離的應用程序域AppDomain中加載HttpRuntime,調用HttpRuntime的ProcessRequest方法,以後就是咱們的程序操做,最後返回數據流,並從新返回到HTTP.SYS,HTTP.SYS在將數據返回給客戶端瀏覽器。
Win10下IIS配置圖解、MVC項目發佈圖解、IIS添加網站圖解。
Redis緩存秒殺的商品ID,數量,一個請求數量減小一個,數量等於0的時候,直接返回失敗,成功的數據保存到消息隊列中,以後保存到數據庫,秒殺的商品比較少的,直接用一個線程安全的列表就能夠了。