Cassandra 服务
默认情况下,Lagom服务需要使用Cassandra作为数据库来持久化数据。为了方便起见,我们已经在开发环境中嵌入了一个Cassandra服务器,这样您就不必担心安装它了。有很多设置和任务可以调整Cassandra服务,让我们来探索一下。
默认端口
默认情况下,Cassandra服务在4000
端口上启动。我们知道Cassandra通常运行在9042
端口上,这正是我们选择不同端口的原因:如果您碰巧有一个端口,我们不想干扰您在本地运行Cassandra。如果当前的默认端口不适合您,而且您希望在端口9042
上运行嵌入式Cassandra服务器,那么可以通过在构建中添加以下内容来实现。
在Maven根项目pom中:
<plugin>
<groupId>com.lightbend.lagom</groupId>
<artifactId>lagom-maven-plugin</artifactId>
<version>${lagom.version}</version>
<configuration>
<cassandraPort>9042</cassandraPort>
</configuration>
</plugin>
在sbt中:
lagomCassandraPort in ThisBuild := 9042
启动清理
默认情况,正在运行的服务所创建的所有数据库文件都将被保存,以备下次启动Cassandra服务时使用。您可以通过在构建中添加以下内容来更改行为。
在Maven根项目pom中:
<plugin>
<groupId>com.lightbend.lagom</groupId>
<artifactId>lagom-maven-plugin</artifactId>
<version>${lagom.version}</version>
<configuration>
<cassandraCleanOnStart>true</cassandraCleanOnStart>
</configuration>
</plugin>
在sbt中:
lagomCassandraCleanOnStart in ThisBuild := true
Cassandra YAML 配置文件
Cassandra服务可以通过一个可替换的YAML文件来配置。默认情况下,Lagom开发环境使用dev-embedded-cassandra.yaml。这是用于快速入门的默认设置,但如果您发现自己需要使用不同的配置启动Cassandra,则可以将自己的Cassandra YAML文件添加到构建中来轻松实现。
在Maven根项目pom中:
<plugin>
<groupId>com.lightbend.lagom</groupId>
<artifactId>lagom-maven-plugin</artifactId>
<version>${lagom.version}</version>
<configuration>
<cassandraYamlFile>${basedir}/cassandra.yaml</cassandraYamlFile>
</configuration>
</plugin>
在sbt中:
lagomCassandraYamlFile in ThisBuild :=
Some((baseDirectory in ThisBuild).value / "project" / "cassandra.yaml")
请注意,由Lagom使用的Cassandra YAML文件有一些变量,由一些Lagom管理的属性组成:
$PORT
:由sbt中的lagomCassandraPort
或mvn
中的cassandraPort
定义$STORAGE_PORT
:随机定义$DIR
:所有Cassandra服务器相关文件的位置,默认为:target/embedded-cassandra
推荐的做法是不要在YAML文件上使用这些占位符,尤其是$PORT变量。如果YAML文件对其进行了硬编码,则必须确保Lagom使用相同的端口(参见默认端口)。
JVM 选项
Cassandra服务运行在一个单独的进程上,并且JVM以合理的内存默认值启动。但是,如果默认的JVM选项不适合您,您可以通过在构建中添加以下内容来覆盖它们。
在Maven根项目pom中:
<plugin>
<groupId>com.lightbend.lagom</groupId>
<artifactId>lagom-maven-plugin</artifactId>
<version>${lagom.version}</version>
<configuration>
<cassandraJvmOptions>
<opt>-Xms256m</opt>
<opt>-Xmx1024m</opt>
<opt>-Dcassandra.jmx.local.port=4099</opt>
</cassandraJvmOptions>
</configuration>
</plugin>
在sbt中:
lagomCassandraJvmOptions in ThisBuild :=
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中:
<plugin>
<groupId>com.lightbend.lagom</groupId>
<artifactId>lagom-maven-plugin</artifactId>
<version>${lagom.version}</version>
<configuration>
<cassandraMaxBootWaitingSeconds>0</cassandraMaxBootWaitingSeconds>
</configuration>
</plugin>
在sbt中:
import scala.concurrent.duration._ // Mind that the import is needed.
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中:
<plugin>
<groupId>com.lightbend.lagom</groupId>
<artifactId>lagom-maven-plugin</artifactId>
<version>${lagom.version}</version>
<configuration>
<cassandraEnabled>false</cassandraEnabled>
</configuration>
</plugin>
在sbt中:
lagomCassandraEnabled in ThisBuild := false
禁用嵌入式Cassandra服务更多是因为,您需要服务连接到一个外部的、本地运行的Cassandra实例。
连接到本地运行的Cassandra实例
如果希望连接到外部运行的Cassandra实例,而不是嵌入的实例。您需要做的就是在构建中添加以下内容。
在Maven根项目pom中:
<plugin>
<groupId>com.lightbend.lagom</groupId>
<artifactId>lagom-maven-plugin</artifactId>
<version>${lagom.version}</version>
<configuration>
<unmanagedServices>
<cas_native>http://localhost:9042</cas_native>
</unmanagedServices>
<cassandraEnabled>false</cassandraEnabled>
</configuration>
</plugin>
在sbt中:
lagomCassandraEnabled in ThisBuild := false
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端口上。