Spray 介绍

原创
2013/04/04 02:53
阅读数 7.3K

Spray.io官网的介绍,在自己做的辅助翻译工具(http://mists.cloudfoundry.com/translate_v0.2/)上翻译的,比用记事本方便很多。跟以前一样,很多句子看不懂,有些按照自己的理解翻译了,有些则驴唇不对马嘴。
介绍

什么是Spray

spray是一套基于Akka的,提供客户端和服务端REST/HTTP和底层网络IO的轻量级Scala库。

我 们相信,选择Scala(可能还有Akka)作为构建软件的首选工具,你会想要不仅在你的应用程序层依靠它们的力量,更包括整个(jvm级别)网络堆栈。 spray正是提供这些:一个满足REST/HTTP和网络IO需求的集成组件集,让你在堆栈级别用符合Scala(以及Akka)语言习惯的API,所 有的实现没有任何遗留Java库的封装。

原则

spray的发展是遵循以下原则:

完全异步的,非阻塞所有的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发展推动清晰专注于提供工具,来构建集成层而不是应用程序核心。因此它将自己视为一套件,而不是一个框架。

我 们认为,一个框架(framework)给你一个架子(frame),你在里面构建你的应用程序。它已经预制了很多的决策并提供了一个基础支撑结构,让你 快速开始和交付结果。在某种程度上一个框架就像一个骨架,你把应用程序的肉放进去从而让它活跃起来。因此在你开始开发应用程序之前选择框架,并且尽量使框 架的工作方式与你一同前进,它们才能工作得最好。

例 如,如果你要构建一个面向浏览器的web应用,选择一个web框架并在它之上构建你的应用程序是有意义的,因为应用的核心是浏览器与服务端代码的交互。框 架制造商选择了一个行之有效的方法来设计这样的应用程序,并让用或多或少具备灵活性的应用模板来做填空。能够依靠这样的最佳实践体系结构,可以成为一个很 好的资源,来迅速把事情搞定。

然 而,如果你的应用程序不是一个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。

展开阅读全文
打赏
1
11 收藏
分享
加载中
Ellipse博主

引用来自“Ellipse”的评论

引用来自“廖师虎”的评论

Socko和Scalatrat很象,Socko 用的Netty, Scalatra用的Servlet,都很适合RESTful,这两个都说了,前端配合Angular.js或Ember.js之类的JS MVC最好。

Socko更接近Akka,Scalatra更接近Servlet。Socko没有Session和Cookie(可以用Netty或自己加个小封装),Scalatra都有。Socko更轻量,打完包才11M,Scalatra将近50M。Socko独立部署,Scalatra需要web容器部署。

引用来自“墨軒主人”的评论

Socko能打包?我的REST服务打完包就找不到resource了
好久不整Scala了,已经不会整了
2014/05/13 21:33
回复
举报

引用来自“Ellipse”的评论

引用来自“廖师虎”的评论

Socko和Scalatrat很象,Socko 用的Netty, Scalatra用的Servlet,都很适合RESTful,这两个都说了,前端配合Angular.js或Ember.js之类的JS MVC最好。

Socko更接近Akka,Scalatra更接近Servlet。Socko没有Session和Cookie(可以用Netty或自己加个小封装),Scalatra都有。Socko更轻量,打完包才11M,Scalatra将近50M。Socko独立部署,Scalatra需要web容器部署。
Socko能打包?我的REST服务打完包就找不到resource了
2014/05/13 11:01
回复
举报

引用来自“Ellipse”的评论

引用来自“廖师虎”的评论

我想前端用Ember.js,后端是纯的RESTful。如果spray不方便,就选择play2,play2.2之后用spray代替netty。

请教一下,Play2怎么去掉模版引擎,直接访问html?

2种方式,一种采用route 方式,把html文档变成xxx.scala.html,另外一种把静态文档html放在 public中
2013/12/25 11:35
回复
举报
Ellipse博主

引用来自“廖师虎”的评论

http://www.techempower.com/benchmarks/#section=data-r3
这是前段时间各个web framework的基准测试最新版,Scalatra还是很强的。

说实在的,这个测试结果还真没看懂
2013/04/23 19:53
回复
举报
http://www.techempower.com/benchmarks/#section=data-r3
这是前段时间各个web framework的基准测试最新版,Scalatra还是很强的。
2013/04/23 19:27
回复
举报
Ellipse博主

引用来自“廖师虎”的评论

Socko和Scalatrat很象,Socko 用的Netty, Scalatra用的Servlet,都很适合RESTful,这两个都说了,前端配合Angular.js或Ember.js之类的JS MVC最好。

Socko更接近Akka,Scalatra更接近Servlet。Socko没有Session和Cookie(可以用Netty或自己加个小封装),Scalatra都有。Socko更轻量,打完包才11M,Scalatra将近50M。Socko独立部署,Scalatra需要web容器部署。
2013/04/23 12:48
回复
举报
Socko和Scalatrat很象,Socko 用的Netty, Scalatra用的Servlet,都很适合RESTful,这两个都说了,前端配合Angular.js或Ember.js之类的JS MVC最好。
2013/04/23 12:04
回复
举报
Ellipse博主

引用来自“廖师虎”的评论

今天看akka.io的时候,发现Socko http://sockoweb.org/,akka-http https://github.com/thenewmotion/akka-http可能更适合做RESTful。

详细看了一遍Socko的指南,相当不错,可以说是我试用过的Scala web框架中最满意的一个了。akka-http示例太少,也没看到有文档,暂不考虑了。
2013/04/23 01:05
回复
举报
Ellipse博主

引用来自“廖师虎”的评论

今天看akka.io的时候,发现Socko http://sockoweb.org/,akka-http https://github.com/thenewmotion/akka-http可能更适合做RESTful。

不错,我先试用一下
2013/04/22 15:43
回复
举报
今天看akka.io的时候,发现Socko http://sockoweb.org/,akka-http https://github.com/thenewmotion/akka-http可能更适合做RESTful。
2013/04/22 14:02
回复
举报
更多评论
打赏
18 评论
11 收藏
1
分享
在线直播报名
返回顶部
顶部