ratpack框架
Ratpack和Spring Boot是微服务天堂中的佼佼者。 每个都是针对JVM的以开发人员为中心的Web框架,专注于生产力,效率和轻量级部署。 它们在微服务开发领域具有各自的优势,因为它们带来了不同的产品。 Ratpack带来了一个React式编程模型,该模型具有高吞吐量,无阻塞的Web层以及方便的处理程序链,用于定义应用程序结构和HTTP请求处理; Spring Boot为整个Spring生态系统带来了集成,并且提供了一种简单的方法来将组件配置和自动装配到应用程序中。 对于构建云原生和数据驱动的微服务,它们是无与伦比的称赞。
Ratpack对应用程序的基础依赖注入框架没有意见。 相反,它允许应用程序通过其DI抽象(称为Registry)访问服务层组件。 Ratpack的注册表是其基础架构不可或缺的一部分,它为DI提供程序提供了一个接口,以通过注册表支持来参与组件解析序列。
Ratpack开箱即用,带有Guice和Spring Boot的注册表支持,为开发人员提供了实现的灵活性。
在本文中,我们将演示如何构建一个RESTful数据驱动的Ratpack和Spring Boot微服务,该服务将在后台利用Spring Data。
开始使用Ratpack项目的最佳方法是创建Gradle构建脚本和标准Java项目结构。 Gradle是Ratpack支持的构建系统,但是由于Ratpack只是JVM库的集合,因此它实际上可以由任何构建系统构建(尽管您的行程可能会有所不同)。 如果尚未安装Gradle,最简单的方法是通过Groovy enVironment Manager 。 清单1中描述了我们项目的构建脚本。
清单1
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'io.ratpack:ratpack-gradle:0.9.18'
}
}
apply plugin: 'io.ratpack.ratpack-java'
apply plugin: 'idea'
apply plugin: 'eclipse'
repositories {
jcenter()
}
dependencies {
compile ratpack.dependency('spring-boot') (1)
}
mainClassName = "springpack.Main" (2)
eclipse {
classpath {
containers.remove('org.eclipse.jdt.launching.JRE_CONTAINER')
containers 'org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8'
}
}
该构建脚本通过使用(1)处的Ratpack Gradle插件的ratpack.dependency(..)功能来导入Ratpack Spring Boot集成。 有了构建脚本和项目结构后,我们可以创建一个“主类”,它将成为可启动类以启动和运行我们的应用程序。 请注意,在(2)中,我们指定了主类名称,以便命令行工具可以更好地工作。 这意味着我们的主类必须与此相对应,因此我们将在项目的src / main / java树中创建一个springpack.Main类。
在主类中,我们通过工厂方法start创建一个RatpackServer实例,并向其提供应用程序的定义 。 在此定义中将存在我们的RESTful HTTP API处理程序链。 作为初始演示,请考虑清单2中所示的主类。请注意,Ratpack需要Java 8。
清单2
package springpack;
import ratpack.server.RatpackServer;
public class Main {
public static void main(String[] args) throws Exception {
RatpackServer.start(spec -> spec
.handlers(chain -> chain (1)
.prefix("api", pchain -> pchain (2)
.all(ctx -> ctx (3)
.byMethod(method -> method (4)
.get(() -> ctx.render("Received GET request"))
.post(() -> ctx.render("Received POST request"))
.put(() -> ctx.render("Received PUT request"))
.delete(() -> ctx.render("Received DELETE request"))
)
)
)
)
);
}
}
如果我们在主类中分解应用程序定义,我们可以确定一些关键区域,对于那些不熟悉Ratpack的人来说值得解释。 第一点值得注意的是,Ratpack中的HTTP请求流经处理链,该链由(1)定义的处理程序部分定义。 处理程序在链中定义,用于描述它们能够满足的请求类型。 具体来说,在(2)处,我们定义了一个前缀处理程序类型,并指定它应绑定到“ api” HTTP路由。 前缀处理程序进而创建了一个新链,该链将委派给与“ / api”端点匹配的传入请求。 在(3)中,我们使用all处理程序类型来指定所有传入请求都应通过提供的处理程序运行,在(4)中,我们使用Ratpack的byMethod机制将get,post,put和delete处理程序绑定到各自的HTTP方法。
现在,我们只需在项目的根目录下发出gradle“ run”命令,即可从命令行运行该应用程序。 这将启动并在端口5050上绑定Web服务器。为了演示项目的现有功能并确保处理程序结构按预期工作,我们可以从命令行对curl进行一些测试:
- 命令:curl http:// localhost:5050 ,预期结果:收到GET请求
- 命令:curl -XPOST http:// localhost:5050 ,预期结果:收到POST请求
- 命令:curl -XPUT http:// localhost:5050 ,预期结果:收到PUT请求
- 命令:curl -XDELETE http:// localhost:5050 ,预期结果:收到DELETE请求
如您所见,应用程序处理程序链正确地路由了请求,并且我们已经有了RESTful API的结构。 现在我们需要让它做某事...
为了演示,让我们保持简单,并使此微服务负责与User域对象相关的CRUD操作。 通过REST端点,客户端应该能够:
- 通过以用户名作为路径变量的GET请求请求特定的用户帐户;
- 未指定用户名时,通过GET请求列出所有用户;
- 通过发布JSON编码的用户对象来创建用户;
- 通过发出以用户名作为路径变量的PUT请求来更新用户的电子邮件地址;
- 通过发出以用户名作为路径变量的DELETE请求来删除用户。
用于处理这些需求的大多数基础结构已经基于我们在上一节中定义的处理程序而到位,但是这些需求意味着我们将需要稍作更改。 例如,我们现在需要绑定接受用户名路径变量的处理程序。 清单3中更新的代码显示了主类,现在具有满足要求的处理程序。
清单3