Cassandra 服务

默认情况下,Lagom服务需要使用Cassandra作为数据库来持久化数据。为了方便起见,我们已经在开发环境中嵌入了一个Cassandra服务器,这样您就不必担心安装它了。有很多设置和任务可以调整Cassandra服务,让我们来探索一下。

默认端口

默认情况下,Cassandra服务在4000端口上启动。我们知道Cassandra通常运行在9042端口上,这正是我们选择不同端口的原因:如果您碰巧有一个端口,我们不想干扰您在本地运行Cassandra。如果当前的默认端口不适合您,而且您希望在端口9042上运行嵌入式Cassandra服务器,那么可以通过在构建中添加以下内容来实现。
在Maven根项目pom中:

  1. <plugin>
  2. <groupId>com.lightbend.lagom</groupId>
  3. <artifactId>lagom-maven-plugin</artifactId>
  4. <version>${lagom.version}</version>
  5. <configuration>
  6. <cassandraPort>9042</cassandraPort>
  7. </configuration>
  8. </plugin>

在sbt中:

  1. lagomCassandraPort in ThisBuild := 9042

启动清理

默认情况,正在运行的服务所创建的所有数据库文件都将被保存,以备下次启动Cassandra服务时使用。您可以通过在构建中添加以下内容来更改行为。
在Maven根项目pom中:

  1. <plugin>
  2. <groupId>com.lightbend.lagom</groupId>
  3. <artifactId>lagom-maven-plugin</artifactId>
  4. <version>${lagom.version}</version>
  5. <configuration>
  6. <cassandraCleanOnStart>true</cassandraCleanOnStart>
  7. </configuration>
  8. </plugin>

在sbt中:

  1. lagomCassandraCleanOnStart in ThisBuild := true

Cassandra YAML 配置文件

Cassandra服务可以通过一个可替换的YAML文件来配置。默认情况下,Lagom开发环境使用dev-embedded-cassandra.yaml。这是用于快速入门的默认设置,但如果您发现自己需要使用不同的配置启动Cassandra,则可以将自己的Cassandra YAML文件添加到构建中来轻松实现。
在Maven根项目pom中:

  1. <plugin>
  2. <groupId>com.lightbend.lagom</groupId>
  3. <artifactId>lagom-maven-plugin</artifactId>
  4. <version>${lagom.version}</version>
  5. <configuration>
  6. <cassandraYamlFile>${basedir}/cassandra.yaml</cassandraYamlFile>
  7. </configuration>
  8. </plugin>

在sbt中:

  1. lagomCassandraYamlFile in ThisBuild :=
  2. Some((baseDirectory in ThisBuild).value / "project" / "cassandra.yaml")

请注意,由Lagom使用的Cassandra YAML文件有一些变量,由一些Lagom管理的属性组成:

  • $PORT:由sbt中的lagomCassandraPortmvn中的cassandraPort定义
  • $STORAGE_PORT:随机定义
  • $DIR:所有Cassandra服务器相关文件的位置,默认为:target/embedded-cassandra

推荐的做法是不要在YAML文件上使用这些占位符,尤其是$PORT变量。如果YAML文件对其进行了硬编码,则必须确保Lagom使用相同的端口(参见默认端口)。

JVM 选项

Cassandra服务运行在一个单独的进程上,并且JVM以合理的内存默认值启动。但是,如果默认的JVM选项不适合您,您可以通过在构建中添加以下内容来覆盖它们。
在Maven根项目pom中:

  1. <plugin>
  2. <groupId>com.lightbend.lagom</groupId>
  3. <artifactId>lagom-maven-plugin</artifactId>
  4. <version>${lagom.version}</version>
  5. <configuration>
  6. <cassandraJvmOptions>
  7. <opt>-Xms256m</opt>
  8. <opt>-Xmx1024m</opt>
  9. <opt>-Dcassandra.jmx.local.port=4099</opt>
  10. </cassandraJvmOptions>
  11. </configuration>
  12. </plugin>

在sbt中:

  1. lagomCassandraJvmOptions in ThisBuild :=
  2. Seq("-Xms256m", "-Xmx1024m", "-Dcassandra.jmx.local.port=4099") // these are actually the default jvm options

日志

日志记录被配置为标准输出,org.apache.cassandra的日志级别被设置为ERROR
没有适当的机制来编辑内置的logback.xml。如果需要调优日志配置,应该安装Cassandra,并阅读说明以连接到本地运行的Cassandra。

Cassandra 启动时间

如前所述runAll任务还负责在启动任何其他服务之前启动嵌入式Cassandra服务器。此外,服务通常只有在Cassandra服务器可达之后才启动。默认情况下,Cassandra服务器有最多20秒的时间启动和运行,但是您可以通过在构建中添加以下内容来更改此默认设置。
在Maven根项目pom中:

  1. <plugin>
  2. <groupId>com.lightbend.lagom</groupId>
  3. <artifactId>lagom-maven-plugin</artifactId>
  4. <version>${lagom.version}</version>
  5. <configuration>
  6. <cassandraMaxBootWaitingSeconds>0</cassandraMaxBootWaitingSeconds>
  7. </configuration>
  8. </plugin>

在sbt中:

  1. import scala.concurrent.duration._ // Mind that the import is needed.
  2. lagomCassandraMaxBootWaitingTime in ThisBuild := 0.seconds

将Cassandra服务的最大引导等待时间更改为0有助于模拟真实的部署场景,因为运行中的Cassandra实例可能在服务启动时不可用。

启动和停止

Cassandra服务在执行runAll任务时自动启动。但是,有时您可能只想手动启动少数服务,因此您不会使用runAll任务。在这种情况下,可以通过lagom:startCassandra maven任务或lagomCassandraStart sbt任务手动启动Cassandra服务,或者,通过lagom:stopCassandra maven任务或lagomCassandraStop sbt任务停止。

禁用

您可以通过在构建中添加以下内容来禁用嵌入式Cassandra服务。
在Maven根项目pom中:

  1. <plugin>
  2. <groupId>com.lightbend.lagom</groupId>
  3. <artifactId>lagom-maven-plugin</artifactId>
  4. <version>${lagom.version}</version>
  5. <configuration>
  6. <cassandraEnabled>false</cassandraEnabled>
  7. </configuration>
  8. </plugin>

在sbt中:

  1. lagomCassandraEnabled in ThisBuild := false

禁用嵌入式Cassandra服务更多是因为,您需要服务连接到一个外部的、本地运行的Cassandra实例。

连接到本地运行的Cassandra实例

如果希望连接到外部运行的Cassandra实例,而不是嵌入的实例。您需要做的就是在构建中添加以下内容。
在Maven根项目pom中:

  1. <plugin>
  2. <groupId>com.lightbend.lagom</groupId>
  3. <artifactId>lagom-maven-plugin</artifactId>
  4. <version>${lagom.version}</version>
  5. <configuration>
  6. <unmanagedServices>
  7. <cas_native>http://localhost:9042</cas_native>
  8. </unmanagedServices>
  9. <cassandraEnabled>false</cassandraEnabled>
  10. </configuration>
  11. </plugin>

在sbt中:

  1. lagomCassandraEnabled in ThisBuild := false
  2. lagomUnmanagedServices in ThisBuild := Map("cas_native" -> "tcp://localhost:9042")

这两个设置只当Lagom运行在DevMode时使用。这两个设置的目的是禁用嵌入式Cassandra服务,并在DevMode中配置Service Locator,以便在寻找cas_native时仍然能够定位Cassandra。如果您已经在本地或在您的公司基础设施中有一台Cassandra服务器并希望使用它,那么您可能希望禁用lagom管理的Cassandra服务。在这种情况下,Lagom启动Cassandra服务是没有意义的,只会增加启动时间。
示例中Service Locator的设置假定您本地的Cassandra实例运行在9042端口上。