初识Akka

Aug 10, 2016


Akka

再忍不住吐槽一句:最近状态真的太差了,不顺心呐!另外写博客可比写代码要烦的多了;

Akka是什么?

参考官方文档是这样介绍的:

akka_define

简单来讲:

  • 1.Akka是一个用Scala编写的库
  • 2.用于构建高并发,分布式,可容错,事件驱动的基于JVM应用
  • 3.支持Java,Scala

Akka采用的是Actor模型

Actor模型(我的理解):

  • Actor就是一个实体,在开发程序过程中我们就是对实体之间怎么进行交互做处理
  • Actor相互之间是独立的,多个Actor进行交互的只能通过消息(Message)来进行发送接收–>处理
  • 如果一个Actor在某一个时刻接收多个Actor发送过来的消息(message),这就会产生并发问题,所以我们还需要一个消息队列来进行消息的存储,分发;

具体请参考 - 以Akka为示例,介绍Actor模型

Akka的产生使编写高并发分布式应用更加方便

详细介绍请参考:

Akka安装配置

在Java中我们有两种方式使用Akka:

  • 作为一个库,直接引入Jar包使用
  • 微内核–> 将应用放到独立的内核里

Typesafe Activator

我在这里主要介绍第一种方式,第二种方式请参考微内核使用Akka

首先介绍Typesafe Activator:

Typesafe Activetor实际就是一个Akka使用的IDE,集成了Java和Scala两种语言

首先从Typesafe官网下载压缩包(408M),下载完成之后解压:

active

解压之后启动方式(ubuntu环境下):

命令行进入~/activator-dist-1.3.5目录下:

./activator ui

如图:

acstart

tutoral

这样的话,Typesafe Activetor启动完成使用http://127.0.0.1:8888进行访问

Java中Jar使用

首先从官网下载项目akka 2.3.12 Release

下载的时候注意版本,我现在使用的是2.3.12,现在网上好多akka的例子是基于1.x版本,而2.x版本进行许多改变;

在eclipse中新建一个akka库,将akka-2.3.12/lib/akka其jar包添加进去,如图:

akka_lib

可能你的项目不需要全部包可以去除一些不必要的jar包

scala-lib

注意一点在下载后的akka-2.3.12项目lib/akka中不存在这个包,缺少这个包你编写基于akka代码会编译不通过

因为akka本身是使用scala语言写的,缺少scala-library-2.x.x.jar会编译不了

这个包在akka-2.3.12/lib目录下

这是自己引入jar包使用的方式

在Maven中使用Akka则是十分方便了,直接在pom.xml中添加akka依赖库使用就可以

请参考Maven中使用akka

在构建Akka远程项目出现的小问题

我是在Typesafe Activetor环境下直接下载其akka-remote-sample-java例子放到本地运行调试

发布代码如下:

//注册计算器实体(Worker)
public static void startRemoteCalculatorSystem() {
	
	final ActorSystem system = ActorSystem.create("CalculatorSystem",
			ConfigFactory.load(("calculator")));

	system.actorOf(Props.create(CalculatorActor.class), "calculator");

	System.out.println("Started CalculatorSystem");

}

//使用注册的计算器实体(Worker),通过url来进行找到注册的Wroker实体类
public static void startRemoteLookupSystem() {
	
	final ActorSystem system = ActorSystem.create("LookupSystem",
			ConfigFactory.load("remotelookup"));

	final String path =
	      "akka.tcp://CalculatorSystem@127.0.0.1:2552/user/calculator";

	final ActorRef actor = system.actorOf(
			Props.create(LookupActor.class, path), 
						"lookupActor");

	...........

}

我们如果这样直接运行的话,akka.tcp://CalculatorSystem@127.0.0.1:2552/user/calculator这个地址找不到对应的calculator计算器类;

开始纠结了蛮久,但是我想了一下这个2552这个端口是哪里来的,这个程序不可能会直接使用2552端口的;

所以需要几个配置文件类进行配置(我直接拿Typesafe Activetor环境下的那个例子的配置文件)

最后运行成功:

remote_akka

配置文件如下图:

props