閱讀714 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Akka學習筆記(七):配置


Akka學習筆記(七):配置

使用Akka可以不用任何配置,Akka提供了明智的默認配置。為了適應特別的運行環境,修改默認行為,你可能需要修改:

  • log level and logger backend
  • enable remoting
  • 消息係列化
  • 路由設置
  • 調度器調優

Akka使用Typesafe Config Library,純java實現的配置庫。之前博客有介紹過here

從哪裏讀取配置

Akka的所有配置信息裝在 ActorSystem的實例中, 或者換個說法, 從外界看來, ActorSystem 是配置信息的唯一消費者. 在構造一個actor係統時,你可以傳進來一個 Config object,如果不傳,就相當於傳進來 ConfigFactory.load() (使用正確的classloader). 這意味著將會讀取classpath根目錄下的所有application.conf, application.json and application.properties這些文件—請參閱之前推薦的文檔以了解細節. 然後actor係統會合並classpath根目錄下的 reference.conf 來組成其內部使用的缺省配置

appConfig.withFallback(ConfigFactory.defaultReference(classLoader))
其中的哲學是代碼不包含缺省值,而是依賴於隨庫提供的 reference.conf 中的配置.

係統屬性中覆蓋的配置具有最高優先級,見 HOCON 規範 (靠近末尾的位置). 要提醒的是應用配置—缺省為 application—可以使用 config.resource 中的屬性來覆蓋 (更多細節參閱 配置文檔).

注意
如果你編寫的是一個Akka應用,把配置放在classpath根目錄下的 application.conf 中. 如果你編寫的是一個基於Akka的庫,把配置放在jar包根目錄下的 reference.conf 中.

When using JarJar, OneJar, Assembly or any jar-bundler

警告
Akka會讀取所有jar包的reference.conf配置,所以如果你把多個jar包合並成一個jar,那麼你也必須合並這些reference.conf,否則默認配置會丟失,導致Akka不能正常工作

Custom application.conf

一個application.conf可能看起來是這樣:

# 你可以在這個配置文件中覆蓋掉reference files的配置.
# Copy in parts of the reference files and modify as you please.

akka {

  # Loggers to register at boot time (akka.event.Logging$DefaultLogger logs
  # to STDOUT)
  loggers = ["akka.event.slf4j.Slf4jLogger"]

  # 日誌級別
  # as they have been started; before that, see "stdout-loglevel"
  # Options: OFF, ERROR, WARNING, INFO, DEBUG
  loglevel = "DEBUG"

  # Log level for the very basic logger activated during ActorSystem startup.
  # This logger prints the log messages to stdout (System.out).
  # Options: OFF, ERROR, WARNING, INFO, DEBUG
  stdout-loglevel = "DEBUG"

  actor {
    provider = "akka.cluster.ClusterActorRefProvider"

    default-dispatcher {
      # Throughput for default Dispatcher, set to 1 for as fair as possible
      throughput = 10
    }
  }

  remote {
    # The port clients should connect to. Default is 2552.
    netty.tcp.port = 4711
  }
}

包含文件

可以將配置include進來。比如有一個通用的環境配置application.conf,我們隻需要覆蓋掉其中的個別變量,以滿足特殊環境的需求

通過-Dconfig.resource=/dev.conf加載dev.conf配置文件,這個配置文件會加載application.conf

dev.conf:

include "application"

akka {
  loglevel = "DEBUG"
}

更高級的包含和替換機製在 HOCON 規範中有解釋.here

配置日誌

如果係統屬性或配置屬性 akka.log-config-on-start 設置為 on, 那麼當actor係統啟動時整個配置的日誌級別為INFO. 這在你不確定使用哪個配置時會有用。

如果有疑問,你也可以在用它們構造一個actor係統之前或之後很方便地了解配置對象的內容:

Welcome to Scala version 2.9.1.final (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_27).
Type in expressions to have them evaluated.
Type :help for more information.

scala> import com.typesafe.config._
import com.typesafe.config._

scala> ConfigFactory.parseString("a.b=12")
res0: com.typesafe.config.Config = Config(SimpleConfigObject({"a" : {"b" : 12}}))

scala> res0.root.render
res1: java.lang.String =
{
    # String: 1
    "a" : {
        # String: 1
        "b" : 12
    }
}

每一條設置之前的注釋給出了原有設置的詳情信息 (文件和行號) 以及(e.g. 在參考配置中)可能出現的注釋,與參考配置合並並被actor係統解析的設置可以這樣顯示:

final ActorSystem system = ActorSystem.create();
println(system.settings());
// 這是 system.settings().config().root().render() 的簡寫

未完待續


最後更新:2017-04-03 05:39:44

  上一篇:go android設備休眠
  下一篇:go Akka學習筆記(六):消息傳遞可靠性