正如在Lagom构建哲学中已经讨论过的,通过Lagom您可以在单个构建中自由地组合所有服务,或者单独构建它们。
下面,我们将描述如何创建包含所有服务的单个构建。hello示例遵循这个结构。
然后,在下一节中,我们将描述为每个服务单独构建的替代方法。
理解您的项目结构
每个服务至少包含两个部分:一个API工程和一个实现工程。(这些是同一个构建中的子工程。)
API工程包含服务接口,也称为描述符,以及接口使用的所有数据模型,例如请求和响应消息。API工程可以被其他服务依赖和使用。
为了实现它,实现工程自然也依赖于API工程。
考虑下面这个例子:
这个系统有两个服务,一个叫hello
,另一个叫hello-stream
。每个服务都定义了两个sbt项目,一个API项目,hello-api
和hello-stream-api
,以及一个实现项目,hello-impl
和hello-stream-impl
。此外,hello-stream-impl
依赖于hello-api
,并使用它来调用hello-stream
。
在sbt中定义构建
添加Lagom sbt插件
Lagom构建必须告诉sbt使用Lagom插件。这是通过创建一个名为project/plugins.sbt
文件来实现的,并像这样添加插件:
addSbtPlugin("com.lightbend.lagom" % "lagom-sbt-plugin" % "X.Y.Z")
// 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版本很重要,就像这样:
scalaVersion in ThisBuild := "2.12.10"
定义服务
接下来,我们需要定义工程。回想一下,每个服务至少有两个子工程,API和实现。首先,我们将定义hello-api
工程。
Lagom API项目是一个普通的sbt项目。我们的第一个项目是这样的:
lazy val `hello-api` = (project in file("hello-api"))
.settings(
version := "1.0-SNAPSHOT",
libraryDependencies += lagomScaladslApi
)
第一行通过声明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简写来添加其他依赖项,以指定依赖库的groupId
、artifactId
和version
;请参阅sbt文档中的库依赖关系。)
现在我们需要定义实现工程:
lazy val `hello-impl` = (project in file("hello-impl"))
.enablePlugins(LagomScala)
.settings(
version := "1.0-SNAPSHOT"
)
.dependsOn(`hello-api`)
API工程不需要引用任何插件,但实现工程需要。启用LagomScala
插件会添加必要的设置和依赖项,并允许我们在开发模式运行项目。
实现工程声明了对hello-api
工程的依赖,因此它需要实现API的接口。
添加第二个服务
我们的样例构建将包括两个服务,一个生产者(hello
)和一个消费者(hello-stream
)
下面是第二个服务的定义:
lazy val `hello-stream-api` = (project in file("hello-stream-api"))
.settings(
version := "1.0-SNAPSHOT",
libraryDependencies += lagomScaladslApi
)
lazy val `hello-stream-impl` = (project in file("hello-stream-impl"))
.enablePlugins(LagomScala)
.settings(
version := "1.0-SNAPSHOT"
)
.dependsOn(`hello-stream-api`, `hello-api`)
这与第一个服务非常相似。主要的区别是增加了对第一个服务的API的依赖,所以第二个服务可以调用它。
在下一节中,我们将看到另一种构建结构,其中每个服务都有自己的构建。