使用.NET進行高效率互聯網敏捷開發的思考和探索【一、概述】

来源:http://www.cnblogs.com/jututa/archive/2016/01/10/5119057.html
-Advertisement-
Play Games

.NET進入了生態化的新紀元,開發思路和開發理念都需要革新,是選擇也是機遇,.NET程式員的好日子終於要來啦!


不知從什麼時候開始,創業變得很廉價,談什麼都是互聯網,動輒融資千萬。這陣風好像也刮向了程式員中,有那麼一大批開發者,數據結構不好好學習、資料庫原理不扎實掌握,在github上發佈幾個項目,用nodejs創建一些服務,再用H5寫出APP,就自以為邁入了高級程式員的隊伍,能夠運籌帷幄互聯網項目,難道學習新技術、新理念就是快速成長嗎,顯然不完全是,在這浮躁的氛圍中,各種粗製濫造的互聯網網站、APP接踵而至,很多看似漂亮的APP,連簡單的http介面安全都沒有措施應對,很多美麗的響應式網站,目錄結構隨意堆疊,這實在是一股歪風邪氣,我覺得程式員還是應當踏踏實實的多學理論,多寫代碼,反覆實踐。

那麼另外一個問題就來了,新技術、新理念難道就沒有用了嗎,顯然也不是,新技術新理念是無數的技術大牛在長期的實踐中反覆重構的勝利果實,而作為一個.NET老司機,眼看著這些年微軟擁抱開源,擁抱社區帶來的改變和進步,也是深感欣慰,於是今天,我想和大家分享一下這些年我以及我的公司對於使用.NET進行Web開發乃至於互聯網應用開發的一些經驗和技術總結。

先看一個最新上線的典型案例,http://muban.printhelloworld.com,其中用到了諸如HTML5、Bootstrap、EF6 For MySql、阿裡雲RDS,阿裡雲CDN等新技術和新理念,然而卻並沒有脫離採用.NET進行開發以及採用.NET生態環境(IIS、Windows Server)進行部署這一基礎,但整個開發流程,已經完全擺脫了WebForm甚至MVC,我們實踐了一套全新的.NET開發模式,在開發效率和團隊協作上大大提升,在開發時間上也極大地縮短,在這個案例裡面,整個網站的前臺和後臺管理,從構思到設計、開發、調試、部署,1個人3天完成。下麵就開發模式的細節詳細描述,也聽取大家的意見,繼續改進和完善。

對於ASP.NET WebForm的評價,我想以下的話是客觀的:ASP.NET WebForm托拉拽以及事件驅動的Web開發模式的創新,雖然方便了一大批.NET入門者的學習和理解,但最終嚴重阻礙了的.NET的普及和商業化使用,而且在很長一段時間內,.NET優秀的語言特性得不到重視,反而一直被扣著低效率、難擴展、不適合商業開發的帽子,ASP.NET WebForm在這其中有著不可推卸的責任。

遙想06、07年的時候,我還在驚嘆於UpdatePanel的強大和方便,現在回想來看,這樣的開發模式讓開發人員對HTTP和Web本質的認識無疑是罩上了一層迷霧,從長遠看是一種倒退,再往後來,到了ASP.NET MVC時代,微軟高階程式員的陋習依舊沒有改善,雖然MVC開源了,但仍然充斥著各種自以為是的為開發人員提前想好的特性、綁定、快捷方法等等,這些東西初級開發人員可能會覺得很方便,但我想,任何從事過商業項目架構和開發的技術經理都會深有感觸,在真正需要穩定的扎實項目中,這些小聰明,不僅毫無用處,而且難以擴展,更容易導致難以掌控的Bug和漏洞。

令人慶幸的是,在Nadella的帶領下,在比爾蓋茨重新擔任技術顧問的指引下,.NET不斷修正方向,除了在語言上大步向前,更在生態建設上愈加清晰可見。我一直在懷疑公司所創造的.NET敏捷開發模式是否是先進性的體現,直到vNext(MVC6.0)的出現,我豁然開朗,原來殊途同歸,微軟終於走對路了。

在談開發模式之前,我想先談一談:

一、目前的互聯網項目或者是傳統Web項目的一些新趨勢和特點

1、不再使用WebService,而是大量使用HTTP作為數據通訊的方式

2、數據載體不再使用XML,轉而使用JSON

3、Web前端會使用Bootstrap、JQueryUI、EasyUI等第三方HTML5框架

4、有APP的需求,甚至APP優先的需求,APP需要對接各類第三方插件

5、為了追求APP快速上線,有時候會採用HTML5的APP開發模式,例如PhoneGap、AppCan、HBuilder等

6、 有微信的需求,要求對接微信公眾賬號,進行微信瀏覽器中的移動Web開發

7、開發周期短、迭代頻繁

8、數據量增長迅速,對報表展示、數據分析有較多的需求

9、項目組人員需求由Web開發工程師,細分為HTML5前端工程師、JAVA(.NET)工程師、資料庫工程師等

10、單元測試減少,功能測試越來越多,甚至用互聯網工具(worktile等)替代專業測試工具

基於以上情況,我們考慮,如果仍然使用.NET進行系統開發,那麼在用戶量<=50萬的敏捷項目里:

二、一些傳統的.NET Web開發模式和方法就應該被拋棄

1、ASP.NET WebForm以及MVC模式不再合適,他們均存在前後端耦合嚴重,簡單流程複雜化的問題,而且前端始終無法脫離.NET架構。

2、SQL Server資料庫不再合適,雖然SQL Server 2014的特性讓人激動,但隨著公有雲的使用越來越普遍,同時相比其他資料庫來說,大小、價格、可擴展性甚至性能方面,SQL Server都顯劣勢。

3、傳統三層架構不再合適,很多互聯網項目,從設計之初就要求能夠支持多服務節點,不同應用場景使用不同資料庫。再加上三層架構大量使用反射犧牲性能增加代碼,也不再適合敏捷開發。

4、Server 2003的IT架構應當被拋棄,無論是IIS6.0落後於IIS7的HTTP請求處理模型,還是Server 2003落後於Server 2008、2012的穩定和擴展,都不應當再考慮基於Server 2003和IIS6的.NET部署。

雖然被拋棄了一些東西,但微軟畢竟是微軟:

三、一些.NET特性應當被強化

1、深入使用Visual Studio 2015開發工具,VS2015是宇宙級開發工具無需多說,甚至在前端編碼(CSS、JS、HTML)上也愈加純熟,配合適合工程師自己的自定義設置以及第三方插件,將會如虎添翼

2、TFS源代碼管理的使用,無論是內部安裝TFS Express版本還是在tfs.visualstudio.com上申請免費空間,都能夠很好的進行團隊協作,以我們實踐來看,切勿被Git模式沖昏頭腦,事實上TFS管理模式才是最適合.NET開發的

3、.NET高階語言特性應當加強使用,在理解的基礎上,如果能熟練使用Linq、Lamda表達式、反射、Task並行編程等.NET特有的優質語言特性和方法,將會極大地提升開發效率,縮短開發時間。

4、IIS的高級功能和動態管理應當加強使用,IIS7以後,IIS伺服器就是高性能Web中間件的代名詞,加上Server 2008、2012的Core模式,加強對IIS的動態管理和配置能夠極大地提升Web處理效率。

5、Server 2012 R2操作系統應該加強使用,雖然跨平臺是.NET的方向,也在mono上實踐的很好,但在PC伺服器和雲伺服器越來越便宜的今天,還是多用用Windows最新的伺服器操作系統吧。

 

有了以上這些認識,經過總結,我們現行的.NET開發模式,可以簡單概括為如下:

一、前後端高度解耦

首先要做的就是徹底拋棄ASP.NET WebForm和MVC模型,前後端高度解耦,前端的所有邏輯處理均使用JS進行處理,包括Dom元素佈局與繪製以及數據請求,而後端為純粹的業務邏輯處理,包括邏輯處理以及數據處理。目前我們的項目由於使用了ASP.NET中的Routing特性,依然Host在ASP.NET模型以及IIS中,在理論中以及不久的將來,替換為Core IIS或者Linux下的Nginx來Host純HTML5以及HTMl5緩存也將非常容易。

二、前端使用純HTML5

前端拋棄傳統HTML,儘量全部使用HTML5技術,其中做出的犧牲有,拋棄IE11以下的瀏覽器,但在互聯網思維的今天,這樣的思路也未嘗不可,當在前端全部使用HTML5技術後, 文件、圖形圖像、音頻視頻、地理位置等各種處理將變得非常簡單,而且扁平化、數據化。

三、前端充分利用成熟框架

使用新的開發模式後,很明顯的一個改變就是,公司的美工不再或者很少進行前端切圖,而對於技術美工的需求(會CSS開發和JS開發、也懂設計)則日漸增加,帶來這一改變的根源就是那些不斷涌現先進的、優秀的前端框架,我們目前正在使用的有JQuery、Zepto、JQueryUI、JQueryMobile、Bootstrap、Amaze UI、inoic、Framework7、SUI、MUI等等,以及伴隨著這些優秀框架的第三方插件。客觀的說,通過優秀框架的使用,不僅沒有增加前端的系統風險,反而由於框架的開源、架構清晰、穩定等特性,實現了更加穩定、可擴展的前端。簡單的舉個例子,在解決困擾很多Web工程師的全相容性的佈局以及響應式佈局問題上,Bootstrap就功不可沒。

四、前端開發麵向對象化

將前端開發,通過JS面向對象特性進行簡單封裝,在Dom元素操作以及業務邏輯數據請求的處理上,與後端數據類型、實體結構以及處理邏輯上保持一致,不僅拉近了前後端開發人員之間對業務需求的理解,也是極大地降低的技術培訓的門檻,提升了團隊合作的效率。

五、使用CDN服務

CDN服務在幾年前還是大企業、大公司的專屬,現在已經完全普及化、平民化,Web前端越來越重是不爭的事實,但真正的業務邏輯往往只有幾十K甚至幾K,1個幾百K的頁面,90%是JQuery等第三方框架,因此,合理的使用CDN加速,不僅提升用戶端的體驗,更直接將基於HTTP架構Web服務的負載能力提升5-10倍以上。

六、業務邏輯HTTP服務化

這句話的描述可能不是很恰當,但這也是我們全新的.NET開發模式中最重要的環節,經過對阿裡開放平臺等先進互聯網架構的學習,最終我們形成了結構化但鬆散的業務邏處理模式,即每一個業務邏輯行為均有1個唯一的路由名稱,業務邏輯只對路由名稱負責,而路由名稱對流向、性能、許可權、安全等上層需求負責。這樣做的好處是,能夠充分利用3-5年左右經驗的開發人員(這也是大部分公司的開發主力軍),讓他們專註於業務邏輯的編寫,而業務邏輯之外的事情,在架構層面由其餘的控制器去解決,而一個大的.NET項目工程,也可以靈活以不同的方式拆分為各個子模塊。對於HTTP服務的實現,我們嘗試過ASP.NET ASHX處理器、Windows Service HOST WCF服務、ASP.NET Web API,當前較為穩定版本是Web API,當然針對HTTP服務化這一需求,Wen API也顯略重,以後會繼續改進。總之這一改變過程,在實踐中提升了至少3倍以上的開發效率和測試效率。在後一章節中,將會進行詳述。

七、分散式與熱載入HTTP服務建設

互聯網應用要求的是敏捷開發和反覆迭代,同一個邏輯架構下的不同請求會使用不同的伺服器和資料庫已經是家常便飯的事情,因此項目設計初期,分散式HTTP服務的建設至關重要,而業務更新更是需要能夠進行熱載入,在.NET體系裡面,就是DLL托管代碼的動態載入使用,可惜的是,由於公司現有項目並未出現大規模分散式場景,因此還未研發出較為穩定的DLL動態載入架構,在後一章節中,將會詳細討論。

八、使用阿裡雲解決大數據問題

我想任何一個使用過阿裡雲以及其他雲服務的IT架構師,都能深深的感覺到,阿裡雲已經領先其他雲不止一個身位。事實上,特別是阿裡雲的資料庫相關功能,例如RDS、DRDS、KVStore等,都已經在實踐環節真實的解決了很多傳統需求里的複雜點和困難點,具體細節後面詳細討論,但真心的說一句,趕快使用阿裡雲吧,至少在現階段,不是阿裡雲在綁架你,而是在幫助你。

今天寫了很多,總的來說,就是告訴大家,.NET的春天已經來了,.NET不僅可以進行互聯網化的敏捷開發,更能處理大型項目大型數據大型邏輯,這一點我在實踐中已經嘗到甜頭,而作為一個寫Pascal數據結構出身的程式員,也至今十五年有餘,我也對各類新技術非常感興趣,都有涉獵甚至嘗試,不怕被別的語言噴,我甚至可以大膽的說一句,其他語言,從綜合(語言、開發環境、開發效率、技術社區、團隊協作、應用能力)上來看,在應用級開發領域,已經落後.NET太多太多,只是.NET程式員自己還沒察覺,所以從這一點上來看,需要大家的共同努力,不斷鑽研和探索。

接下來的時間里,我會抽空繼續把公司這一套開發模式和相關工具抽絲剝繭,開放出來,也聽取大家的意見和建議,不斷改進和完善,今天先寫到這啦。


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

-Advertisement-
Play Games
更多相關文章
  • 終於學到事件了,不知道為何聽到“事件”就有一種莫名的興奮。可能是之前的那些知識點過於枯燥無味吧,說起事件感覺頓時高大上了。今天我們就來好好分析下這個高大上的東西。 可以說,如果沒有事件我們的頁面就只能閱讀了。有了事件,我們可以通過鍵盤或是滑鼠和頁面交互了,通過我們不同的操作頁面給出不同的響應。 ...
  • 前幾年,我有機會能參與一些有趣的項目,並且獨立完成開發、升級、重構以及新功能的開發等工作。 本文總結了一些PHP程式員在Web開發中經常 忽略的關鍵錯誤,尤其是在處理中大型的項目上問題更為突出。典型的錯誤表現在不能很好區分各種開發環境和沒有使用緩存和備份等。 下麵以PHP為例,但是其核心思想對每.....
  • 1. Append Outside of Loops凡是觸及到DOM都是有代價的。如果你向DOM當中附加大量的元素,你會想一次性將它們全部附加進來,而不是分多次進行。當在迴圈當中附加元素就會產生一個常見的問題。1 $.each( myArray, function( i, item ) {2 3 ....
  • WebBrowser是IE內置的瀏覽器控制項,無需用戶下載.一、WebBrowser控制項 二、WebBrowder控制項的方法 //列印WebBrowser1.ExecWB(6,1);//列印設置WebBrowser1.ExecWB(8,1);//列印預覽WebBrowser1.ExecWB(7,1.....
  • 1.重置瀏覽器的字體大小重置瀏覽器的預設值 ,然後重設瀏覽器的字體大小你可以使用雅虎的用戶界面重置的CSS方案 ,如果你不想下載9MB的文件,代碼如下:body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,texta...
  • 摘要: 由於手機上打字比較慢,並不適合長篇大論的文章,所以移動端的富文本編輯器很少。artEditor是一款基於jQuery的移動端富文本編輯器,支持插入圖片,後續完善其他功能。插件地址:https://github.com/baixuexiyang/artEditor 歡迎star或fork。.....
  • 最近項目比較忙額,白天要上班,晚上回來還需要做Angular知識點的ppt給同事,畢竟年底要辭職了,項目的後續開發還是需要有人接手的,所以就占用了晚上學習的時間。本來一直不打算寫這些第三方的學習筆記,不過覺得按需載入模塊並且成功使用這個確實是個好處,還是記錄下來吧。基於本獸沒怎麼深入的使用requi...
  • 首先還是先感謝github,感謝github上提供此段源碼的作者。跟昨晚看的靜態文件伺服器來比今天的靜態文件伺服器稍微複雜些,可以學到很多新的東西。仔細會發現這次的代碼多了一個fs.stat函數和ReadStream對象的pipe函數,stat這個函數是用來獲取文件信息。第一個參數是傳入文件路徑,第...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...