开发环境下运行Lagom
1.开发环境web
Lagom的sbt或者maven项目是能够基于开发的环境容许使用单个命令来运行任意数量的服务。 当代码更改时,一样的命令也会从新加载服务,这样你就不用手动重启了,您能够继续关注您的工做,并让Lagom进行编译和从新加载。 (1)运行Maven中的全部服务 命令很简单,就是 lagom:runAll 若是您有不少服务,或者第一次检索依赖关系,这可能须要一段时间, (2)热加载 一旦“Services started”消息出现,若是您对源代码进行更改,您将在控制台看到这样的输出: [info] Compiling 1 Java source to /<project-path>/target/scala-2.11/classes... --- (RELOAD) --- (3)咱们所看到的背后 当咱们运行了runAll命令以后,在背后到底都发生了什么呢?? >启动了一个嵌入式服务定位器(特别相似于zk或者eureka) >启动了一个Cassandra服务器 >开始了kafka服务器(这个比较热了,mq系列) >你的服务开始 >并向服务定位器注册 这一切都是在没有特殊代码或附加配置的状况下自动发生的。 您能够经过在web浏览器中查看http://localhost:8000 / services来验证您的服务正在运行(或者使用像curl这样的命令行工具),服务定位器,在端口8000上运行,江湖返回相似于以下这样的信息: [{"name":"hello-stream","url":"http://0.0.0.0:26230"}, {"name":"cas_native","url":"tcp://127.0.0.1:4000/cas_native"}, {"name":"hello","url":"http://0.0.0.0:24266"}] cas_native是Cassandra服务器,正如您将在编写持久和集群服务的文档中学习的,Cassandra是Lagom的默认数据库,它是开发环境的一个组成部分。 服务为定位器,Cassandra和kafka在接下来的章节中详细讨论。
2.运行服务算法
就像在上节讲的那样,在构建中定义的全部Lagom服务均可以用单个任务来运行:runAll。执行此任务时,将启动嵌入式服务定位器,一个内嵌的 Cassandra服务器也会随之启动,而后你的全部的服务都会并行的被启动起来。并且,全部启动的服务都将以热重载模式运行。热从新加载意味着服务会自动地从新加载您所作的每个更改,这样您就没必要手动从新启动它们。大多数时候,runAll任务将为您提供良好的服务。然而,有时您可能想手动启动一些服务,这是当run 任务将派上用场的时候。run任务对每一个Lagom服务实现项目均可用。 在Maven中,您可使用Maven项目列表标记来执行特定服务的run任务: $ mvn -pl <your-project-name> lagom:run 您应该记住的一点是,run只启动特定的服务,它既不启动服务定位器,也不启动Cassandra服务器。所以,在手动启动服务以前,您可能须要手动启动服务定位器和Cassandra服务器。
3.端口是如何分配给服务的数据库
在检查运行服务列表时,您可能想知道端口是如何分配的。您应该注意到的一点是,端口的分配是一致的,这意味着每一个服务将获得分配的相同端口,这是真正有用的,它容许咱们来编写测试服务功能的测试脚本,甚至能够与与团队的其余成员共享建立的脚本。即便在不一样的机器上,一样的端口也会被肯定地选择!注意,这里提醒一下,不是说全部服务使用一个端口,而是lagom使用算法,期间用到了项目名,也就是说,同一个项目。无论啥时候,它端口都是惟一的,算法致使的。 为每一个服务分配一个端口的算法以下: >这个项目的名称是散列的。 >哈希绝对值被投影到端口范围(默认的端口范围是[49152,65535]) >若是没有其余项目声明相同的端口,则指定的端口分配给项目。若是两个或多个项目被投影到同一个端口上,相互冲突的项目是按字母顺序排列的,首先出现的项目将获得分配给它的预期端口。然而,余下的项目将获得最接近的(严格的)可用的临近的端口。 总之,你不须要去担忧这个,与大多数状况同样,端口范围宽到足以使冲突不可能发生。然而,有时您可能仍然倾向于将特定的端口分配给服务(例如,若是自动分配的端口已经在您的系统中使用)您能够手动为项目的服务端口设置提供端口号。 在Maven中,您能够经过修改服务实现pom配置来实现这一点: <plugin> <groupId>com.lightbend.lagom</groupId> <artifactId>lagom-maven-plugin</artifactId> <configuration> <servicePort>11000</servicePort> </configuration> </plugin> 上文中的算法的描述,在默认端口中,默认端口是[49152,65535]。这也称为短暂的端口范围,IANA为动态端口选择使用了一系列的端口号。若是默认范围不适合您,您能够经过在构建中添加如下内容来更改它。 pom文件中加入: <plugin> <groupId>com.lightbend.lagom</groupId> <artifactId>lagom-maven-plugin</artifactId> <version>${lagom.version}</version> <configuration> <servicePortRange> <min>40000</min> <max>45000</max> </servicePortRange> </configuration> </plugin> 在此更改以后,您的服务项目将被分配到一个范围[40000,45000],可是须要注意的是,咱们的端口范围的小,带来的是两个服务碰巧是分配同一个端口的可能性就大了。这自己并非问题(只要全部项目都有足够的端口),可是,在您的构建中添加一个新的服务项目可能会致使对已分配到现有服务项目的端口的更改,若是这两个项目都发生相同的端口。若是您不但愿这种状况发生,请确保提供的端口范围足够宽。或者,手动为服务项目分配端口,由于这是有意义的。
4.服务定位器(就相似于zk和eureka)浏览器
服务定位器嵌入在Lagom的开发环境中,容许服务发现并相互通讯。有一些设置和任务能够为您喜欢的嵌入式服务定位器调整,让咱们来探索它们: (1)默认的端口号 在Lagon中,服务发现的端口号默认的是8000,可是这个端口是很是容易被其余的应用所占用的。或者,您能够经过在构建中添加如下内容来告诉服务定位器在10000端口上运行。 在总项目下的pom文件里配置: <plugin> <groupId>com.lightbend.lagom</groupId> <artifactId>lagom-maven-plugin</artifactId> <version>${lagom.version}</version> <configuration> <serviceLocatorPort>10000</serviceLocatorPort> </configuration> </plugin> (2)与外部的服务进交互 能够在您的构建中定义的Lagom服务和无限数量的外部服务(能够在本地运行或在另外一台机器上运行)之间进行通讯。您要作的第一件事是在服务定位器中注册每一个外部服务。假设咱们想要注册一个名为weather的外部服务,它运行在http://localhost:3333中,下面是咱们要添加到构建的内容。 在总项目下的pom文件里配置: <plugin> <groupId>com.lightbend.lagom</groupId> <artifactId>lagom-maven-plugin</artifactId> <version>${lagom.version}</version> <configuration> <unmanagedServices> <weather>http://localhost:3333</weather> </unmanagedServices> </configuration> </plugin>