本手册正在开发中,目前尚未完善。
如果您想帮助改进它,我们希望您能这样做,请参阅 README

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 将通知所有服务,并允许它们执行任何清理或终止操作。