天天看點

開發人員必知的5種開源架構

作者:John Esposito

軟體侵吞着世界已經四年多了,但開發人員看待軟體的方式稍有不同。我們一直在緻力于解決實際問題,而很少思考軟體開發的基石。當問題變得更龐大、解決方案更複雜時,一些實用的、不怎麼産生洩漏的抽象工具就顯得越來越重要。

簡單地來說,在那些追求生産效率的開發者眼中,架構正在吞食着世界。那究竟是哪些架構、各自又在吞食着哪一部分呢?

開源界的開發架構實在太多了,多到近乎瘋狂的地步。我從2015年各種領域的榜單中選取了最受歡迎的5種架構。對于前端架構(我所擅長的領域),我隻選取那些真正的用戶端架構,這是因為現今的浏覽器和移動裝置已經具備非常好的性能,越來越多的單頁應用(SPA)正在避免和服務端交換資料。

1. 展現層:Bootstrap

我們從技術棧的頂端開始看——展現層,這一開發者和普通使用者都會接觸到的技術。展現層的赢家毫無疑問仍是Bootstrap。Bootstrap的流行度非常之驚人,遠遠甩開了它的老對手Foundation,以及新星Material Design Lite。在BuiltWith上,Bootstrap占據主導地位;而在GitHub上則長期保持Star數和Fork數最多的記錄。

如今,Bootstrap仍然有着非常活躍的開發社群。8月,Bootstrap釋出了v4内測版,慶祝它的四歲生日。這個版本是對現有功能的簡化和擴充,主要包括:增強可程式設計性;從Less遷移至Sass;将所有HTML重置代碼集中到一個子產品;大量自定義樣式可直接通過Sass變量指定;所有JavaScript插件都改用ES6重寫等。開發團隊還開設了官方主題市場,進一步擴充現有的主題生态。

2. 網頁MVC:AngularJS

随着網頁平台技術越來越成熟,開發者們可以遠離仍在使用标記語言進行着色的DOM對象,轉而面對日漸完善的抽象層進行開發。這一趨勢始于現代單頁應用(SPA)對XMLHttpRequest的高度依賴,而其中最流行的SPA架構當屬AngularJS。

AngularJS有什麼特别之處呢?一個詞:指令(directive)。一個簡單的

ng-

就能讓标簽“起死回生”(從靜态的标記到動态的JS代碼)。依賴注入也是很重要的功能,許多Angular特性都緻力于簡化維護成本,并進一步從DOM中抽象出來。其基本原則就是将聲明式的展現層代碼和指令式的領域邏輯充分隔離開來,這種做法對于使用過POM或ORM的人尤為熟悉(我們之中還有人體驗過XAML)。這一思想令人振奮,解放了開發者,甚至讓人第一眼看上去有些奇怪——因為它賦予了HTML所不該擁有的能力。

有些遺憾的是,AngualrJS的“殺手锏”雙向綁定(讓視圖和模型資料保持一緻)将在Angular2中移除,已經臨近公測。雖然這一魔法般的特性即将消失,卻帶來了極大的性能提升,并降低了調試的難度(可以想象一下在懸崖邊行走的感覺)。随着單頁應用越來越龐大和複雜,這種權衡會變得更有價值。

3. 企業級Java:Spring Boot

Java的優點是什麼?運作速度快,成熟,完善的類庫,龐大的生态環境,一處編譯處處執行,活躍的社群等等——除了痛苦的項目起始階段。即便是最忠實的Java開發者也會轉而使用Ruby或Python來快速編寫一些隻會用到一次的小型腳本(别不承認)。然而,鑒于以上種種原因,Java仍然是企業級應用的首選語言。

這時,Spring Boot出現了,它是模闆代碼的終結者,有了它,你就能在一條推文中寫出一個Java應用程式來:

https://twitter.com/rob_winch/status/364871658483351552

// spring run app.groovy
@Controller
class ThisWillActuallyRun {
  @RequestMapping("/")
  @ResponseBody
  String home() {
    "Hello World!"
  }
}
           

沒有讓人不快的XML配置,無需生成别扭的代碼。這怎麼可能?很簡單,Spring Boot在背後做了很多工作,讀上面的代碼就能看出,架構會自動生成一個内嵌的servlet容器,監聽8080端口,處理接收到的請求。這些都無需使用者配置,而是遵從Spring Boot的約定。

Spring Boot有多流行?它是目前為止fork數和下載下傳量最高的Spring應用(主架構除外)。2015年,在谷歌上搜尋Spring Boot的人數首次超過搜尋Spring架構的人。

4. 資料處理:Apache Spark

很久很久以前(2004年),谷歌研發出一種程式設計模型(MapReduce),将分布式批處理任務通用化了,并撰寫了一篇著名的論文。之後,Yahoo的工程師用Java編寫了一個架構(Hadoop)實作了MapReduce,以及一個分布式檔案系統,使得MapReduce任務能夠更簡便地讀寫資料。

将近十年的時間,Hadoop主宰了大資料處理架構的生态系統,即使批處理隻能解決有限的問題——也許大多數企業和科學工作者已經習慣了大資料量的批處理分析吧。然而,并不是所有大型資料集都适合使用批處理。特别地,流式資料(如傳感器資料)和疊代式資料分析(機器學習算法中最為常見)都不适合使用批處理。是以,大資料領域誕生了很多新的程式設計模型、應用架構、以及各類資料存儲也逐漸流行開來(甚至還從MapReduce中分離出了一種新的叢集管理系統)。

在這些新興的系統之中,伯克利AMPLab研發的Apache Spark在2015年脫穎而出。各類調研和報告(DZone、Databricks、Typesafe)都顯示Spark的成長速度非常之快。GitHub送出數從2013年開始就呈線性增長,而谷歌趨勢則在2015年呈現出指數級的增長。

Spark如此流行,它究竟是做什麼的呢?答案很簡單,非常快速的批處理,不過這點是建構在Spark的一個殺手級特性之上的,能夠應用到比Hadoop多得多的程式設計模型中。Spark将資料表達為彈性分布式資料集(RDD),處理結果儲存在多個節點的記憶體中,不進行複制,隻是記錄資料的計算過程(這點可以和CQRS、實用主義、Kolmogorov複雜度相較)。這一特點可以讓疊代算法無需從底層(較慢的)分布式存儲層讀取資料。同時也意味着批處理流程無需再背負Nathan Marz在Lambda架構中所描述的“資料卡頓”之惡名。RDD還能讓Spark模拟實時流資料處理,通過将資料切分成小塊,降低延遲時間,達到大部分應用對“準實時”的要求。

5. 軟體傳遞:Docker

嚴格意義上說,Docker并不是符合“架構”的定義:代碼庫,通用性好,使用一系列特殊約定來解決大型重複性問題。但是,如果架構指的是能夠讓程式員在一種舒适的抽象層之上進行編碼,那Docker将是架構中的佼佼者(我們可以稱它為“外殼型架構”,多制造一些命名上的混亂吧)。而且,如果将本文的标題改為“開發人員必知的5樣東西”,又不把Docker包含進來,就顯得太奇怪了。

為什麼Docker很出色?首先我們應該問什麼容器很受歡迎(FreeBSD Jail, Solaries Zones, OpenVZ, LXC)?很簡單:無需使用一個完整的作業系統來實作隔離;或者說,在獲得安全性和便利性的提升時,無需承擔額外的開銷。但是,隔離也有很多種形式(比如最先想到的

chroot

,以及各種虛拟記憶體技術),而且可以非常友善地用

systemd-nspawn

來啟動程式,而不使用Docker。然而,僅僅隔離程序還不夠,那Docker有什麼過人之處呢?

兩個原因:Dockefile(新型的tar包)增加了便攜性;它的格式成為了現行的标準。第一個原因使得應用程式傳遞變得容易(之前人們是通過建立輕型虛拟機來實作的)。第二個原因則讓容器更容易分享(不單是DockerHub)。我可以很容易地嘗試你編寫的應用程式,而不是先要做些不相關的事(想想

apt-get

給你的體驗)。

關于作者

開發人員必知的5種開源架構

John Esposito是DZone的主編,最近剛剛完成古典學博士學位的學習,養了兩隻貓。之前他是VBA和Force.com的開發者、DBA、網絡管理者。(但說真的,Lisp是最棒的!)

繼續閱讀