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 := falselagomUnmanagedServices 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端口上。
