以前使用Scala Play! Framework做爲前端框架開發項目,使用netty做爲應用服務器,感受很是輕便、好用,尤爲是scala的語法簡單、直觀,雖然有些操做還要查看文檔才能實現,但仍然不想在迴歸到Java上面,即便Java8有了lambda,仍是感受語法太笨重。html
如今有個新的項目,是輕前端、重服務端的,開始就要考慮服務端接口要提供給移動應用客戶端和web前端,再考察了幾個框架後,決定採用Spray(spray.io)做爲服務器端實現,這樣能夠給不一樣的客戶端提供接口。Web前端打算使用AngularJS,移動端目前要支持Android。前端
Spray官方文檔中有一個Get Started的Demo,很簡單直接的一個例子,有兩個版本,一個是基於Jetty的Servlet版,另一個是基於Spray項目的HTTP Server spray-can的例子,我先從這個例子開始。
git
從連接下載該項目源碼。github
因爲我習慣使用IDEA做爲Scala的IDE, 因此下載一個sbt-idea的sbt插件,用於生成idea項目。能夠從此連接下載,下載完成後按照該項目的安裝提示將plugin添加到sbt中,運行gen-idea生成idea工程web
按照Spray template的guide,安裝運行該項目。固然,前提是安裝sbt,而後運行sbt,它會自動下載相應的全部dependency。json
服務器啓動後,直接訪問8080端口,便可看到默認頁面。瀏覽器
默認例子是使用html做爲response,我添加了一段代碼讓其增長對指定路徑響應JSON,在MyService的myRoute變量中加入一段:前端框架
val myRoute = path("") { get { respondWithMediaType(`text/html`) { // XML is marshalled to `text/xml` by default, so we simply override here complete { <html> <body> <h1>Say hello to <i>spray-routing</i> on <i>spray-can</i>!</h1> </body> </html> } } } }~ path("ping"){ get{ respondWithMediaType(`application/json`){ complete{ jsonPrefix + "{result: 'PONG'}" } } } }
從新編譯重啓,而後輸入http://localhost:8080/ping,瀏覽器上就能夠看到JSON字符串了。在這個簡單的過程發現兩個問題:服務器
Spray的調試不是hotswap的,必需要手動重啓服務器,這點沒有playframework方便。架構
在設置JSON的response類型的時候,出現一個很尷尬的狀況,多是我眼神很差,把那個application/json外面的當成了單引號,而後怎麼都不對,一直報編譯錯誤。後來仔細看了一下他原來的代碼,原來外面的不是單引號,而是~這個不按shift時候的值,就是鍵盤左上角的那個鍵,汗~~
Spray做爲一個簡單的REST服務端框架,已經通過不少高併發項目的驗證,性能和可靠性都沒問題。由於它是基於高併發架構akka的,因此這方面確定是可靠的,後面有心得還會繼續在這記錄。