开发环境下运行Lagom
1.开发环境
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>
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。