Lagom参考指南(三)

ByteZenithMaster
• 阅读 1337

开发环境下运行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>
上面的内容确保服务定位器知道天气服务。然后,如果您需要一个Lagom服务来与它进行通信,只需将ServiceLocator进行@inject,并使用它来定位weather服务的URI,或者使用它执行一些任意的工作。
(3)与外部的Lagom项目集成
请注意,如果您想要与之通信的服务实际上是一个Lagom服务,那么您可能想要阅读有关与外部Lagom项目集成的文档(就是Lagom参考指南(二)的第二节)。
(4)启动与停止
当执行runAll任务时,服务定位器会自动启动。然而,有时您可能想手动启动一些服务,因此您不会使用runAll任务。这种情况下,您可以通过maven命令行lagon:startServiceLocator手动启动服务定位器,或者是使用lagom:stopServiceLocator来停掉服务注册中心。
(5)让服务定位失效
您可以通过在构建中添加以下内容来禁用嵌入式服务定位器。
在maven项目根路径下的pom文件:
    <plugin>
        <groupId>com.lightbend.lagom</groupId>
        <artifactId>lagom-maven-plugin</artifactId>
        <version>${lagom.version}</version>
        <configuration>
            <serviceLocatorEnabled>false</serviceLocatorEnabled>
        </configuration>
    </plugin>
注意,通过禁用服务定位器,您的服务将无法进行通信。恢复通信,您必须在您的服务中提供ServiceLocator的实现。

5.Cassandra Server

默认情况下,需要保存数据的Lagom服务需要使用Cassandra作为数据库。为了方便起见,我们在开发环境中嵌入了一个Cassandra服务器,这样您就不必担心安装它了。针对您的个人需要,有一些设置和任务可用来调整Cassandra服务器,让我们来探索它们:
(1)默认端口号
默认情况下,Cassandra服务器在端口4000上启动。我们知道Cassandra 通常在端口9042上运行,这正是我们选择不同端口的原因:如果你碰巧有一个的话,我们不想干扰本地运行的Cassandra 。如果当前的默认端口不适合您,例如您希望在端口9042上运行嵌入的Cassandra服务器,那么您可以通过在构建中添加以下内容来实现。
在meven的pom中配置:
    <plugin>
        <groupId>com.lightbend.lagom</groupId>
        <artifactId>lagom-maven-plugin</artifactId>
        <version>${lagom.version}</version>
        <configuration>
            <cassandraPort>9042</cassandraPort>
        </configuration>
    </plugin>
 (2)启动时候进行清理:
     默认情况下,运行服务创建的所有数据库文件将在下一次启动Cassandra服务器时删除。您可以通过在构建中添加以下内容来关闭这个特性
    还是在maven的pom文件里:
        <plugin>
            <groupId>com.lightbend.lagom</groupId>
            <artifactId>lagom-maven-plugin</artifactId>
            <version>${lagom.version}</version>
            <configuration>
            
                <cassandraCleanOnStart>false</cassandraCleanOnStart>
            </configuration>
        </plugin>
    (3)秘钥空间(弃用)
    在Cassandra中的一个keyspace就代表一个名称空间,它定义节点上的数据复制。每个服务应该使用一个惟一的keyspace名称,这样不同服务的表就不会互相冲突。在开发环境中,默认情况下,keyspace将自动设置为项目的名称(在可能替换了一些不允许的字符之后)。如果生成的密钥空间不适合您,您可以提供自定义的密钥空间。
    在Maven中,您可以通过修改服务实现的pom配置来做到这一点:
        <plugin>
            <groupId>com.lightbend.lagom</groupId>
            <artifactId>lagom-maven-plugin</artifactId>
            <configuration>
                <lagomService>true</lagomService>
                <cassandraKeyspace>users</cassandraKeyspace>
            </configuration>
        </plugin>
    值得指出的是,尽管上面有一个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文件里写:
        <plugin>
            <groupId>com.lightbend.lagom</groupId>
            <artifactId>lagom-maven-plugin</artifactId>
            <version>${lagom.version}</version>
            <configuration>
                <cassandraJvmOptions>
                     <opt>-Xms256m</opt>
                     <opt>-Xmx1024m</opt>
                     <opt>-Dcassandra.jmx.local.port=4099</opt>
                     <opt>-DCassandraLauncher.configResource=dev-embedded-cassandra.yaml</opt>
                 </cassandraJvmOptions>
            </configuration>
        </plugin>
    (5)yaml 配置文件
    如上所示,可以通过修改Cassandra JVM选项来配置YAML配置文件,其中包括一个-DCassandraLauncher.configResource系统属性的值来指向src/main/resource下的某个文件。
    (6)日志
    日志记录是这样配置的,它可以达到标准输出,例如org.apache.cassandra设置为ERROR,下面是logback的设置。
        <?xml version="1.0" encoding="UTF-8"?>
        <configuration>
          <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
            <encoder>
              <pattern>%date{ISO8601} %-5level %logger - %msg%n</pattern>
            </encoder>
          </appender>
          <logger name="org.apache.cassandra" level="ERROR" />          
          <root level="INFO">
            <appender-ref ref="STDOUT" />
          </root>             
        </configuration>
       单数需要注意的是,内嵌的Cassandra服务器是不允许你修改上面的这个配置文件。如果确实你想自定义自己的日志,那么只能自己安装Cassandra服务器,并阅读相关的配置介绍(就是下面的第10个小点)进行自定义。
   (7)Cassandra开始时间
       如前所述,runAll会在启动其他服务之前启动一个内嵌的Cassandra服务器,而且服务通常只在Cassandra服务器可到达之后才开始。默认情况下,Cassandra服务器将在20秒内启动并运行,但是您可以通过在构建中添加以下内容来更改这个默认值。
       在maven的pon文件下:
       plugin>
            <groupId>com.lightbend.lagom</groupId>
            <artifactId>lagom-maven-plugin</artifactId>
            <version>${lagom.version}</version>
            <configuration>
                <cassandraMaxBootWaitingSeconds>0</cassandraMaxBootWaitingSeconds>
            </configuration>
        </plugin>
        设置Cassandra的最大启动等待时间为0可以模拟真实的部署场景,因为运行的Cassandra实例可能无法在服务启动时可用
    (8)关闭和启动
        在执行runAll任务时,将自动启动Cassandra服务器。在执行runAll任务时,将自动启动Cassandra服务器。在这种情况下,你可以手动的启动Cassandra 服务。如果是maven任务,你可以使用lagom:startCassandra来启动Cassandra 任务,用lagom:stopCassandra 来关闭任务。
    (9)让Cassandra  Disabled
        你可以通过添加如下的配置来让内嵌的Cassandra  失效。
        maven的pom文件里:
        <plugin>
            <groupId>com.lightbend.lagom</groupId>
            <artifactId>lagom-maven-plugin</artifactId>
            <version>${lagom.version}</version>
            <configuration>
                <cassandraEnabled>false</cassandraEnabled>
            </configuration>
        </plugin>
        如果您需要您的服务连接到一个外部运行的、本地运行的Cassandra实例,那么上面的这些配置可以帮助你。
    (10)连接到本地运行的Cassandra实例
        可以连接到外部运行的Cassandra实例来代替嵌入的Cassandra实例。您所需要做的就是在构建中添加以下内容。
        maven的pom文件中:
        <plugin>
            <groupId>com.lightbend.lagom</groupId>
            <artifactId>lagom-maven-plugin</artifactId>
            <version>${lagom.version}</version>
            <configuration>
                <unmanagedServices>
                    <cas_native>http://localhost:9042</cas_native>
                </unmanagedServices>
                <cassandraEnabled>false</cassandraEnabled>
            </configuration>
        </plugin>
        这两个设置只能在运行Lagom的DevMode时使用。这两个设置的目的是禁用嵌入式Cassandra服务器,并在DevMode中配置服务定位器,以便在寻找cas_native时仍然能够找到Cassandra。如果您已经有一个运行在本地或公司基础设施中的Cassandra服务器,您可能想要禁用它。在这种情况下,Lagom启动Cassandra服务器是没有意义的,而且您还会获得几秒钟的启动时间。
        这些示例中的服务定位器设置假设您的本地Cassandra实例在端口9042上运行。
    

6.kafka服务器

默认情况下,Lagom服务需要使用Kafka作为消息代理与其他人之间共享信息的。在微服务体系结构中,使用message broker对避免耦合服务过于强烈是至关重要的。因此,为了方便,我们在开发环境中嵌入了kafka服务器,这样您就不必担心安装它了。有一些设置和任务可以调整kafka服务器,让我们来探索它们:
(1)默认端口:
    默认情况下,kafka服务器默认的端口号是9092,kafka使用zk,因此一个zk服务器也在2181端口被启动起来,如果当前的默认端口不适合您,您可以通过在构建中添加以下内容来更改
    在maven的pom文件下:
    <plugin>
        <groupId>com.lightbend.lagom</groupId>
        <artifactId>lagom-maven-plugin</artifactId>
        <version>${lagom.version}</version>
        <configuration>
            <kafkaPort>10000</kafkaPort>
            <zookeeperPort>9999</zookeeperPort>
        </configuration>
    </plugin>
 (2)kafka properties文件
     kafka服务器可配置属性文件。默认的,我们使用server.properties文件来为kafka提供配置,只有一个更改,允许在服务器上创建主题的自动创建。这是一个很好的默认快速启动,但是如果你发现自己需要用不同的配置来启动kafka,用下面的方式,你可以很容易的做到。
     maven的pom文件:
     <plugin>
        <groupId>com.lightbend.lagom</groupId>
        <artifactId>lagom-maven-plugin</artifactId>
        <version>${lagom.version}</version>
        <configuration>
            <kafkaPropertiesFile>${basedir}/kafka-server.properties</kafkaPropertiesFile>
        </configuration>
    </plugin>
(3)JVM优化
    kafka服务器在一个单独的进程上运行,并且JVM开始时具有合理的内存默认值。但是,如果默认的JVM选项不适合您,您可以通过在构建中添加以下内容来覆盖它们。
    <plugin>
        <groupId>com.lightbend.lagom</groupId>
        <artifactId>lagom-maven-plugin</artifactId>
        <version>${lagom.version}</version>
        <configuration>
            <kafkaJvmOptions>
                 <opt>-Xms256m</opt>
                 <opt>-Xmx1024m</opt>
             </kafkaJvmOptions>
        </configuration>
    </plugin>
(4)日志
    将日志配置为只用于文件。您可以在文件夹中找到kafka的日志,文件目录的格式为:
    <your-project-root>/target/lagom-dynamic-projects/lagom-internal-meta-project-kafka/target/log4j_output
(5)Commit log
    kafka本质上是一个持久的提交日志。您可以发现kafka在文件夹中保存的所有数据。
    <your-project-root>/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服务器。
    <plugin>
        <groupId>com.lightbend.lagom</groupId>
        <artifactId>lagom-maven-plugin</artifactId>
        <version>${lagom.version}</version>
        <configuration>
            <kafkaEnabled>false</kafkaEnabled>
        </configuration>
    </plugin>
    禁用嵌入式Kafka服务器的一个很好的理由是,如果您需要您的服务连接到一个外部的Kafka实例。
(8)连接到外部kafka服务器
    可以连接到外部的Kafka服务器来代替嵌入的服务器。您所需要做的就是在构建中添加以下内容。
    maven的pom文件:
    <plugin>
        <groupId>com.lightbend.lagom</groupId>
        <artifactId>lagom-maven-plugin</artifactId>
        <version>${lagom.version}</version>
        <configuration>
            <kafkaAddress>localhost:10000</kafkaAddress>
            <kafkaEnabled>false</kafkaEnabled>
        </configuration>
    </plugin>
    您可能已经注意到,上面配置的kafka服务器实际上在本地运行(请注意提供地址中的本地主机)。在这种情况下,它实际上已经足够配置正在运行的端口,而不必提供完整的地址。
点赞
收藏
评论区
推荐文章
乌秃头 乌秃头
4个月前
docker 部署运行MinerU
要在本地使用Docker部署并运行MinerU(仅使用CPU),您可以按照以下步骤进行操作:1.准备工作确保您的计算机上已经安装了Docker环境。如果没有,请访问Docker官方网站下载并安装适合您系统的版本。确保Docker服务已经启动。2.拉取Min
Wesley13 Wesley13
3年前
java项目中构建scala模块
在maven项目中构建scala模块,这样的话可以java和scala互相调用,最好在环境变量中配置scalahome,ide加载相关的模块进行编译运行。pom中的配置如下:<dependencies<dependency<groupIdorg.scalalang</gro
Stella981 Stella981
3年前
Spring Boot中application.properties优先级顺序
application.properties,用来配置一些可以手动修改而且不用编译的变量,这样的作用在于,打成war包或者jar包用于生产环境时,我们可以手动修改环境变量而不用再重新编译。springboo默认已经配置了很多环境变量,例如,tomcat的默认端口是8080,项目的contextpath是“/”等等(更多请看https://docs.s
Wesley13 Wesley13
3年前
OP
OPTEEQEMU下载编译运行等环境搭建流程1.安装开发工具2.建立git环境3.检出指定版本4.克隆optee\_my\_test5.编译toolchains6.编译全部工程7.运行qemu8.总结本文基于《手机安全和可信应用开发指南:
Stella981 Stella981
3年前
Dapr微服务应用开发系列1:环境配置
题记:上篇Dapr系列文章简要介绍了Dapr,这篇来谈一下开发和运行环境配置本机开发环境配置安装Docker为了方便进行Dapr开发,最好(其实不一定必须)首先在本机(开发机器)上安装Docker。安装方式可以参考Docker的官方文档:https://docs.docker.com/install/。如果你是Win
Wesley13 Wesley13
3年前
01.Flink笔记
Flink开发环境部署配置Flink是一个以Java及Scala作为开发语言的开源大数据项目,代码开源在github上,并使用maven来编译和构建项目。所需工具:Java、maven、Git。本次操作是在windows环境下。一、工具安装Java配置(略)maven配置1.
Stella981 Stella981
3年前
Linux CentOS7.0下JAVA安装和配置环境变量
一.前言:CentOS7.0虽然自带JDK1.7和1.8,运行“javaversion”命令也可以看到版本信息,但是jdk的安装环境不全,比如缺少tool.jar和dt.jar等,这就导致“javac”等这样的命令即便配置了环境变量也不能用,所以要重新安装jdk,并且配置环境变量,并解决“javac”命令不可用的问题。二.下载安装
Wesley13 Wesley13
3年前
Maven 项目自动编译
maven结构的项目,我们在每次修改代码后都会需要手动编译,下面命令可以解决此问题,只要代码修改,会自动帮你编译。进入项目目录执行:mvnUeclipse:cleaneclipse:eclipse然后重新执行mvncleanpackage启动你的servlet容器看看吧。Maven库:http://
Wesley13 Wesley13
3年前
Java之使用IDE
  IDE是集成开发环境:IntegratedDevelopmentEnvironment的缩写。  使用IDE的好处在于按,可以把编写代码、组织项目、编译、运行、调试等放到一个环境中运行,能极大地提高开发效率。  IDE提升开发效率主要靠以下几点:编辑器的自动提示,可以大大提高敲代码的速度;代码修改后可以自动重新
Wesley13 Wesley13
3年前
vagrant使用小结
vagrant使用小结最近公司用了vagrant的虚拟镜像服务,感觉挺不错的.在此仅记录使用方法.优点:我们可以通过Vagrant封装一个Linux的开发环境,分发给团队成员。成员可以在自己喜欢的桌面系统(Mac/Windows/Linux)上开发程序,代码却能统一在封装好的环境里运行,非常霸气.主要是看重它可以让开发人员在同样开发环境下
CoderCraber CoderCraber
2年前
解决Elasticsearch相关CORS问题
解决Elasticsearch相关CORS问题运行环境我用Java编写了一个带有ElasticSearch的后端,并使用Maven进行构建和管理。部署的运行环境是基于GoogleCloudPlatform(GCP)的。我在此环境中使用Google的Elas
ByteZenithMaster
ByteZenithMaster
Lv1
那些离乱的现实,岂能容我当作思绪来写。
文章
4
粉丝
0
获赞
0