1. 程式人生 > >超敏捷 Java 開發框架 ServcieFramework 作者祝海林專訪

超敏捷 Java 開發框架 ServcieFramework 作者祝海林專訪

ServcieFramework是一個敏捷、快速、富領域模型的Java MVC 框架,其設計理念是讓使用者真正能夠用最簡單的方式解決80%的問題。

該專案目前應用於作者公司內部的一個產品中,剛開源不久,便引起了開發者的廣泛關注與討論。為了使大家進一步瞭解該框架,我們專訪了作者祝海林。

歡迎大家推薦更多開源專案給我們,支援中國的開源專案發展,如果您和您的團隊希望展示創業理念和有趣之處,或者有朋友正在創造這樣的價值,請聯絡我們,發信到[email protected]即可。

先來個自我介紹吧!
 

網名 WilliamZhu,微博@PrinceCharmingJ。Java程式設計師,4年開發經驗,2010年懵懂來京。有過短暫幾天Rails程式設計師生涯,頗為自豪。曾經為了建立一個音樂新模式的嘗試而奮鬥過,至今仍念念不忘。現專注於搜尋和資料探勘領域。平常的愛好就是向大牛們提問、聆聽、學習。

ServcieFramework 是什麼? 

ServcieFramework,一個敏捷、快速、其ORM 和 Controller等設計會 surprize 你的一個 Java MVC 框架,專為移動應用後端量身定做,適用於快速搭建一個後端服務(說的好像有點拗口,oh yeah~~~)

ServcieFramework 三大亮點

  •     ORM 實現真正的充血模型,非常 ActiveRecord 化。   
  •     非常輕量,你完全看不到servlet api,因為壓根就沒有使用Servlet規範。應用本身是一個普通的Java程式,http監聽只是其中的一個模組。
  •     便於測試。模型類和controller都可以當作普通的類來進行測試。 

發起這個專案的初衷是什麼? 

專案的起源是我們要用Java寫一個後臺服務,提供Web API,但覺的Spring太重,後來我們用nutz開發,但仍然覺得nutz有很多限制,比如,我們對response status比較重視。客戶端會根據不同狀態碼進行不同處理,nutz就顯得支援有點弱了。最後我跟老闆說,給我機會,我可以寫個更輕量,更RESTFul的。於是便在老闆的支援下有了ServcieFramework。目前該專案應用在我們的搜尋產品中。

開發效率比肩Rails,如何體現?是如何實現的? 

你可以 clone ServiceFramework一份下來試試。當然從文件也是能夠直觀看到的。待會我會舉幾個小例子。

另外之前我也發過一篇關於
ServiceFramewok的資訊
,不願意看文件的同學也可以看看這篇簡短的資訊。

為了充分說明開發的便捷性,我直接在這篇採訪稿中做個例子。

建立一張表:

--標籤表  
CREATE TABLE `tag` (  
  `id` int(11) NOT NULL AUTO_INCREMENT,  
  `name` varchar(255) DEFAULT NULL,  
  `tag_synonym_id` int(11) DEFAULT NULL,  
  `weight` int(11) DEFAULT NULL,  
  PRIMARY KEY (`id`)  
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;  
  
--標籤組。一個標籤可以屬於多個標籤組。一個標籤組包含多個標籤  
CREATE TABLE `tag_group` (  
  `id` int(11) NOT NULL AUTO_INCREMENT,  
  `name` varchar(32) DEFAULT NULL,  
  PRIMARY KEY (`id`),  
  UNIQUE KEY `id` (`id`)  
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

定義兩個類:

public class Tag extends Model {  
    @Validate  
    private final static Map $name = map(  
    presence, map("message", "{}欄位不能為空"),  
    uniqueness, map("message", "{}欄位不能重複")  
    );  
  
    @ManyToMany  
    private List<TagGroup> tag_groups = list();  
}  
  
public class TagGroup extends Model {  
    @ManyToMany  
    private List<Tag> tags = list();  
}  

Ok了,模型類建立完畢。 寫一個controller: 

public class TagController extends ApplicationController {  
       
     @BeforeFilter  
     private final static Map $check_params = map(only, list("save"));  
       
     @At(path = "/blog", types = POST)  
     public void save() {  
         if(!Tag.save(params())){  
             render(HTTP_400,tag.validateResults);  
         }  
         render(ok());  
     }  
       
     private void check_params(){  
       if(isEmpty(param("tag")))render(HTTP_400,"您至少需要傳遞一個name欄位");  
     }  
}  

一個簡單的例子就做完了。查詢方面提供了Arel的查詢形式。比如: 

List<Order> orders = Order.where("status=:status",map("status",Order.Status.NEW)).joins("details").fetch(); 

ServiceFramewok實現重點有三個方面: 

  • 簡化ORM框架。在我看來,Rails 的ActiveRecord是ORM的最佳實踐。ServiceFramework的ORM基本是照著它改的。
  • 重新設計Controller中的 filter(interceptor)。各種before filter、around filter 可以有效簡化邏輯應用。而框架本身則努力簡化filter的使用。
  • 規範化專案目錄。目前大部分新的框架都是這麼做到的。一開始就給你生成一個標準的專案目錄結構。ServiceFramework則進一步簡化了這個操作。
順帶提一下目前類似Rails的Java框架可能會用到的一些技術: 

  • 位元組碼增強。比如javassist、cglib等。代表有PlayFramework。
  • AOP 通過對註解等的解析,生成相應的切面檔案。不過這需要特定的編譯器。代表有 Spring ROO。
  • 還有就是通過IDE生成根據模板生成一些檔案。這個可操作性不強。
ServiceFramework 目前採用的是位元組碼增強的方式。應用啟動時會自動增強模型類。

我也可以直接用Rails(或者基於JVM的jRuby、Grails),為何還要使用這個框架? 

如果你想用Java,並且想獲得類似Rails的敏捷開發效率,那麼用ServiceFrameowrk。 

轉換語言需要考慮很多問題。比如Rails是多程序模型,而Java專案通常是單程序多執行緒的。並且Ruby VM 和 JVM 在效能、健壯性、監控、GC等各個 
方面還是有差距的。至於JRuby、Grails等基於JVM上的語言,和原生Java的整合並不如想象中的那麼完美。 

對於一般的網際網路應用,如果你能夠採用指令碼語言,建議優先考慮Ruby(CRuby),接著Groovy,然後JRuby。

和其他框架(如Play)相比,ServcieFramework有什麼優勢或獨特之處? 

應該說ServiceFramework得到Play的很多啟發。Play是一個優秀的Java MVC框架。Play優於ServiceFramework的地方自然很多。 

個人覺得ServiceFramework不同於Play的地方: 

  • Play簡單的引入JPA,當然提供了一些比較有意義的便利方法。而ServiceFramework完全簡化了JPA,操作起來就和ActiveRecord差不多。
  • Play的Query Interface簡單引入EBean,但是EBean完全是個靜態語言的折中產物。
  • ServiceFramework對C層的Filter做過重新設計,非常好用。
為什麼希望專案定位於移動網際網路後端開發? 

從名字看出,這是一個寫後端服務的框架。高效、敏捷符合移動網際網路對快速開發的要求。並且能夠獲得Java社群帶來所有好處。 

ServcieFramework並不適合企業開發,企業開發有點過於複雜,而且我也沒有做過企業方面的開發。今後ServiceFramework 的roadmap 也是繼續強化對移動網際網路的開發支援。目前我在諮詢一些做app後端的朋友,看如何簡化他們的開發。

ServcieFramework的學習成本? 

通常情況下,你只要把ServiceFramework頁面的README看完就行了。 

接著 `git clone  git://github.com/allwefantasy/ServiceFramework.git`,就可以新增controller、model,著手開發專案了。


基於什麼開源協議?在專案中使用ServcieFramework應該注意哪些方面? 

GPL 2.0開源協議。 

ServiceFramework為了一個具體需求而誕生的,所以並不是適合所有的專案。只針對特定領域的需求。比如移動網際網路後端服務的開發就很適合使用ServiceFramework。 

建議留意README中的一些提示。我這裡重點提示幾點,在目前這個版本下: 

  • 不要在舊專案中使用
  • 要遵循約定
  • 目前還不能放到標準的web容器比如tomcat、weblogic等。
估計看到第三點很多人會嘀咕了。其實目前的設計可以極大的簡化你的部署流程。git clone到伺服器上,接著執行./run.sh 指令碼即可。效能方面大可不必擔心,不會低於tomcat、weblogic等容器。另外建議你留意一下run.sh中Xmx等虛擬機器引數。


該專案未來的發展計劃? 

未來會根據使用情況來進行功能修補增強。下一步計劃,我可以預見到的是: 

  • 隔絕ServiceFramework本身的依賴。也就是你看不到框架本身對第三方jar的依賴
  • 為模型類提供更多的自生成方法
  • 開始填補之前的仿PHP函式庫
  • 我會開始尋求合作者,共同開發

目前專案貢獻者情況?其他開發者如何參與? 

開源沒多久。目前就我一個人維護。不過已經應用於公司內部的一個專案,所以大家不用擔心使用性。當然如果真的要用,我建議先用在小專案中。 

如果要參與的話,可以直接到 ServiceFramework Fork一份下來,然後請求 merge 就行。想重度參與的可以聯絡我 [email protected]