Lagom参考指南(三)

来源:互联网 发布:c语言scanf 编辑:程序博客网 时间:2024/06/09 20:19

开发环境下运行Lagom

1.开发环境

Lagom的sbt或者maven项目是可以基于开发的环境允许使用单个命令来运行任意数量的服务。
当代码更改时,同样的命令也会重新加载服务,这样你就不用手动重启了,您可以继续关注您的工作,并让Lagom进行编译和重新加载。
(1)运行Maven中的所有服务
命令很简单,就是 lagom:runAll
如果您有很多服务,或者第一次检索依赖关系,这可能需要一段时间,
(2)热加载
一旦“Services started”消息出现,如果您对源代码进行更改,您将在控制台看到这样的输出:
[info] Compiling 1 Java source to //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 lagom:run
您应该记住的一点是,run只启动特定的服务,它既不启动服务定位器,也不启动Cassandra服务器。因此,在手动启动服务之前,您可能需要手动启动服务定位器和Cassandra服务器。

3.端口是如何分配给服务的

在检查运行服务列表时,您可能想知道端口是如何分配的。您应该注意到的一点是,端口的分配是一致的,这意味着每个服务将得到分配的相同端口,这是真正有用的,它允许我们来编写测试服务功能的测试脚本,甚至可以与与团队的其他成员共享创建的脚本。即使在不同的机器上,同样的端口也会被确定地选择!注意,这里提醒一下,不是说所有服务使用一个端口,而是lagom使用算法,期间用到了项目名,也就是说,同一个项目。不管啥时候,它端口都是唯一的,算法导致的。
为每个服务分配一个端口的算法如下:

这个项目的名称是散列的。
哈希绝对值被投影到端口范围(默认的端口范围是[49152,65535])
如果没有其他项目声明相同的端口,则指定的端口分配给项目。如果两个或多个项目被投影到同一个端口上,相互冲突的项目是按字母顺序排列的,首先出现的项目将得到分配给它的预期端口。然而,余下的项目将得到最接近的(严格的)可用的临近的端口。
总之,你不需要去担心这个,与大多数情况一样,端口范围宽到足以使冲突不可能发生。然而,有时您可能仍然倾向于将特定的端口分配给服务(例如,如果自动分配的端口已经在您的系统中使用)您可以手动为项目的服务端口设置提供端口号。
在Maven中,您可以通过修改服务实现pom配置来实现这一点:

com.lightbend.lagom
lagom-maven-plugin

11000


上文中的算法的描述,在默认端口中,默认端口是[49152,65535]。这也称为短暂的端口范围,IANA为动态端口选择使用了一系列的端口号。如果默认范围不适合您,您可以通过在构建中添加以下内容来更改它。
pom文件中加入:

com.lightbend.lagom
lagom-maven-plugin
${lagom.version}


40000
45000



在此更改之后,您的服务项目将被分配到一个范围[40000,45000],但是需要注意的是,我们的端口范围的小,带来的是两个服务碰巧是分配同一个端口的可能性就大了。这本身并不是问题(只要所有项目都有足够的端口),但是,在您的构建中添加一个新的服务项目可能会导致对已分配到现有服务项目的端口的更改,如果这两个项目都发生相同的端口。如果您不希望这种情况发生,请确保提供的端口范围足够宽。或者,手动为服务项目分配端口,因为这是有意义的。

4.服务定位器(就类似于zk和eureka)

服务定位器嵌入在Lagom的开发环境中,允许服务发现并相互通信。有一些设置和任务可以为您喜欢的嵌入式服务定位器调整,让我们来探索它们:
(1)默认的端口号
在Lagon中,服务发现的端口号默认的是8000,但是这个端口是非常容易被其他的应用所占用的。或者,您可以通过在构建中添加以下内容来告诉服务定位器在10000端口上运行。
在总项目下的pom文件里配置:

com.lightbend.lagom
lagom-maven-plugin
${lagom.version}

10000


(2)与外部的服务进交互
可以在您的构建中定义的Lagom服务和无限数量的外部服务(可以在本地运行或在另一台机器上运行)之间进行通信。您要做的第一件事是在服务定位器中注册每个外部服务。假设我们想要注册一个名为weather的外部服务,它运行在http://localhost:3333中,下面是我们要添加到构建的内容。
在总项目下的pom文件里配置:

com.lightbend.lagom
lagom-maven-plugin
${lagom.version}


http://localhost:3333



上面的内容确保服务定位器知道天气服务。然后,如果您需要一个Lagom服务来与它进行通信,只需将ServiceLocator进行@inject,并使用它来定位weather服务的URI,或者使用它执行一些任意的工作。
(3)与外部的Lagom项目集成
请注意,如果您想要与之通信的服务实际上是一个Lagom服务,那么您可能想要阅读有关与外部Lagom项目集成的文档(就是Lagom参考指南(二)的第二节)。
(4)启动与停止
当执行runAll任务时,服务定位器会自动启动。然而,有时您可能想手动启动一些服务,因此您不会使用runAll任务。这种情况下,您可以通过maven命令行lagon:startServiceLocator手动启动服务定位器,或者是使用lagom:stopServiceLocator来停掉服务注册中心。
(5)让服务定位失效
您可以通过在构建中添加以下内容来禁用嵌入式服务定位器。
在maven项目根路径下的pom文件:

com.lightbend.lagom
lagom-maven-plugin
${lagom.version}

false


注意,通过禁用服务定位器,您的服务将无法进行通信。恢复通信,您必须在您的服务中提供ServiceLocator的实现。

5.Cassandra Server

默认情况下,需要保存数据的Lagom服务需要使用Cassandra作为数据库。为了方便起见,我们在开发环境中嵌入了一个Cassandra服务器,这样您就不必担心安装它了。针对您的个人需要,有一些设置和任务可用来调整Cassandra服务器,让我们来探索它们:
(1)默认端口号
默认情况下,Cassandra服务器在端口4000上启动。我们知道Cassandra 通常在端口9042上运行,这正是我们选择不同端口的原因:如果你碰巧有一个的话,我们不想干扰本地运行的Cassandra 。如果当前的默认端口不适合您,例如您希望在端口9042上运行嵌入的Cassandra服务器,那么您可以通过在构建中添加以下内容来实现。
在meven的pom中配置:

com.lightbend.lagom
lagom-maven-plugin
lagom.version90422Cassandramavenpomcom.lightbend.lagomlagommavenplugin{lagom.version}

                <cassandraCleanOnStart>false</cassandraCleanOnStart>            </configuration>        </plugin>

(3)秘钥空间(弃用)
在Cassandra中的一个keyspace就代表一个名称空间,它定义节点上的数据复制。每个服务应该使用一个惟一的keyspace名称,这样不同服务的表就不会互相冲突。在开发环境中,默认情况下,keyspace将自动设置为项目的名称(在可能替换了一些不允许的字符之后)。如果生成的密钥空间不适合您,您可以提供自定义的密钥空间。
在Maven中,您可以通过修改服务实现的pom配置来做到这一点:

com.lightbend.lagom
lagom-maven-plugin

true
users


值得指出的是,尽管上面有一个Cassandra密钥空间,在运行您的服务时仍然需要提供。因此,如果您想提供可以在开发和生产中使用的Cassandra keyspace名称,建议通过配置文件这样做。
例如:替代掉使用lagomCassandraKeyspace向我们之前那样使用那样来设置秘钥空间,而我们可以通过在项目的application.conf中添加以下附加的键/值来获得相同的结果(注意,如果没有这个文件,那么你就得手动创建一个,放在/src/main/resources/中),内容如下:
cassandra-journal.keyspace=users
cassandra-snapshot-store.keyspace=users
lagom.persistence.read-side.cassandra.keyspace=users
项目会使用我们在配置文件application.conf中配置的,而不是使用我们在pom中学的。因此,重写构建中的keyspace是不赞成的,并且将在后面的Lagom版本中删除。
有关配置keyspace的更多信息,请参见Cassandra持久实体配置(原文叫 Cassandra persistent entity configuration)。
(4)JVM选项
Cassandra服务器在一个单独的进程上运行,而JVM则是由合理的内存默认启动的。但是,如果默认的JVM选项不适合您,您可以通过在构建中添加以下内容来覆盖它们。
在maven父目录的pom文件里写:

com.lightbend.lagom
lagom-maven-plugin
${lagom.version}


-Xms256m
-Xmx1024m
-Dcassandra.jmx.local.port=4099
-DCassandraLauncher.configResource=dev-embedded-cassandra.yaml



(5)yaml 配置文件
如上所示,可以通过修改Cassandra JVM选项来配置YAML配置文件,其中包括一个-DCassandraLauncher.configResource系统属性的值来指向src/main/resource下的某个文件。
(6)日志
日志记录是这样配置的,它可以达到标准输出,例如org.apache.cassandra设置为ERROR,下面是logback的设置。

6.kafka服务器

默认情况下,Lagom服务需要使用Kafka作为消息代理与其他人之间共享信息的。在微服务体系结构中,使用message broker对避免耦合服务过于强烈是至关重要的。因此,为了方便,我们在开发环境中嵌入了kafka服务器,这样您就不必担心安装它了。有一些设置和任务可以调整kafka服务器,让我们来探索它们:
(1)默认端口:
默认情况下,kafka服务器默认的端口号是9092,kafka使用zk,因此一个zk服务器也在2181端口被启动起来,如果当前的默认端口不适合您,您可以通过在构建中添加以下内容来更改
在maven的pom文件下:

com.lightbend.lagom
lagom-maven-plugin
lagom.version1000099992kafkapropertieskafka使server.propertieskafkakafkamavenpomcom.lightbend.lagomlagommavenplugin{lagom.version}

basedir/kafkaserver.properties3JVMkafkaJVMJVMcom.lightbend.lagomlagommavenplugin{lagom.version}


-Xms256m
-Xmx1024m



(4)日志
将日志配置为只用于文件。您可以在文件夹中找到kafka的日志,文件目录的格式为:
/target/lagom-dynamic-projects/lagom-internal-meta-project-kafka/target/log4j_output
(5)Commit log
kafka本质上是一个持久的提交日志。您可以发现kafka在文件夹中保存的所有数据。
/target/lagom-dynamic-projects/lagom-internal-meta-project-kafka/target/logs
(6)Start and stop
kafka服务器在runAll命令的古时候是会自动启动的。然而,有时你想手动的启动几个服务,不想手动runAlll,这种情况下,不可以通过命令来启动kafka服务器,maven项目就是用lagom:startKafka,关闭的话就用lagom:stopKafka
(7)让kafka失效
您可以通过在构建中添加以下内容来禁用嵌入式Kafka服务器。

com.lightbend.lagom
lagom-maven-plugin
lagom.versionfalseKafkaKafka8kafkaKafkamavenpomcom.lightbend.lagomlagommavenplugin{lagom.version}

localhost:10000
false


您可能已经注意到,上面配置的kafka服务器实际上在本地运行(请注意提供地址中的本地主机)。在这种情况下,它实际上已经足够配置正在运行的端口,而不必提供完整的地址。

原创粉丝点击