akka介绍之-akka-remote介绍
akka-remote介绍
既然akka是构建分布式高并发的计算和运行框架,当然要离不开远程通信,akka的remote模块就是专门支持分布式的远程调用。
说到分布式应用,大家肯定想到以下几个耳熟能详的技术实现
- RPC(Remote Procedure Call Protocol)
- Web Service
- RMI (Remote Method Invocation)
- JMS(Java Messaging Service)
PRC调用框架或者WS以及RMI都是堵塞式的远程过程调用,请求-响应模式。
JMS是异步通信,发送消息进行通信,在通信过程中,线程不会被阻塞,不必等待请求回应,所以是一个异步操作且是松耦合不需要接口声明,返回的数据类型可以是各种各样,比如JSON,XML等。
JMS的通信方式有两种:
- 点对点形式
顾名思义,点对点可以理解为两个服务器的定点通信,发送者和接收者都能明确知道对方是谁,大致模型如下:
- 发布-订阅模式
也就是多个消费者可以订阅一个消息如下图所示:
而akka是基于消息的异步的分布式高并发计算框架,既有JMS基于消息的异步调用的特点,又有RPC的请求响应模式,同时它让远程过程调用变得十分简单。
下面是一个具体的AKKA-remote的例子。
创建远程服务端
- 首先定义一个remoteActor,和定义本地的actor一样,如下图所示:
- 在classpath路径下添加一个application.conf文件,配置该actor系统为提供远程调用功能,如下图示,只需要几个简单配置即可:
- 启动该actor,提供远程服务,如下图所示:
我们的名字叫app的akka系统已经提供服务并监听在127.0.0.1:2554上。
创建调用端
- 在classpath路径下添加配置文件application.conf,如同创建远程端一样。host和port不能和远程端冲突。
如下图所示:我们在8084端口上创建客户端的通讯端口。
- 通过ActorSystem的actorSelection(remotepath)获取远程actor的引用,然后就可以像操作本地actor一样,向它发送消息,如下图所示:
我们启动了客户的系统,并且获取远程actor的引用,并向它投递一个消息。
从以上的步骤和结果看出可以看出,Akka的远程通信跟JMS的点对点模式似乎更相似一点,但是它有不需要我们维护消息队列,而是使用Actor自身的邮箱,另外我们利用context.actorSelection获取的ActorRef,可以看成远程Actor的副本,这个又和RMI相关概念类似,所以说Akka远程通信的形式上像是RMI和JMS的结合,当然底层还是通过TCP、UDP等相关网络协议进行数据传输的,从配置文件的相应内容便可以看出。