添加依赖
<dependency>
<groupId>com.typesafe.akka</groupId>
<artifactId>akka-actor_2.12</artifactId>
<version>${akka.version}</version>
</dependency>
<dependency>
<groupId>com.typesafe.akka</groupId>
<artifactId>akka-cluster_2.12</artifactId>
<version>${akka.version}</version>
</dependency>
akka配置文件
akka {
actor {
provider = "cluster"
}
remote {
log-remote-lifecycle-events = off
netty.tcp {
hostname = "127.0.0.1"
port = 0
}
}
cluster {
seed-nodes = [
"akka.tcp://ClusterSystem@127.0.0.1:2551",
"akka.tcp://ClusterSystem@127.0.0.1:2552"]
}
}
akka.extensions = ["akka.cluster.metrics.ClusterMetricsExtension"]
akka.cluster.metrics.native-library-extract-folder=${user.dir}/target/native
上述配置为正常配置,如果akka运行在Docker容器或NAT环境中,参考配置如下:
akka {
remote {
netty.tcp {
hostname = my.domain.com # external (logical) hostname
port = 8000 # external (logical) port
bind-hostname = local.address # internal (bind) hostname
bind-port = 2552 # internal (bind) port
}
}
}
集群启动
集群节点可通过配置文件自动加入(也可通过程序加入)。
可以在同一JVM中启动Akka Cluster,也可以在不同的JVM中启动Akka Cluster,但在同一Cluster中的ActorSystem必须相同。
在不同JVM中启动Akka Cluster时:
- 在Akka App 中,需传入Akka 运行端口;启动时,需先传入seed node参数,如下:
// Override the configuration of the port
Config config = ConfigFactory.parseString(
"akka.remote.netty.tcp.port=" + port + "\n" +
"akka.remote.artery.canonical.port=" + port)
.withFallback(ConfigFactory.load());
// Create an Akka system
ActorSystem system = ActorSystem.create("ClusterSystem", config);
- 运行Akka App时,需先启动seed node:
sbt "runMain <packageName>.ClusterApp 2551"
sbt "runMain <packageName>.ClusterApp 2552"
sbt "runMain <packageName>.ClusterApp 0"
mvn compile exec:java -Dexec.mainClass="<packageName>.ClusterApp" -Dexec.args=2521
mvn compile exec:java -Dexec.mainClass="<packageName>.ClusterApp" -Dexec.args=2522
mvn compile exec:java -Dexec.mainClass="<packageName>.ClusterApp" -Dexec.args=0
port = 0表示不指定特定端口
关于seed-node的指定
- application.conf 文件指定
- JVM 启动参数,如:
-Dakka.cluster.seed-nodes.0=akka.tcp://ClusterSystem@host1:2552
-Dakka.cluster.seed-nodes.1=akka.tcp://ClusterSystem@host2:2552
- seed-nodes list中的第一个node需要最先启动,其他可不按顺序,或不启动
- 如有两个以上的seed node已启动,第一个seed node则可以停止
Node Join的方式
- configure (使用 application.conf)
- code (
joinSeedNodes
) - manually: JMX,HTTP
网友评论