以前使用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的,因此这方面确定是可靠的,后面有心得还会继续在这记录。