Spray 介紹

Spray.io官網的介紹,在本身作的輔助翻譯工具(http://mists.cloudfoundry.com/translate_v0.2/)上翻譯的,比用記事本方便不少。跟之前同樣,不少句子看不懂,有些按照本身的理解翻譯了,有些則驢脣不對馬嘴。
介紹

什麼是Spray

spray是一套基於Akka的,提供客戶端和服務端REST/HTTP和底層網絡IO的輕量級Scala庫。 git

我 們相信,選擇Scala(可能還有Akka)做爲構建軟件的首選工具,你會想要不只在你的應用程序層依靠它們的力量,更包括整個(jvm級別)網絡堆棧。 spray正是提供這些:一個知足REST/HTTP和網絡IO需求的集成組件集,讓你在堆棧級別用符合Scala(以及Akka)語言習慣的API,所 有的實現沒有任何遺留Java庫的封裝。 github

原則

spray的發展是遵循如下原則: web

徹底異步的,非阻塞全部的api是徹底異步的,在全部可能的地方避免阻塞式代碼。基於Actor和Futurespray徹底擁抱它的構建平臺的編程模型,Akka Actor和Future它的API的關鍵構造。高性能尤爲spray的低級組件是爲在高負載環境下提供卓越性能而精心設計的。輕量級全部依賴都很是當心地管理,spray代碼庫自己儘量保持瘦。模塊化被劃分爲一組集成但鬆耦合的組件,應用程序只須要依賴實際使用的部分。可測試全部spray組件是結構化的,容許容易和方便的測試。

模塊

目前spray套件由這些模塊組成: 數據庫

spray-caching 基於concurrentlinkedhashmap和Akka Future構建的快速、輕量級內存中緩存。
spray-can
基於spray-io的低級別,低開銷,高性能的HTTP服務端和客戶端。
spray-client
提供更高級別接口的HTTP服務端,基於spray-can的HttpClient。
spray-http
HTTP請求,響應和公共信息頭的不可變模型。這個模塊是徹底獨立的,它既不依賴於Akka也不依賴於spray的任何部分。
spray-httpx
用於處理HTTP消息的高級工具(主要爲封裝,解封裝,(解)壓縮),它被用於spray-client和spray-routing。
spray-io一個低級別網絡IO層,用於直接鏈接Akka actor到異步Java NIO socket。它採用了一個預約義的可重用的管線式架構(如鏈接超時和SSL / TLS支持)。咱們更喜歡把它當作Scala版的Netty。
spray-servlet
一個適配器層,在Servlet API之上提供spray-can HttpServer接口(的一個子集)。容許在servlet容器中使用spray-routing。
spray-routing
高級路由DSL,用於定義優雅的RESTful web服務。
spray-testkit
一個用於簡化測試spray-routing服務的DSL。支持ScalaTest和Specs2。
spray-util
用於除spray-http以外全部模塊的小工具模塊。
spray-json一個輕量,簡潔的JSON實現(Scala)。因爲它不依賴於spray的其餘部分和Akka,而且它是spray-client和spray-httpx的可選依賴,所以它不在spray的主倉庫,而在它本身的github倉庫。 編程

理念

自2011年初spray發展推進清晰專一於提供工具,來構建集成層而不是應用程序核心。所以它將本身視爲一套件,而不是一個框架。 json

我 們認爲,一個框架(framework)給你一個架子(frame),你在裏面構建你的應用程序。它已經預製了不少的決策並提供了一個基礎支撐結構,讓你 快速開始和交付結果。在某種程度上一個框架就像一個骨架,你把應用程序的肉放進去從而讓它活躍起來。所以在你開始開發應用程序以前選擇框架,而且儘可能使框 架的工做方式與你一同前進,它們才能工做得最好。 後端

例 如,若是你要構建一個面向瀏覽器的web應用,選擇一個web框架並在它之上構建你的應用程序是有意義的,由於應用的核心是瀏覽器與服務端代碼的交互。框 架製造商選擇了一個行之有效的方法來設計這樣的應用程序,並讓用或多或少具有靈活性的應用模板來作填空。可以依靠這樣的最佳實踐體系結構,能夠成爲一個很 好的資源,來迅速把事情搞定。 api

然 而,若是你的應用程序不是一個web應用程序,它的核心不是瀏覽器交互而是有些特殊,也許是複雜的商業服務,並且你僅僅想嘗試經過REST/HTTP接口 鏈接到世界各地,web框架可能不是你須要的。在這種狀況下,應用程序架構應由核心決定,而不是界面層。當你,你可能沒法受益於現有的瀏覽器特定框架組 件,像視圖模板,資源管理,Javascript和CSS生成/操做/精簡,定位支持,AJAX支持,等等。 瀏覽器

spray明確設計成不是框架,並不是由於咱們不喜歡框架,而是對於使用案例框架不是正確的選擇。spray有助於構建基於HTTP的交互層。所以你一般不須要在spray之上構建你的應用,而是在別的什麼上構建你的程序,僅僅在須要HTTP交互的地方使用spray。 緩存

spray對於Web開發

盡 管spray發展到目前爲止尚未關注web應用,但基於HTTP的交互層,你固然也能夠用它來構建基於瀏覽器的強大的GUI。最近的趨勢是web應用邏 輯愈來愈遠離服務端,並進入(基於JS的)瀏覽器客戶端,並且愈來愈多實用的sbt插件(提供spray自身沒有的功能)(像視圖模板,LESS和 CoffeeScript支持)甚至可能使這種方法得到的吸引力。

目前一個基於spray的web開發堆棧可能包括這些組件(子集):

spray-can HttpServerweb服務端。接收HTTP請求併發送響應。可選的SSL。
spray-routing
路由層。根據URI,參數,內容等處理請求。推進高層次的工做請求到深層應用級別,並轉換各自的結果到HTTP響應。提供靜態內容。
sbt-revolver SBT插件,對任何類型源碼(scala,twirl,CSS,LESS,JavaScript,CoffeeScript,圖片等)的更改進行熱加載,而不須要重啓服務器。能夠提供一個差很少動態語言類型的開發體驗。
twirl SBT插件,基於play 2.0模板引擎的視圖模板。
less-sbt
SBT插件,將LESS源碼編譯爲CSS。
coffeescripted-sbt SBT插件,編譯CoffeeScript源碼爲JavaScript。
sbt-js SBT插件,用於Javascript和CoffeeScript的編譯,縮小和模板。
SLICK 優雅的數據庫查詢和訪問庫。
spray-json
簡潔,符合語言習慣的JSON讀寫庫。
sbt-assembly SBT插件,部署單個jar文件。 A client-side frontend framework現有的客戶端JavaScript框架中的一個。

雖 然這樣一堆可能沒法提供全部徹底成熟的web框架來知足你特定應用的須要。可是因爲你能夠爲每一個獨特的工做選擇最好的工具,結果應用程序堆棧更靈活,並且 別任何單一的框架更不容易過期。固然,這種方式的缺點是,整合不一樣組件的工做如今落到了你的肩上。而且沒有單點提供支持和升級。

不過,結合客戶端JavaScript框架與基於spray的後端應用能夠證實它自己就是傳統的,服務端web框架的有趣替代。咱們但願在這裏聽到你的經驗。

This Site

一個運行於spray堆棧的簡單網站的例子是當前站點(http://spray.io)。這是咱們爲spray.io所使用的堆棧:

更多細節請檢出這個站點的路由定義:https://github.com/spray/spray/blob/master/site/src/main/scala/spray/site/SiteServiceActor.scala。

相關文章
相關標籤/搜索