1. 程式人生 > >akka構建簡單分散式應用

akka構建簡單分散式應用

http://www.cnblogs.com/hequn/articles/3764630.html

當程式的要求達到一臺計算機的極限時,我們便需要將程式分散式化,讓程式執行在多臺計算機上。akka提供了remote actor用來構建分散式應用。

一、remote actor

1.Actor path

  actor的路徑設計採用了類似URL的形式,即scheme://domain:port/path。scheme代表協議(http或者ftp),domain代表域名或者ip地址,port代表埠,path代表路徑。所以表示一個actor的路徑是akka://[email protected]:2552/user/SomeActor。路徑表示遠端actor的主機ip是10.102.141.77,埠是2552,actorsystem是ServerSys,Actor的名字是SomeActor。通過Actor path,我們就可以遠端訪問一個actor,進而進行訊息的傳遞。

2.Actor引用

當知道遠端actor的url後,我們便可以遠端訪問一個actor。訪問通過引用遠端actor來實現。

val actor = context.actorFor("akka://[email protected]:2552/user/actorName")

一旦得到了actor的引用,你就可以象與本地actor通訊一樣與它進行通迅了

actor ! "Pretty awesome feature"

二、一個簡單例子

有一個本地actor:LocalActor,一個遠端actor:RemoteActor。我們要實現相互之間的通訊。LocalActor向RemoteActor傳送一個訊息"Hi there",RemoteActor返回"Hi there got something"。

1.remote端。

remote端的目錄結構如下

 包含四個檔案:application.conf,build.sbt,RemoteNodeApplication.scala,RemoteActor.scala

application.conf:

複製程式碼
RemoteSys {
    akka {
          actor {
            provider = "akka.remote.RemoteActorRefProvider"
          }
       remote {
        transport = "akka.remote.netty.NettyRemoteTransport
" netty { hostname = "192.168.178.192" port = 2552 } } } }
複製程式碼

build.sbt

複製程式碼
name := "RemotingExampleRemoteNode"

version := "1.0"

scalaVersion := "2.9.1"

resolvers += "Typesafe Repository" at "http://repo.typesafe.com/typesafe/releases/"

libraryDependencies ++= Seq(
"com.typesafe.akka" % "akka-actor" % "2.0.2",
"com.typesafe.akka" % "akka-remote" % "2.0.2",
"com.typesafe.akka" % "akka-kernel" % "2.0.2"
)
複製程式碼

RemoteActor.scala

複製程式碼
package org.akka.essentials.remotenode
import akka.actor.Actor

class RemoteActor extends Actor {
  def receive: Receive = {
    case message: String =>
      // Get reference to the message sender and reply back
      sender.tell(message + " 192.168.178.192 got something")
  }
}
複製程式碼

RemoteNodeApplication.scala

複製程式碼
package org.akka.essentials.remotenode
import akka.kernel.Bootable
import akka.actor.ActorSystem
import akka.actor.Props
import com.typesafe.config.ConfigFactory

object RemoteActorSystem{
  def main(args: Array[String]):Unit = {
    val system = ActorSystem("RemoteNodeApp", ConfigFactory.load().getConfig("RemoteSys"))
    val remoteActor = system.actorOf(Props[RemoteActor], name = "remoteActor")
  }
}
複製程式碼

sbt package進行編譯,然後sbt run執行程式。

Remote端如果要以獨立微核心的形式使用,RemoteNodeApplication.scala如下

RemoteNodeApplication.scala

複製程式碼
package org.akka.essentials.remotenode
import akka.kernel.Bootable
import akka.actor.ActorSystem
import akka.actor.Props
import com.typesafe.config.ConfigFactory

class RemoteNodeApplication extends Bootable {
  val system = ActorSystem("RemoteNodeApp", ConfigFactory
    .load().getConfig("RemoteSys"))

  def startup = {
    system.actorOf(Props[RemoteActor], name = "remoteActor")
  }

  def shutdown = {
    system.shutdown()
  }
}
複製程式碼

微核心的使用參考參考文獻4.

2.Local端程式

目錄結構同Remote端。也是包含四個檔案:application.conf,build.sbt,LocalActor.scala,LocalNodeApplication.scala。

application.conf

複製程式碼
LocalSys {
    akka {
          actor {
            provider = "akka.remote.RemoteActorRefProvider"
          }
    }
}
複製程式碼

build.sbt

複製程式碼
name := "RemotingExampleLocalNode"

version := "1.0"

scalaVersion := "2.9.1"

resolvers += "Typesafe Repository" at "http://repo.typesafe.com/typesafe/releases/"

libraryDependencies ++= Seq(
"com.typesafe.akka" % "akka-actor" % "2.0.2",
"com.typesafe.akka" % "akka-remote" % "2.0.2",
"com.typesafe.akka" % "akka-kernel" % "2.0.2"
)
複製程式碼

LocalActor.scala

複製程式碼
package org.akka.essentials.localnode
import akka.actor.Actor
import akka.actor.ActorLogging
import akka.actor.Address
import akka.actor.Deploy
import akka.actor.Props
import akka.dispatch.Await
import akka.pattern.ask
import akka.remote.RemoteScope
import akka.util.duration.intToDurationInt
import akka.util.Timeout

class LocalActor extends Actor with ActorLogging {

  //Get a reference to the remote actor
  val remoteActor = context.actorFor("akka://[email protected]:2552/user/remoteActor")
  implicit val timeout = Timeout(5 seconds)
  def receive: Receive = {
    case message: String =>
      val future = (remoteActor ? message).mapTo[String]
      val result = Await.result(future, timeout.duration)
      log.info("Message received from Server -> {}", result)
  }
}
複製程式碼

LocalNodeApplication.scala

複製程式碼
package org.akka.essentials.localnode
import com.typesafe.config.ConfigFactory
import akka.actor.ActorSystem
import akka.actor.Props

object LocalNodeApplication {

  def main(args: Array[String]): Unit = {
    // load the configuration
    val config = ConfigFactory.load().getConfig("LocalSys")
    val system = ActorSystem("LocalNodeApp", config)
    val clientActor = system.actorOf(Props[LocalActor])
    clientActor ! "Hello"
    Thread.sleep(4000)
    system.shutdown()
  }
}
複製程式碼

執行結果如下(拖動圖片或者另存為可以看大圖)

參考文獻:

2.akka essential by Munish K.G


相關推薦

akka構建簡單分散式應用

http://www.cnblogs.com/hequn/articles/3764630.html當程式的要求達到一臺計算機的極限時,我們便需要將程式分散式化,讓程式執行在多臺計算機上。akka提供了remote actor用來構建分散式應用。一、remote actor1

SpringBoot使用(一)--- 構建簡單應用

Spring Boot提供了一種新的程式設計正規化,能在最小的阻力下開發Spring應用程式。有了它, 你可以更加敏捷地開發Spring應用程式,專注於應用程式的功能,不用在Spring的配置上多花功 夫,甚至完全不用配置。實際上, Spring Boot的一項重要工作就是讓Spring不再

Spring 註解學習手札(一) 構建簡單Web應用

轉載自 http://snowolf.iteye.com/blog/577989 我們將用到如下jar包:  引用 aopalliance-1.0.jar  commons-logging-1.1.1.jar  log4j-1.2.15.ja

一種使用 Redis 深度驅動的,為構建輕量級分散式應用程式(Microservices)的工程方案

![](https://img2020.cnblogs.com/blog/436453/202012/436453-20201210121448305-913435053.png) `Hydra` 是一個輕量級的 NodeJS 庫,用於構建分散式計算應用程式,比如微服務。我們對輕量級的定義是:輕處理外部複雜

ASP.NET Web API構建一個簡單應用

使用ASP.NET Web API構建一個簡單的應用。 示例:使用ASP.NET Web API提供獲取使用者列表和使用者資訊介面。 1、在Models目錄下建立使用者資訊類(UserModel.cs) /// <summary> /// 使用者資訊類 /// </

系統分析與設計方法---簡單分散式計算機應用系統的設計

簡單分散式計算機應用系統的設計     網路極大地擴充套件了計算機的應用範圍,同時,由於升級到更強的伺服器的費用常常遠遠高於購買多臺檔次稍低的機器,更何況雖然計算機有了長足的發展,可是單臺計算機的功能仍然十分有限,利用聯網的計算機協同工作,共同完成複雜的工作成為相對成本較低

Akka-Cluster(0)- 分散式應用開發的一些想法

[INFO] [10/22/2018 18:52:00.806] [ClusterSystem-akka.actor.default-dispatcher-32] [akka.tcp://[email protected]:51681/user/$a] akka.tcp://[email 

分散式應用框架Akka快速入門

本文結合網上一些資料,對他們進行整理,摘選和翻譯而成,對Akka進行簡要的說明。引用資料在最後列出。 1.什麼是Akka Akka 是一個用 Scala 編寫的庫,用於簡化編寫容錯的、高可伸縮性的 Java 和 Scala 的 Actor 模型應用。 Akka is a

VUE起步構建簡單單頁應用

環境搭建工作: 1.先安裝node,git工具(便於命令列操作) 2.換源(npm淘寶映象網站:https://npm.taobao.org/)   命令:npm install -g cnpm --

卷積神經網路簡單應用(二):模型構建與訓練

模型構建文中採用了Tensorflow框架進行模型的構建,這裡簡單介紹下Tensorflow的安裝(在Anaconda上安裝):⑴Anaconda安裝:https://www.anaconda.com/download/,選擇支援py36的版本;⑵直接在命令列中安裝Tenso

跟我學Spring Cloud(Finchley版)-02-構建分散式應用

上一節(http://www.itmuch.com/spring-cloud/finchley-1/)說過,Spring Cloud是一個快速構建分散式應用的工具集。本節,我們就來編寫一個簡單的分散式應用,並探討這個分散式應用有哪些問題。 服務消費者 & 提供者 本書使用服務提供

Android應用開發高效工具集1---ant構建簡單Android專案

在java編譯那些事兒中提到了用ant去編譯Java專案,今天擴充套件到用它來構建Android專案,其實道理是相通的,變化的只是使用的形式。ant構建相比IDE的好處是多個子專案使用自定義jar包時,ant可以更好的完成自動化構建,一個命令就搞定整個專案的編譯而不用手工的匯

Akka-CQRS(0)- 基於akka-cluster的讀寫分離框架,構建gRPC移動應用後端架構

異常 在線 persist 體系 分片 系統性能 resp 數據庫更新 讀寫分離 上一篇我們討論了akka-cluster的分片(sharding)技術。在提供的例子中感覺到akka這樣的分布式系統工具特別適合支持大量的帶有內置狀態的,相對獨立完整的程序在集群節點上分

Akka應用模式:分散式應用程式設計實踐指南pdf

下載地址:網盤下載 對於想要學習Akka的Java 和 Scala 開發者們,有很多技術資源可供參考,但是如要想知道如何去應用這些技術就需要不同的思維方式了。為了幫助你正確地使用Akka,《Akka應用模式:分散式應用程式設計實踐指南》這本實用的實踐指南提供了若干高階的設計模式,還包括瞭如何以及何時應用那些模

在ASP.NET Core MVC中構建簡單 Web Api

程序 Getting Started在 ASP.NET Core MVC 框架中,ASP.NET 團隊為我們提供了一整套的用於構建一個 Web 中的各種部分所需的套件,那麽有些時候我們只需要做一個簡單的 Web Api 程序怎麽辦呢?在 GitHub 中的 ASP.NET Core MVC 源碼裏面,我

js中替換字符串(replace方法最簡單應用)

sre 正則表達 表達 格式 str ext 替換字符串 repl regexp replace方法的語法是:stringObj.replace(rgExp, replaceText) 其中stringObj是字符串(string),reExp可以是正則表達式對

1.3 構建簡單的用戶界面

一課 val ava 區域 調整 獲得 語言 clas providing 在本課中,您將學習如何創建一個 XML 格式的布局,其中包含一個文本字段和一個按鈕。 在下一課中,在按下此按鈕時,您的應用會將文本字段的內容發送給另一個 Activity 作為響應。 Android

位運算一些簡單應用

最終 運算 等於 二進制 位運算 bsp amp 簡單 結果 從0開始數 1.把0x4f 的第3位變成0;~(1<<3) & 0x4f 轉為二進制: 1001111 最終結果:-> 1000111 1110111 -> 反 0

protobuf簡單測試應用

127.0.0.1 sha 二進制協議 sync 簡單測試 比較 eat int pre protobuf是google推出的一種數據交換協議,比較適合應用於底層服務交互,nodejs提供protobufjs包的實現,下面是一個簡單的測試demo: 首先是.proto文件

使用Nginx+CppCMS構建高效Web應用服務器(之三)

影響 size ppc light .html 數據顯示 com logs cppcms 使用Nginx+CppCMS構建高效Web應用服務器(之三)   --充分利用服務器和客戶端計算能力              歡迎測試,攻擊:http://www.lite