哪個家伙說“網站去.Net化”?


上個月,JavaEye創始人范凱robbin的一篇博客《對.NET系統架構改造的一點經驗和教訓》引起了大討論,里面提到了京東“去.Net化”、“CSDN去.Net化”之類的詞刺激到了一些人的神經,有的人在評論中破口大罵“.Net最牛逼,.Net搞不好是你技術不行”,有的人則罵“.Net就是垃圾,上不了大台面”。有些朋友還在微博上at我,問我“楊老師,.net是不是不行了,聽說大網站都‘去.Net化’了”、“楊老師,關於‘去.Net化’你怎么看?”,所以我還是來談談所謂的“去.Net化”吧。

         其實只要認真看robbin的文章,就會知道他並不是在說“去.Net化”而是在說“怎樣搭建合適的網站框架”。注意看這段話:

  1. 數據層放棄SQL Server數據庫和存儲過程,全部遷移到Linux平台上的MySQL數據庫上;
  2. 緩存不再依賴.net自身提供的緩存機制,遷移到部署在Linux平台上的分布式的Redis上;
  3. 服務之間的調用,避免使用.net自身專有協議,改成Restful的HTTP Web API調用;
  4. 靜態資源請求,不再讓IIS自己處理,分離到Linux平台上的nginx去處理;
  5. 需要讀取的文件系統,也改成訪問Linux平台上的分布式文件系統;
  6. 部署.net代碼的Windows服務器放在LVS后面,用LVS做負載均衡和故障切換; 

簡單說來,就是單純讓.net做應用層的編程語言和框架,其他都交給Linux平台的開源解決方案。而.net框架單純做應用層,無論ASP.net MVC的開發效率,還是.net CLR虛擬機的運行效率都非常好,目前我們單台Windows服務器上跑幾百萬的動態請求毫無壓力,而且應用層架構是可以橫向擴展的:如果請求負載非常高,只需要添加更多Windows服務器即可。總之,做到了揚長避短。

         熟悉大型互聯網技術架構的人應該很容易的發現,這個重構過程其實就是一個“讓合適的東西干合適的事情”這樣一項工作:

  1. 把過多業務邏輯寫到存儲過程中必然導致數據庫服務器壓力的增大,而且不利於負載均衡,因此去“存儲過程”是必要的;
  2. SQLServer實現集群的能力很差,用MYSQL之類的數據庫是一個不錯的選擇;
  3. 緩存還是用.Net內置的InProc緩存機制對於高並發的網站來講是一個災難,用Redis之類分布式緩存來代替是必然的過程;
  4. 使用.Net Remoting之類的私有協議不利於異構系統集成,改成webservice、REST也是必須的;
  5. 靜態文件的請求也經過IIS有點太勞煩IIS了,扔給nginx才更合適;
  6. Windows服務器的文件系統很不靈活,換成更加靈活的Linux下的分布式文件系統是聰明的;
  7. 采用LVS、nginx之類做負載均衡也是最合適的。

          其實任何一個大型互聯網基本都是這樣一個架構:前端使用nginx等做負載均衡,使用Redis、memcached等做分布式緩存,使用數據庫集群進行讀寫分離之類的優化,使用分布式文件系統處理圖片等靜態文件。

         請問,使用PHP、Java等做web服務器開發的大型互聯網,哪個使用JSP內置的Session對象做Session的,不都要換用redis嗎?哪個把圖片和php放到一個服務器的,不都放到文件服務器中嗎?哪個一個apache服務器就可以扛起來的,不都是nginx之類的擋在前面做負載均衡的嗎?  怎么不說“去php化”、“去java化”呢?要知道redis、memcached、ngix之類的可都不是java、php寫的呀,一個java項目竟然用其他語言寫的東西,難道不丟面子?

         其實一個大型的系統中,根據項目的不同特點來組合搭配不同的產品、組件是一個必然的過程,去了解一下這些系統中“混搭”是常見的現象。單一產品中提供能的功能只能滿足普通項目的需求,要想滿足復雜的項目,必須把這些產品中提供的一些傻瓜化的簡單組件用更專業的組件來替換,就像做小項目php中的Session足夠了,但是大項目必須用c/c++開發的memcached來替換。

         我前陣子我發了一個帖子《【分享】.Net有哪些大型項目、大型網站的案例?》 ,這個帖子中提到的.Net技術的大型網站絕大部分都是“混搭結構”的(這些網站中至少有10個有傳智播客.Net培訓班的學生,我都跟他們交流過他們的技術架構)。很奇怪的一件事情是,在Java、PHP社區中經常可以看到討論這些“架構”的文章,但是在.Net社區中則很少見到有人分享這些東西。希望.Net社區中的技術大牛們以后能把這些經驗多多分享,讓更多的人能夠了解這些技術並且在項目中應用這些技術,提升.Net社區討論技術的層次,不要讓.Net社區的人總是在討論一些很初級的問題,最起碼不要只是為了不同網頁頭尾統一就使用又笨又重的MasterPage(其實用一下shtml就可以了)、不要討論個三層架構就認為是架構師了、不要弄個代碼生成器就是高科技了……咱們也要真正的擁抱Best Practice、擁抱混搭。

         不希望這個博文又成為不同語言相互攻擊的月經貼,希望大家討論一些真正有用的東西。

如鵬網.Net培訓班正在報名,有網絡的地方就可以參加如鵬網的學習,學完就能高薪就業,點擊此處了解

 

    三年前只要懂“三層架構”就可以說“精通分層架構”;現在則需要懂IOC(AutoFac等)、CodeFirst、lambda、DTO等才值錢;

    三年前只要會SQLServer就可以說自己“精通數據庫開發”;現在則需還需要掌握MySQL等開源數據庫才能說是“.Net開源”時代的程序員;

    三年前只要會進行用戶上傳內容的安全性處理即可;現在則需要熟悉雲存儲、CDN等才能在雲計算時代游刃有余;

    三年前只要掌握Lucene.Net就會說自己“熟悉站內搜索引擎開發”;現在大家都用ElasticSearch了,你還用Lucene.Net就太老土了;

    三年前發郵件還是用SmtpClient;現在做大型網站發郵件必須用雲郵件引擎;

    三年前緩存就是Context.Cache;現在則是Redis、Memcached的天下;

    如鵬網再次引領.Net社區技術潮流!點擊此處了解如鵬網.Net最新課程


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM