Akka Cluster 学习笔记(2) - 配置与启动

添加依赖

        <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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,314评论 19 139
  • Redis Cluster Specification 1 设计目标和理由 1.1 Redis Cluster g...
    近路阅读 9,712评论 0 12
  • feisky云计算、虚拟化与Linux技术笔记posts - 1014, comments - 298, trac...
    不排版阅读 9,324评论 0 5
  • 1基本安装1.1在基于RHEL的系统中安装Cassandra1.1.1必要条件Ø YUM包管理器Ø Root或...
    战神汤姆阅读 4,675评论 0 4
  • 初秋的天气,还到处弥漫着太阳的燥热,浑身的湿粘时刻提醒着秋老虎的威力。间或之余,只希望片刻的冰凉能吹散压不下的温度...
    c3bbbc7ced20阅读 6,540评论 1 1