使用Gretty 的超轻量级 Java Web 服务

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

使用使用使用使用GrettyGrettyGrettyGretty的超轻量级的超轻量级的超轻量级的超轻量级JavaJavaJavaJavaWebWebWebWeb服务服务服务服务Gretty是构建Web服务超轻量级框架的新学派之一。构建于极快的Java™之上,Gretty将Groovy用作Web端点和Grape的Maven式依赖关系管理的一种域特定语言。本文介绍如何开始使用Gretty来构建和部署JavaWeb服务应用程序。我们已经构建了一个简单的从云到移动终端的应用程序。该应用程序名为Magnus,充当监听移动设备位置信息的HTTP端点。它通过接收HTTPPUT请求来运行,每个请求包含一个JSON文档,指出给定时间内帐户的位置。到目前为止,我已经使用了Web框架Play来开发和扩展Magnus。Play提供一个MVC堆栈,就这点它与Grails很相似。使用Play,您可以很容易地定义利用视图(JSP、GSP、模板等)的控制器(servlets),在某种程度上,控制器管理模型。模型是使用经Hibernate、JPA或其他类似ORM的好技术增强的POJO(传统Java对象)实现的。尽管MVC是较老的标准,随着Grail和Play等框架的出现,很多都已经发生了改变。回想一下曾经维护简单的Web请求-响应交互所需的工作量(比方说使用Struts),您会明白我们为快速构建MVCWeb应用程序而做了多大的改进。当然,并非所有的Web应用程序都需要MVC基础架构才能工作。如今,一些Web应用程序根本就不再需要MVC“堆栈”。为了反对这样一种反常的论调,在您关闭浏览器之前,回顾一下Magnus。虽然为了演示,对Magnus进行了严格的设计,我的云到移动终端的应用程序不包含传统的视图组件,主要包含了现有的成功服务的模型。与Twitter或Foursquare一样,Magnus接收来自世界各地不同设备的消息。广义上说,Magnus是一个Web服务,而并不是每个Web服务都需要MVC堆栈框架才能完成工作。在某些情况下,您所需要的是一个超级轻量的Web框架,而不是Web堆栈。本月,我们将着眼于以下内容之一:快速开发框架,太新以至于还没有自己的主页,或许并不需要主页。Gretty的沿袭和隶属成员(分别包括Netty和Groovy)具有足够的名望,它已经是Java2.0Web开发系列的一部分。它填补了一个许多开发人员仍然不知道他们已经具有的需求(这就是真正的Web2.0风格,您知道吗?)。如果您愿意走狂野的一面,它也可足够稳定地用作生产之用。快速Java开发的历史老的足以记得何时第一次引入ServletsAPI的我们有理由对新的“轻量级”范式持怀疑态度;毕竟仅仅一个简单的servlet便让您构建一个Web服务,而不需要大量的代码和由此产生的JAR文件。Web服务框架,比如Restlet或Jersey,采取了稍微不同的开发加速方法,以类扩展、注释,甚至标准的JSR为基础来创建RESTfulWeb服务。在某些情况下,它们仍然是很好的选择。但事实证明,一些新的轻量级(相对于旧的轻量级)框架使得Web服务或简单的HTTP端点(也称为路由)极其易于定义。甚至比手动塞入一个servlet还要简单!这些框架首次出现在其他平台上,尤其是用于Ruby的Sinatra和用于Node.js的Express。但是针对Java平台的有趣项目也已经开始出现了。Gretty就是其中之一,当然Gretty是为Groovy和JVM产生的。我和Gretty就我而言,Gretty至少有两点符合:首先是使用Groovy的Grape(我不久将会详细地对其进行描述)以方便依赖性管理。其次是其简单的用于定义端点的DSL式的语法。使用Gretty,您可以非常快地(只用短短的几行代码)定义和部署一个工作的Web运行框架,该框架处理实际的业务逻辑。作为示例,请看我快速地写出清单1中的典型helloworld示例:在清单1中,我创建了一个服务器监听端口8080,然后设置一个包含参数name的简单root端点。到其他端点的任何请求都将通过defaultHandler返回到/。简单地说,使用/的位置,处理程序为请求的客户端发送一个HTTP301“movedpermanently”代码。所有请求会收到一个包含字符串“Hello”和任何已传递参数值的响应(将content-type设置为text/plain);例如,/Andy将会生成“HelloAndy”。那么清单1中最有趣的是什么?首先,您在清单中所看到的都是您的应用程序所需要的。没有配置文件。不需要直接下载或安装任何东西(除了Groovy1.8)。要激活该示例,只要输入groovyserver.groovy。现在如果您的响应要求更复杂的文本而不是简单文本,该怎么办?对于该问题,Gretty有很多选择,其中有两个是十分简单的。第一个是您可以简单地将响应类型设置为HTML,正如我在清单2中所执行的:在这种情况下,响应的content-type会被设置为text/html。另外,Gretty可以利用静态和动态的模板。例如,我可以使用一个类似于JSP/GSP的简单构造函数来定义模板,类似于清单3:Getty和Grape的依赖性管理Gretty令人难忘的开发速度都归功于Grape,Gretty使用Grape来自动下载二进制文件的依赖关系或JAR文件。使用Maven的传递依赖来加载所有文件。在清单1中我所需要做的就是输入注释@Grab('org.mbte.groovypp:gretty:0.4.279'),然后我会获得与Gretty相关联的JAR文件,以及Gretty的依赖项。注释@GrabResolver(name='gretty',root=')表示Grape在何处可以发现所需的文件。Grape可能看起来简单,但是并不意味着它不适合生产。事实上,Grape对所需依赖项的自动下载与Maven没有任何不同。只是Grape在运行时(首次运行应用程序时)下载,而Maven在构建时下载所需的依赖项。如果Grape可以在本地找到所需的依赖项,则不需要再进行下载。所需的JAR文件被自动放置在应用程序的类路径中。因此,您只需要为首次运行某个已配置的Grape应用程序支付性能成本。当然,也会在您更改指定依赖项的所需版本时受到一个小的性能影响。Gretty适合Magnus希望到目前为止您已经发现Gretty是简单的,这就更易于进行非常快速的开发。此外,Gretty(或与此类似的框架)特别适合于Magnus(HTTP端点数据监听)这样的应用程序。那么让我们看看当完全使用一个Gretty编写的更轻量的应用程序来替换一个相对轻量的框架(比如Play或Grails)时将会发生什么。对于Magnus的具体实现,我将使用Morphia和MongoHQ,您可以回顾我的AmazonElasticBeanstalk简介。为了利用具有新配置的Groovy的Grape实用工具,我需要将清单5中的注释添加到服务器中:我的Morphia类与Magnus的早期具体实现中的一样:我有一个Account和一个Location。在此端点中,我只简单地更新了某个给定帐户的位置。因为Morphia的客户端会将JSON文档发送至Gretty端点,我还要使用Jackson(一个非常好的处理JSON的框架),它已经是Gretty的一部分。得益于Grape传递依赖的处理,现在我可以访问用于解析传入的JSON文档并将其转换为一个简单的JavaMap所需要的一切。您可能记得出自“ClimbtheElasticBeanstalk”中清单3的代码。为了Gretty的实现,我所做的惟一更改是将实际的文件名从Location.java改为Location.groovy,这意味着在激活服务器之前我不需要对其进行编译。我还添加了一个基类。通过从URI获得的传入参数account将位置与某个帐户相关联。然后用JSON发送一个表示成功的响应。如果有错误,会产生另一个响应。结束语:Gretty已就绪Gretty是极其轻量级的。没有嵌入的ORM框架。除了简单的模板之外,没有强大的视图框架,但是插入一些其他的框架是完全可行的。所有这些是否意味着Gretty不适合日常使用?缺少测试框架是否也有同样的意思?答案是否定的:首先,Gretty构建于Netty深受认可的代码之上,所以您大可放心。其次,您可以对Gretty进行自动或非自动的测试,就像您对任何其他Web端点所进行的测试一样。事实上,如果您想要了解Gretty是如何进行测试,请查看Gretty的源代码。Gretty源代码中有大量的测试!Gretty与现代的全堆栈Web框架相对立,正是因为有时您不需要整个堆栈。如果您发现使用像Gretty这样的框架做了太多的工作,那么您可能最好使用许多全堆栈、存档完好的JavaWeb框架中的一个。同样地,如果您想要知道为什么需要整个堆栈来处理Web服务请求和响应,那么Gretty可能正是您所需要的。

1 / 6
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功