1.Defining a Lagom build(定义一个Lagom构建)java
正如在Lagom构建哲学中已经讨论过的那样,使用Lagom,您能够自由地将全部服务组合在一个单独的构建中,或者单独构建它们。 下面,咱们将描述如何构建包含全部服务的单一构建。hello示例遵循这个结构。 而后,在下一节中,咱们将描述一个服务构建的替代方法。 (1)理解你的项目结构 每一个服务至少包含两个部分:一个API项目和一个实现项目。(这些是同一构建中的子项目。) API项目包含服务接口,也称为描述符,以及接口使用的全部数据模型,例如请求和响应消息。API项目能够依赖于其余服务的使用和使用。 实现项目天然也依赖于API项目,以实现它。 考虑下面的示例系统: ![图片描述][1] 这个系统有两个服务,一个服务叫hello,另外一个服务叫hello-stream。每一个服务有两个定义的sbt项目,一个api项目:hello-api和hello-stream-api,和一个实现项目:hello-impl和hellp-stream-impl.此外,hello-stream-impl依赖于hello-api,调用hello-stream来使用它。 下面咱们将怎么建立一个Lagom服务: ①配置项目根(Configuring the root project) 在Lagom,使用多模块构建是典型的。能够在根项目中配置Lagom maven插件,咱们须要把它加到pom文件里的plugins标签里: <plugin> <groupId>com.lightbend.lagom</groupId> <artifactId>lagom-maven-plugin</artifactId> <version>${lagom.version}</version> </plugin> 这样作将容许您使用像lagom:runAll这样的命令来运行系统中的每个服务,并定义系统范围的配置。Maven插件从父poms继承它们的配置,所以在父pom中定义的任何东西都将用于全部服务。 由于lagom是须要jdk1.8以上的,因此您须要将Java编译的源和目标版本设置为1.8。此外,Lagom自带jackson参数拆箱。容许jackson将json反序列化为没有附加注释元数据不可变的类。利用这个特性,Java编译器必须启用参数名称。源、目标和参数名配置最好在根项目中配置,由于配置将由全部子模块继承: <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.5.1</version> <configuration> <source>1.8</source> <target>1.8</target> <compilerArgs> <arg>-parameters</arg> </compilerArgs> </configuration> </plugin> 咱们还建议在您的根项目pom中使用Maven依赖管理来控制整个系统中的依赖版本,例以下面: <dependencyManagement> <dependencies> <dependency> <groupId>com.lightbend.lagom</groupId> <artifactId>lagom-javadsl-server_2.11</artifactId> <version>1.3.4</version> </dependency> <dependency> <groupId>com.typesafe.play</groupId> <artifactId>play-netty-server_2.11</artifactId> <version>2.6.0-M5</version> </dependency> <dependency> <groupId>com.lightbend.lagom</groupId> <artifactId>lagom-javadsl-api_2.11</artifactId> <version>1.3.4</version> </dependency> </dependencies> </dependencyManagement> 关于Scala版本的注释: 在向Lagom库中添加依赖关系时,您须要确保在工件ID中包含Scala主版本,for example:lagom-javadsl-api_2.11.Lagom自己是大多在Scala实现,与Java不一样,Java维护者控制虚拟机,当添加新特性时,能够在虚拟机上构建向后兼容性,当在Scala中添加新特性时,向后兼容性是很是困难的若是不是不可能维持,所以,必须根据Scala的某个主要版原本编译库。 jar包的库常常会想支持多个版本的Scala,这样作须要构建一个为每一个版本的Scala支持工件,它介绍了如何区分这些工件的问题,看到像maven不支持添加额外的元数据依赖关系的想法来指定他们须要什么版本的Scala。为了解决这个问题,咱们使用了将Scala版本附加到工件的约定。 定义一个服务: 服务的API模块是一个简单的maven项目。它不须要配置Lagom插件,一般它只须要依赖于Lagom API库。例如: <project> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.example</groupId> <artifactId>my-first-system</artifactId> <version>1.0-SNAPSHOT</version> </parent> <artifactId>hello-api</artifactId> <packaging>jar</packaging> <dependencies> <dependency> <groupId>com.lightbend.lagom</groupId> <artifactId>lagom-javadsl-api_2.11</artifactId> </dependency> </dependencies> </project> 服务的实现模块也是一个简单的maven项目,可是会有更多的依赖关系,而且须要配置 lagom-maven-plugin;来让它成为一个服务项目,因此这个插件知道在使用runAll时包含进它: <project> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.example</groupId> <artifactId>my-first-system</artifactId> <version>1.0-SNAPSHOT</version> </parent> <artifactId>hello-impl</artifactId> <packaging>jar</packaging> <dependencies> <dependency> <groupId>${project.groupId}</groupId> <artifactId>hello-api</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>com.lightbend.lagom</groupId> <artifactId>lagom-javadsl-server_2.11</artifactId> </dependency> <dependency> <groupId>com.lightbend.lagom</groupId> <artifactId>lagom-javadsl-persistence_2.11</artifactId> </dependency> <dependency> <groupId>com.lightbend.lagom</groupId> <artifactId>lagom-logback_2.11</artifactId> </dependency> <dependency> <groupId>com.typesafe.play</groupId> <artifactId>play-netty-server_2.11</artifactId> </dependency> <dependency> <groupId>com.lightbend.lagom</groupId> <artifactId>lagom-javadsl-testkit_2.11</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>com.lightbend.lagom</groupId> <artifactId>lagom-maven-plugin</artifactId> <configuration> <lagomService>true</lagomService> </configuration> </plugin> </plugins> </build> </project> 这里有几点须要注意: >实现依赖于它的API项目,所以它能够实现这个API。 >它也须要依赖于lagom-javadsl-server,这为项目提供了全部服务器端代码。 >这个特别的服务使用Lagom的持久化API来对数据进行持久化,因此它还须要你依赖于lagom-javadsl-persistence. >日志,默认的是使用lagom-logback作维护日志的实现 >play框架的 HTTP服务器的实现须要配置- Play提供两个服务器实现,一个在Netty,一个在Akka HTTP。在这种状况下,Netty已经被选中。 >lagon-maven-plugin已经配置好了取让lagonService是true,这告诉Lagom,这是一个在运行lagon:run时应该运行的Lagom服务
2.将一个系统分解为多个构建apache
在设计一个Lagom系统时,您能够灵活地组织您的服务,以构建知足您需求的构建单元。对于一个由单个团队维护的小系统来讲,在一个构建中拥有全部服务是很好的,这样作使得使用runAll来运行全部的服务变得很是容易,咱们稍后将在本手册的运行服务部分中看到: 若是您有多个团队,那么正如在Lagom构建概念中所描述的那样,咱们建议将您的系统划分为多个构建。 若是您不关心扩展到多个团队,如今能够跳过这一部分。 (1)发布服务 即便有多个版本,您仍然常常但愿在开发中一块儿运行您的服务。Lagom容许你从一个否到另一个构建的导入已经发布的服务。 假设您有一个hello服务,您想要发布和导入另外一个构建。若是使用Maven,能够经过运行mvn安装,将其发布到本地存储库,这是发布服务的最简单方法。然而,这意味着每一个想要运行构建版本的开发人员都须要将其发布到本身的存储库中,他们须要为他们想要导入的每一个版本作到这一点。 绝大多数状况下,一些开发人员会分享一个单一供发布于或者拉去项目用的的maven仓库,若是您乐于使用托管存储库,那么有一些方法能够作到这一点,若是您想运行存储库位置, Artifactory 或Nexus是常见的解决方案 (2)导入服务 使用maven: Lagom-maven-plugin提供了一个配置项,叫作externalProjects,这个额配置项是能够在根项目上配置,将外部项目导入Maven构建,例如: <plugin> <groupId>com.lightbend.lagom</groupId> <artifactId>lagom-maven-plugin</artifactId> <version>${lagom.version}</version> <configuration> <externalProjects> <externalProject> <artifact> <groupId>com.example</groupId> <artifactId>hello-impl</artifactId> <version>1.2.3</version> </artifact> </externalProject> </externalProjects> </configuration> </plugin> 那么如今,当你运行lagom:runAll的时候,hello-impl服务也会被启动起来,这里还有一些externalProjects选项的其余配置项 >playService 代表这是一个play,而不是一个Lagom服务,默认值是false >servicePort 该服务所运行的端口号,默认的是经过Llagom来自动的选择。 >cassandraEnabled 配置该服务是否须要Cassandra,默认是true
3.将项目导入到IDE中,这个不翻译了,太基础了
4.使用maven和eclipse,建立一个Lagom的服务json
maven 3.3以上 java 1.8 step1:File->new->Project step2:other选项,找maven,建立maven project step3:maven就用默认的选项就好了,也就是quick-start step4:groupId啥的,很少说了 step5:run Project ①右键单击父项目文件夹 Eclipse将全部Maven项目文件夹放在相同的级别,因此必定要选一个正确的。例如:若是你要使用my-first-system做为maven的 artifact ID,右键my-first-system ②run as..-> Maven Build ③Goal里写 lagom:runAll ④选择jre ⑤run 控制台应该报告服务启动。经过从任何HTTP客户端调用hello服务端点(例如浏览器)来验证服务是否确实启动并运行。 http://localhost:9000/api/hello/World 请求返回消息:Hello, World!
5.在IDE中设置Immutableapi
Immutables是一个咱们建议来建立不可变对象的库,并将样板代码减小到最小值。咱们相信您会找到这个库,可是由于immutables从注释中生成源,因此须要启用Java编译器注释处理器。 Eclipse: 要在Eclipse中设置Immutables注释处理器,您须要为每一个使用Immutables工具来生成不可变对象的项目配置如下内容。 若是下面的选项你木有,就安装。地址是http://download.eclipse.org/releases/juno,位置是在Programming Language里的Eclipse java Development Toolss通常状况下,eclipse默认都木有。 Open project Properties > Java Compiler > Annotation Processing、 本章建议本身看官网吧,这边等个人STS能够的时候再补上。
6.增长sbt和Maven的内存浏览器
在dev模式中的Lagom启动全部的服务,并在一个JVM中启动一些内部的Lagom服务。这样基于你的JVM的设置可能会产生OutOfMemoryError。能够经过增长内存来启动Maven和sbt。 咱们建议您增长 Metaspace,最大大小和线程堆栈大小。,你可使用-Xss2M -XX:MaxMetaspaceSize=1024M这个配置来体改你的你内存大小。确切的值可能取决于您的硬件和代码库。 Maven下: 你能够从 Maven 开始使用 MAVEN_OPTS 环境变量的额外内存。命令以下: $ MAVEN_OPTS="-Xms512M -Xmx1024M -Xss2M -XX:MaxMetaspaceSize=1024M" mvn lagom:runAll 在本例中,咱们将设置初始的JVM堆512Mb,最大堆的1024M,一个线程堆栈为2M,最大的Metaspace大小为2014M。 若是在不一样的项目中须要不一样的设置,那么在每次调用中声明MAVEN_OPTS都是错误的,而且在全局上导出它是不可能的。您可能但愿使用direnv来设置每一个项目的环境变量。