Akka通信框架在java端项⽬的安装,环境的准备,简介和⼊门程
序(1)
⼀ Akka 简介
1 akka 的定义
Akka是JAVA虚拟机平台上构建⾼并发、分布式和容错应⽤的⼯具包, 是异步、⾮阻塞、⾼性能的事件驱动编程模型 / 通信框架。Akka⽤Scala语⾔编写,同时提供了Scala和Java的开发接⼝。Akka处理并发的⽅法基于Actor模型,Actor之间通信的唯⼀机制就是消息传递。
在Akka中执⾏单元是Actor ,在Actor模型中并不是通过Actor对象的某个⽅法来告诉Actor需要做什么,⽽是给Actor发送⼀条消息。当⼀个Actor收到消息后,它有可能根据消息的内容做出某些⾏为,如更改⾃⾝状态,此时这个状态的更改是Actor⾃⾝进⾏的,并⾮由外界⼲预进⾏的。
2 Actor 的作⽤和特点
2.1 Actor是⽤来接收发送消息,处理逻辑的
2.2 ActorSystem 是单例的,⼀个进程中只要有⼀个即可,它是⽤来创建Actor的,并且监控和管理他创建的Actor
2.3 Actor是多例的,可以创建多个实例
2.4 Actor编程模式就通过送消息来实现并发的 ,Actor 可以处理多种类型的消息 .
2.5 Akka就是基于Actor编程模型实现的,可以是单机,也可以是分布式的
2.6 ⾼容错(错误恢复) ,有⼀个 Actor 池 ,每个Actor 会处理不同的事件 ,Actor 做的事情可能会抛出异常 ,⽽它⾃⼰⽆法从中恢复 .这
种情况下 ,需要再⽣产(created) ⼀个新的 Actor 来顶替它 .也就是说这个新的 Actor 会忽略刚才那条消息 ,继续处理剩余的消息 .这些也被称为指令 (Directive).
⼆ Akka 通信原理
1 先启动 Master (这是⼀个进程)
2 然后启动所有的 Worker(每个 Worker 都是⼀个进程)
3 Worker 向 Master 建⽴连接 ,然后向 Master 发送注册消息(workerID ,workerMemory ,workerCore)
4 Master 接收到 Worker 发送的注册消息后 ,将注册数据封装起来,然后保存;
5 Master 将 Worker 的注册数据保存后 ,将注册成功的消息返回给 Worker ;
6 Worker 接收到注册成功的消息后 ,开启定时器 ,定期(每10s)向 Master 发送⼼跳 ,以此证明⾃⼰没有掉线 ;
7 Master 接收到 Worker 发送的⼼跳信息之后 , 根据 Worker 提供的 workerID ,到 Map ⾥⾯到对应的 workerInfo ,然后获取接
收⼼跳时的当前系统的时间 ,更新 Worker 的最新的⼼跳时间 .
8 Master 机器上也有⼀个定时器 ,定期(每15s)检测⾃⼰⾝上所有的 Worker ,是否有超时的worker ,如果 Worker 超时了, 需要将超
时的 workerID 移除 .
⼆ Akka在java端 Mawen 项⽬的安装
1 进⼊ IDEA 界⾯ ,在⼯具栏上点击 File--->New---->Project--->Maven---->Next
2 将项⽬名(Name) 和项⽬存储位置(Location) 设置好
java安装完整教程3 将 Artifact Coordinates 展开 ,设置 GroupId (⽐如写成 com.akka.rpc)
4 最后点击 Finish ,即完成项⽬的设置 .
三安装好Mawen 项⽬后 ,运⾏环境的准备
在 l 中,添加 akka 运⾏时需要的依赖(dependencies) ,和插件(build)
<!-- 常量 -->
<properties>
<mavenpiler.source>1.8</mavenpiler.source>
<mavenpiler.target>1.8</mavenpiler.target>
<encoding>UTF-8</encoding>
<scala.version>2.12.10</scala.version>
<scalapat.version>2.12</scalapat.version>
<akka.version>2.4.17</akka.version>
</properties>
<dependencies>
<!-- scala的依赖 -->
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-library</artifactId>
<version>${scala.version}</version>
</dependency>
<!-- akka actor依赖 -->
<dependency>
<groupId&pesafe.akka</groupId>
<artifactId>akka-actor_${scalapat.version}</artifactId>
<version>${akka.version}</version>
</dependency>
<!-- akka远程通信依赖 -->
<dependency>
<groupId&pesafe.akka</groupId>
<artifactId>akka-remote_${scalapat.version}</artifactId>
<version>${akka.version}</version>
<version>${akka.version}</version>
</dependency>
</dependencies>
<build>
<pluginManagement>
<plugins>
<!-- 编译scala的插件 -->
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>scala-maven-plugin</artifactId>
<version>3.2.2</version>
</plugin>
<!-- 编译java的插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.5.1</version>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>scala-maven-plugin</artifactId>
<executions>
<execution>
<id>scala-compile-first</id>
<phase>process-resources</phase>
<goals>
<goal>add-source</goal>
<goal>compile</goal>
</goals>
</execution>
<execution>
<id>scala-test-compile</id>
<phase>process-test-resources</phase>
<goals>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- 打jar插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId>
<version>2.4.3</version>
<executions>
<execution>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
<transformers>
<transformer implementation="org.apache.maven.source.AppendingTransformer">
<resource&f</resource>
</transformer>
<!-- 指定maven⽅法 -->
<!-- <transformer implementation="org.apache.maven.source.ManifestResourceTransformer">--> <!-- <mainClass>cn._51doit.rpc.akka.akkalearning.Master
</mainClass>-->
<!-- </transformer>-->
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
四 Akka 的⼊门程序(很重要)
1 ⾸先先创建 Master 的 Actor ,然后重写接收信息的⽅法
-
-----继承Actor ,重写接收信息的⽅法--------
class Master03 extends Actor{
--------⽤来接收信息的
override def receive: Receive = {
------匹配到master启动的信息
case "hello" => {
println("接收到master启动的信息")
}
-------匹配到Worker发送注册的信息
case "workersend" => {
println("接收到Worker的启动成功的信息,并接收到其发送的注册信息")
-
-----接收到信息后 ,将接收成功的信息返回给Worker
sender() ! "mastersend"
}
}
}
--------先创建 master的 actor
object Master03{
def main(args: Array[String]): Unit = {
val masterHost3 = "localhost"
val masterPort3 = 8888
val configStr3 =
s"""
|akka.actor.provider = "RemoteActorRefProvider"
|p.hostname = $masterHost3
|p.port = $masterPort3
|""".stripMargin
val config3 = ConfigFactory.parseString(configStr3)
------创建 ActorSystem ,获得对象 ,然后再创建actor
val actorSystem3 = ActorSystem("Master-Actor-System3", config3)
----------通过对象创建 actor
val actorRef3 = actorSystem3.actorOf(Props[Master03], "Master-Actor3") ------先给⾃⼰g发送⼀条信息验证⼀下
actorRef3 ! "hello"
}
}
2 然后创建Worker 的 Actor
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论