開發環境下運行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)apache
服務定位器嵌入在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服務器實際上在本地運行(請注意提供地址中的本地主機)。在這種狀況下,它實際上已經足夠配置正在運行的端口,而沒必要提供完整的地址。