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://ServerSys@10.102.141.77: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://actorSystemName@10.0.0.1: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://RemoteNodeApp@192.168.178.192: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()
}
}

运行结果如下(拖动图片或者另存为可以看大图)

local端和Remote端的代码见:https://github.com/hequn8128/akka/tree/master/AkkaRemotingExample

参考文献:

1.akka官方文档中文版:http://www.gtan.com/akka_doc/index.html

2.akka essential by Munish K.G

3.akka essential code:https://github.com/write2munish/Akka-Essentials/tree/master/AkkaRemotingExample

4.akka微内核:http://www.gtan.com/akka_doc/modules/microkernel.html#microkernel

akka构建简单分布式应用的更多相关文章

  1. 使用Akka构建集群(二)

    前言 在<使用Akka构建集群(一)>一文中通过简单集群监听器的例子演示了如何使用Akka搭建一个简单的集群,但是这个例子“也许”离我们的实际业务场景太远,你基本不太可能去做这样的工作,除 ...

  2. 使用Akka构建集群(一)

    概述 Akka提供的非常吸引人的特性之一就是轻松构建自定义集群,这也是我要选择Akka的最基本原因之一.如果你不想敲太多代码,也可以通过简单的配置构建一个非常简单的集群.本文为说明Akka集群构建的学 ...

  3. 用Akka构建一个简易的分布式文件系统

    本来初期打算用Hadoop 2,可是后来有限的服务器部署了Solr Cloud,各种站点,发现资源不够了,近10T的文件,已经几乎把服务器的磁盘全部用光.想来想去,由于目前架构基于Scala的,所以还 ...

  4. 使用webstorm+webpack构建简单入门级“HelloWorld”的应用&&引用jquery来实现alert

    使用webstorm+webpack构建简单入门级"HelloWorld"的应用&&构建使用jquery来实现 1.首先你自己把webstorm安装完成. 请参考这 ...

  5. 构建简单的Maven工程,使用测试驱动的方式开发项目

    构建简单的Maven工程很简单,这里写这篇随笔的原因是希望自己能记住几个小点. 一.安装Maven 1.下载maven:https://maven.apache.org/download.cgi 2. ...

  6. 【译】用boosting构建简单的目标分类器

    用boosting构建简单的目标分类器 原文 boosting提供了一个简单的框架,用来构建鲁棒性的目标检测算法.这里提供了必要的函数来实现它:100% MATLAB实现,作为教学工具希望让它简单易得 ...

  7. 三、使用Maven构建简单的java项目

    前边,我刚搭建了Maven环境,还有给大家推荐了学习资源,这个小节,我们来就来,,简单的玩玩maven. 1.所需工具: 1.Eclipse     2.apache-maven-3.3.9   3. ...

  8. 构建简单的 C++ 服务组件,第 1 部分: 服务组件体系结构 C++ API 简介

    构建简单的 C++ 服务组件,第 1 部分: 服务组件体系结构 C++ API 简介 熟悉将用于 Apache Tuscany SCA for C++ 的 API.您将通过本文了解该 API 的主要组 ...

  9. Android 第三课 构建简单的用户界面

    构建简单的用户界面 上一课下一课 该课程教你 创建线性布局 添加文本框 添加字符串资源 添加按钮 使输入框宽度充满整个屏幕 你也应该阅读 布局 Android的图形用户界面通过 View 和 View ...

随机推荐

  1. 谈谈Nginx有哪些特点

    1.热部署        我个人觉得这个很不错.在master管理进程与worker工作进程的分离设计,使的Nginx具有热部署的功能,那么在7×24小时不间断服务的前提下,升级Nginx的可执行文件 ...

  2. 【转载】C内存对齐

    http://blog.csdn.net/hbuxiaofei/article/details/9491953 当你看到这个标题,仍想往下读的时候说明你已经开始关注数据在内存存储问题了. 好吧,下面先 ...

  3. Guide to make CentOS 7 the perfect desktop

    原文地址:  http://www.dedoimedo.com/computers/fedora-pimp.html My original review of CentOS 7 was less e ...

  4. python pro practice

  5. 基于memcached的单机轻量级通用缓存库minicached的实现

    一.前言 之前拜读过淘宝子柳的<淘宝技术这十年>之大作,深知缓存技术在系统优化中起着一个举足轻重的作用.无论是文件系统静态文件,数据库的访问,乃至网络数据的请求,只要是与内存访问速度相差较 ...

  6. 如何用Java编写一段代码引发内存泄露

    本文来自StackOverflow问答网站的一个热门讨论:如何用Java编写一段会发生内存泄露的代码. Q:刚才我参加了面试,面试官问我如何写出会发生内存泄露的Java代码.这个问题我一点思路都没有, ...

  7. VB操作CAD

    Dim xlapp As Excel.Application            Dim xlbook As Excel.Workbook            Dim sheet As Excel ...

  8. thinkphp的目录结构

    ├─ThinkPHP.php 框架入口文件 ├─Common 框架公共文件 ├─Conf 框架配置文件 ├─Extend 框架扩展目录 ├─Lang 核心语言包目录 ├─Lib 核心类库目录 │ ├─ ...

  9. xcopy拷贝判断是否成功 robocopy排除子目录

    xcopy \\172.16.22.65\server\*.* C:\Inetpub\wwwroot\Server /h /r /s /yif %errorlevel% neq 0 echo copy ...

  10. Codeforces Round #325 (Div. 2) D. Phillip and Trains BFS

    D. Phillip and Trains Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/586/ ...