正如在Lagom构建哲学中已经讨论过的,通过Lagom您可以在单个构建中自由地组合所有服务,或者单独构建它们。
下面,我们将描述如何创建包含所有服务的单个构建。hello示例遵循这个结构。
然后,在下一节中,我们将描述为每个服务单独构建的替代方法。

理解您的项目结构

每个服务至少包含两个部分:一个API工程和一个实现工程。(这些是同一个构建中的子工程。)
API工程包含服务接口,也称为描述符,以及接口使用的所有数据模型,例如请求和响应消息。API工程可以被其他服务依赖和使用。
为了实现它,实现工程自然也依赖于API工程。
考虑下面这个例子:
定义Lagom构建 - 图1
这个系统有两个服务,一个叫hello,另一个叫hello-stream。每个服务都定义了两个sbt项目,一个API项目,hello-apihello-stream-api,以及一个实现项目,hello-implhello-stream-impl。此外,hello-stream-impl依赖于hello-api,并使用它来调用hello-stream

在sbt中定义构建

添加Lagom sbt插件

Lagom构建必须告诉sbt使用Lagom插件。这是通过创建一个名为project/plugins.sbt文件来实现的,并像这样添加插件:

  1. addSbtPlugin("com.lightbend.lagom" % "lagom-sbt-plugin" % "X.Y.Z")
  2. // replace 'X.Y.Z' with your preferred version (e.g. '1.2.0-RC2').

该插件为构建、运行和部署Lagom应用程序提供了所有必要的支持。
有关sbt插件的更多信息,请参阅使用插件的sbt文档

定义构建

sbt构建在根目录中的一个或多个*.sbt文件中定义。通常有一个名为build.sbt的文件;如果它变得不方便使用,您可以将其拆分为多个文件。
sbt构建文件是使用基于scala的DSL定义的。简单的构建只使用DSL的一小部分,所以不需要花任何时间学习Scala。如果您使用sbt Giter8开始构建,那么您将从一开始就拥有一个可工作的构建。您可能只需要进行很少的编辑,或者复制和粘贴已有的代码。

设置scala版本

设置你所使用的Scala版本很重要,就像这样:

  1. scalaVersion in ThisBuild := "2.12.10"

定义服务

接下来,我们需要定义工程。回想一下,每个服务至少有两个子工程,API和实现。首先,我们将定义hello-api工程。
Lagom API项目是一个普通的sbt项目。我们的第一个项目是这样的:

  1. lazy val `hello-api` = (project in file("hello-api"))
  2. .settings(
  3. version := "1.0-SNAPSHOT",
  4. libraryDependencies += lagomScaladslApi
  5. )

第一行通过声明project类型的lazy val来定义项目本身。(sbt提示:使用lazy val而不是val来声明项目,可以防止一些初始化顺序的问题)
项目被定义为hello-api目录,如project in file("hello-api")所示。这意味着项目的所有源代码都将位于该目录下,按照通常的Maven结构(sbt也采用这种结构)进行布局。所以我们主要的Scala源代码是hello-api/src/main/scala
接下来是更多的设置,其中我们设置了项目版本并添加了一个库依赖项。Lagom插件提供了一些预定义的值,使Lagom库易于添加。在这种情况下,我们使用lagomScaladslApi。(您可以使用常用的sbt简写来添加其他依赖项,以指定依赖库的groupIdartifactIdversion;请参阅sbt文档中的库依赖关系。)
现在我们需要定义实现工程:

  1. lazy val `hello-impl` = (project in file("hello-impl"))
  2. .enablePlugins(LagomScala)
  3. .settings(
  4. version := "1.0-SNAPSHOT"
  5. )
  6. .dependsOn(`hello-api`)

API工程不需要引用任何插件,但实现工程需要。启用LagomScala插件会添加必要的设置和依赖项,并允许我们在开发模式运行项目。
实现工程声明了对hello-api工程的依赖,因此它需要实现API的接口。

添加第二个服务

我们的样例构建将包括两个服务,一个生产者(hello)和一个消费者(hello-stream)
下面是第二个服务的定义:

  1. lazy val `hello-stream-api` = (project in file("hello-stream-api"))
  2. .settings(
  3. version := "1.0-SNAPSHOT",
  4. libraryDependencies += lagomScaladslApi
  5. )
  6. lazy val `hello-stream-impl` = (project in file("hello-stream-impl"))
  7. .enablePlugins(LagomScala)
  8. .settings(
  9. version := "1.0-SNAPSHOT"
  10. )
  11. .dependsOn(`hello-stream-api`, `hello-api`)

这与第一个服务非常相似。主要的区别是增加了对第一个服务的API的依赖,所以第二个服务可以调用它。
在下一节中,我们将看到另一种构建结构,其中每个服务都有自己的构建。