Spring Boot集成Akka remoting快速入门Demo

1.什么是Akka remoting?

Akka-Remoting一种ActorSystem之间Actor对Actor点对点的沟通协议.通过Akka-Remoting来实现一个ActorSystem中的一个Actor与另一个ActorSystem中的另一个Actor之间的沟通

Akka Remoting限制:

  • 不支持NAT(Network Address Translation)

  • 不支持负载均衡器(Load Balancers)

Akka提供了种方式来使用Remoting功能:

  • 通过调用actorSelection方法搜索一个actor,该方法输入的参数的模式为:akka.<protocol>://<actor system>@<hostname>:<port>/<actor path>

  • 通过actorOf方法创建一个actor

下面看一下Remoting系统中故障恢复模型(Failure Recovery Model),如下图所示:上图中,连接到一个远程系统的过程中,包括上面4种状态:在进行任何通信之前,系统处于Idle状态;当第一次一个消息尝试向远程系统发送,或者当远程系统连接过来,这时系统状态变为Active;当两个系统通信失败,连接丢失,这时系统变为Gated状态;当系统通信过程中,由于参与通信的系统的状态不一致导致系统无法恢复,这时远程系统变为Quarantined状态,只有重新启动系统才能恢复,重启后系统变为Active状态。

Akka Remoting的功能

Akkaremoting完全配置化了,使用时几乎只需要修改配置文件,除非自定义,否则不需要动一行代码。 remoting包提供了两个功能:

  • 查找一个已存在的远程Actor

  • 在指定的远程路径上创建一个远程Actor

2.代码管理

实验目标

实现客户端和服务端双向通信

pom.xml

<!-- Akka Streams --><dependency>    <groupId>com.typesafe.akka</groupId>    <artifactId>akka-stream_2.13</artifactId>    <version>2.6.0</version></dependency>

server

server.conf

akka {  actor {    provider = "akka.remote.RemoteActorRefProvider"  }  remote {    artery {      enabled = on      transport = tcp      canonical.hostname = "127.0.0.1"      canonical.port = 2552    }  }}
package com.et.akka.remoting;
import akka.actor.AbstractActor;import akka.actor.ActorRef;import akka.actor.ActorSystem;import akka.actor.Props;import com.typesafe.config.ConfigFactory;
public class ServerApp {
static class ServerActor extends AbstractActor { @Override public Receive createReceive() { return receiveBuilder() .match(String.class, msg -> { System.out.println("Server received message: " + msg); getSender().tell("Hello from Server", getSelf()); }) .build(); } }
public static void main(String[] args) { ActorSystem system = ActorSystem.create("RemoteSystem", ConfigFactory.load("server")); ActorRef serverActor = system.actorOf(Props.create(ServerActor.class), "serverActor"); System.out.println("Server is running..."); }}

client

client.conf

akka {  actor {    provider = "akka.remote.RemoteActorRefProvider"  }  remote {    artery {      enabled = on      transport = tcp      canonical.hostname = "127.0.0.1"      canonical.port = 0    }  }}
package com.et.akka.remoting;
import akka.actor.AbstractActor;import akka.actor.ActorRef;import akka.actor.ActorSelection;import akka.actor.ActorSystem;import akka.actor.Props;import com.typesafe.config.ConfigFactory;
public class ClientApp {
static class ClientActor extends AbstractActor {
private final String serverActorPath;
public ClientActor(String serverActorPath) { this.serverActorPath = serverActorPath; }
@Override public void preStart() { ActorSelection serverActor = getContext().actorSelection(serverActorPath); serverActor.tell("Hello from Client", getSelf()); }
@Override public Receive createReceive() { return receiveBuilder() .match(String.class, msg -> { System.out.println("Client received message: " + msg); }) .build(); } }
public static void main(String[] args) { ActorSystem system = ActorSystem.create("RemoteSystem", ConfigFactory.load("client")); String serverPath = "akka://RemoteSystem@127.0.0.1:2552/user/serverActor"; ActorRef clientActor = system.actorOf(Props.create(ClientActor.class, serverPath), "clientActor"); System.out.println("Client is running..."); }}

以上只是一些关键代码,所有代码请参见下面代码仓库

代码仓库

  • https://github.com/Harries/springboot-demo(akka)

3.测试

  1. 启动server

  2. 启动client

  3. 产看日志

server

Server is running...Server received message: Hello from Client

client

Client is running...Client received message: Hello from Server

4.引用

  • https://doc.akka.io/docs/akka/current/remoting.html

  • https://doc.akka.io/docs/akka/current/remoting-artery.html#selecting-a-transport

  • http://www.liuhaihua.cn/archives/711361.html

相关推荐

  • 据传,阿里云盘惊现灾难级bug,可看别人隐私照片
  • 一呼百应 !!! Modbus广播这么强
  • 19.6 K Star 超级路由器 !!! 黑客开发,支持1790种设备
  • 概率、统计学在机器学习中应用:20个Python示例
  • OpenAI o1模型问世,比 GPT-4 还强!
  • 创业失败后,如何找到下一个千万级风口?对话天才搞钱女友邓怡然
  • 中秋3天,足够你用AI编程,做个赚钱小产品
  • 奇舞周刊第541期:暗水印显隐术助力生产排障提效|得物技术
  • 2024 互联网公司中秋礼盒大盘点!
  • 全球第二大成人网站OnlyFans年度收入曝光,超过硅谷AI初创公司总和
  • 甲骨文正式发布VirtualBox 7.1:采用基于Qt6的全新现代化UI、更换Logo、“古董”画风官网也彻底改版
  • Docker镜像源不再受限,开发者的极速时代现已开启!
  • 融到F轮,385亿卖了
  • 微软欲修改 Windows 内核权限,防止“蓝屏事件”重现!
  • 易用性对齐 vLLM,推理效率提升超200%,这款国产加速框架什么来头?
  • 57岁前员工怒删公司备份、搞瘫3000+台电脑,勒索532万元未遂被捕!网友:怀疑他是被裁的
  • 我一进门就看见 AI 在啪啪啪狂敲代码
  • 包装项目被面试官拆穿了!
  • 对话齐心集团于斌平:大模型将加速「数据飞轮」在企业落地
  • Docker突然宣布:涨价80%