4 启动
本章介绍如何启动 Ratpack 应用程序,详细说明了 Ratpack API 的入口点。
1.4 RatpackServer
该 RatpackServer
类型是 Ratpack 的入口点。您编写自己的主类,使用此 API 启动应用程序。
package my.app;
import ratpack.core.server.RatpackServer;
import ratpack.core.server.ServerConfig;
import java.net.URI;
public class Main {
public static void main(String... args) throws Exception {
RatpackServer.start(server -> server
.serverConfig(ServerConfig.embedded().publicAddress(new URI("http://company.org")))
.registryOf(registry -> registry.add("World!"))
.handlers(chain -> chain
.get(ctx -> ctx.render("Hello " + ctx.get(String.class)))
.get(":name", ctx -> ctx.render("Hello " + ctx.getPathTokens().get("name") + "!"))
)
);
}
}
应用程序被定义为传递给该接口的 of()
或 start()
静态方法的函数。该函数接受一个 RatpackServerSpec
,可用于指定 Ratpack 应用程序的三个基本方面(即服务器配置、基本注册表、根处理器)。
本手册和 API 参考中的大多数示例都使用
EmbeddedApp
而不是RatpackServer
来创建应用程序。这是由于示例的“测试”性质。请参阅 本节,了解有关代码示例的更多信息。
1.1.4 服务器配置
该 ServerConfig
定义了启动服务器所需的配置设置。ServerConfig
的静态方法可用于创建实例。
1.1.1.4 基本目录
服务器配置的一个重要方面是 基本目录。基本目录实际上是应用程序文件系统的根目录,提供了一个可移植的文件系统。在运行时解析为文件的所有相对路径都将相对于基本目录解析。静态资源(例如图像、脚本)通常通过基本目录使用相对路径提供服务。
该 baseDir(Path) 方法允许将基本目录设置为某个已知位置。为了在环境之间实现可移植性,如果需要,调用此代码的代码负责确定给定运行时的基本目录应该是什么。
更常见的是使用 BaseDir.find() 支持在类路径上查找基本目录,提供更好的跨环境可移植性。此方法在类路径上的 "/.ratpack"
路径搜索资源。
要使用与
/.ratpack
默认值不同的路径,请使用 BaseDir.find(String) 方法。
标记文件的内容完全被忽略。它仅用于查找封闭目录,该目录将用作基本目录。该文件可能位于类路径上的 JAR 中,或者位于类路径上的目录中。
以下示例演示了使用 BaseDir.find()
从类路径发现基本目录。
import ratpack.core.server.ServerConfig;
import ratpack.test.embed.EphemeralBaseDir;
import ratpack.test.embed.EmbeddedApp;
import java.net.URL;
import java.net.URLClassLoader;
import java.nio.file.Path;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class Example {
public static void main(String... args) throws Exception {
EphemeralBaseDir.tmpDir().use(baseDir -> {
baseDir.write("mydir/.ratpack", "");
baseDir.write("mydir/assets/message.txt", "Hello Ratpack!");
Path mydir = baseDir.getRoot().resolve("mydir");
ClassLoader classLoader = new URLClassLoader(new URL[]{mydir.toUri().toURL()});
Thread.currentThread().setContextClassLoader(classLoader);
EmbeddedApp.of(serverSpec -> serverSpec
.serverConfig(c -> c.baseDir(mydir))
.handlers(chain ->
chain.files(f -> f.dir("assets"))
)
).test(httpClient -> {
String message = httpClient.getText("message.txt");
assertEquals("Hello Ratpack!", message);
});
});
}
}
上面示例中对 EphemeralBaseDir
的使用以及新上下文类加载器的构建纯粹是为了使示例自成一体。真正的 main 方法会简单地调用 BaseDir.find()
,依赖于启动 Ratpack 应用程序 JVM 的任何东西来启动具有适当类路径的 JVM。
Ratpack 通过 Java 7 Path API 访问基本目录,允许透明地使用 JAR 内容作为文件系统。
2.1.1.4 端口
该 port(int) 方法允许设置用于连接到服务器的端口。如果未配置,默认值为 5050。
3.1.1.4 SSL
默认情况下,Ratpack 服务器将在配置端口上监听 HTTP 流量。要启用 HTTPS 流量,该 ssl(SslContext) 方法允许使用 SSL 证书和密钥。
从 v2.0 开始,Ratpack 还支持使用服务器名称指示 (SNI) 根据请求的主机选择 SSL 配置。该 ssl(SslContext, Action) 用于指定默认 SSL 配置和任何使用备用 SSL 配置的其他域映射。映射中指定的域支持 DNS 通配符,并且在域层次结构中最多匹配一个级别(例如,*.ratpack.io
将匹配 api.ratpack.io
但不匹配 docs.api.ratpack.io
)。
通过系统属性或环境变量配置 SSL 设置需要特殊处理才能指定域名。下表显示了如何指定默认 SSl 配置和子域的配置。
| 系统属性 | 环境变量 | 描述 | |————————————————|————————————————–|———————————————————————————| | ratpack.server.ssl.keystoreFile
| RATPACK_SERVER__SSL__KEYSTORE_FILE
| 指定包含服务器证书和私钥的 JKS 的路径 | | ratpack.server.ssl.keystorePassword
| RATPACK_SERVER__SSL__KEYSTORE_PASSWORD
| 指定密钥库 JKS 的密码 | | ratpack.server.ssl.truststoreFile
| RATPACK_SERVER__SSL__TRUSTSTORE_FILE
| 指定包含受信任证书的 JKS 的路径 | | ratpack.server.ssl.truststorePassword
| RATPACK_SERVER__SSL__TRUSTSTORE_PASSWORD
| 指定信任库 JKS 的密码 | | ratpack.server.ssl.ratpack_io.keystoreFile
| RATPACK_SERVER__SSL__RATPACK_IO__KEYSTORE_FILE
| 指定域 ratpack.io
的密钥库的路径 | | ratpack.server.ssl.*_ratpack_io.kyestoreFile
| RATPACK_SERVER__SSL___RATPACK_IO_KEYSTORE_FILE
| 指定域 *.ratpack.io
的密钥库的路径 |
请注意以下特殊规则:1. 在系统属性和环境变量中,域名分隔符 (.
) 都被转换为下划线 (_
) 2. 在环境变量中,域名通配符 (*
) 使用下划线 (_
) 指定。这会导致域名之前出现 3 个下划线 (___RATPACK_IO
)。
2.1.4 注册表
一个 注册表
是按类型存储对象的存储库。应用程序中可能存在许多不同的注册表,但所有应用程序都由一个“服务器注册表”支持。服务器注册表只是给支持应用程序的注册表起的名称,并在启动时定义。
3.1.4 处理器
服务器 处理器 接收所有传入的 HTTP 请求。处理器是可组合的,很少有应用程序实际上只包含一个处理器。大多数应用程序的服务器处理器是一个复合处理器,通常通过使用 handlers(Action)
方法创建,该方法使用 Chain
DSL 创建复合处理器。
4.1.4 启动和停止操作
该 Service
接口允许连接到应用程序生命周期。在接受任何请求之前,Ratpack 将通知所有服务,并允许它们执行任何初始化。相反,当应用程序停止时,Ratpack 将通知所有服务,并允许它们执行任何清理或终止操作。