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功能:
Akka将remoting完全配置化了,使用时几乎只需要修改配置文件,除非自定义,否则不需要动一行代码。 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 = ontransport = tcpcanonical.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 {@Overridepublic 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 = ontransport = tcpcanonical.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;}@Overridepublic void preStart() {ActorSelection serverActor = getContext().actorSelection(serverActorPath);serverActor.tell("Hello from Client", getSelf());}@Overridepublic 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...");}
}
以上只是一些关键代码,所有代码请参见下面代码仓库
代码仓库
- GitHub - Harries/springboot-demo: a simple springboot demo with some components for example: redis,solr,rockmq and so on.(akka)
3.测试
- 启动server
- 启动client
- 产看日志
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
- Spring Boot集成Akka remoting快速入门Demo | Harries Blog™
相关文章:
Spring Boot集成Akka remoting快速入门Demo
1.什么是Akka remoting? Akka-Remoting一种ActorSystem之间Actor对Actor点对点的沟通协议.通过Akka-Remoting来实现一个ActorSystem中的一个Actor与另一个ActorSystem中的另一个Actor之间的沟通 Akka Remoting限制: 不支持NAT(Network Add…...
JVM 调优篇7 调优案例1-堆空间的优化解决
一 jvm优化 1.1 优化实施步骤* 1)减少使用全局变量和大对象; 2)调整新生代的大小到最合适; 3)设置老年代的大小为最合适; 4)选择合适的GC收集器; 1.2 关于GC优化原则 多数的Java应用不需要在服务器上进行GC优化࿱…...
文件格式转换:EXCEL和CSV文件格式互相转换
目录 1.EXCEl和CSV文件格式互相转换1.1首先安装所需的Python包1.2excel转换为csv代码如下:1.3csv转换为excel代码如下:由于excel文件在数学建模数据处理当中的局限性,我们通常把excel文件转换为csv文件来处理,下面是相关的代码,我直接封装成函数,你们直接调用即可,我会添…...
基于协同过滤的北京森林公园推荐---附源码74454
摘要 本论文主要论述了如何基于协同过滤开发一个北京森林公园推荐,本系统将严格按照软件开发流程进行各个阶段的工作,通过爬虫技术对北京森林公园的景点信息数据进行爬取,面向对象编程思想进行项目开发。在引言中,作者将论述北京森…...
002 JavaClent操作RabbitMQ
Java Client操作RabbitMQ 文章目录 Java Client操作RabbitMQ1.pom依赖2.连接工具类3.简单模式4.工作队列模式(work)公平调度示例 5.发布/订阅模式(fanout)交换机绑定示例代码 6.路由模式(direct)7.Topic匹配…...
lablelme标注的数据转成YOLO v8 格式
1 labelme 转 yolov8 格式 import json import cv2 import numpy as np import os def json2yolo(path):# dic{N_shaoxi:0, N_qiaoqi:1, N_qiaojie:2, N_pianyi:3, N_yiwu: 4, \# NV_shaoxi: 5, NV_qiaoqi: 6, NV_qiaojie: 7, NV_pianyi: 8, NV_yiwu: 9,\# …...
【linux】cat 命令
cat 命令是 Linux 和 Unix 系统中非常基础且常用的一个命令,它的全称是 "concatenate" 的缩写,意为“连接”或“串联”。尽管名字听起来像是专门用于连接文件的,但 cat 命令的用途远不止于此。它主要用于查看、创建、合并文件内容&…...
速通sass基础语法
速通Sass语法: sass的特点: 由于css的缺陷:无法自定义变量,不可引用,嵌套等。sass/scss/less等css预处理器产生。以sass为例,引入了变量、嵌套、运算、混入(Mixin)、继承、颜色处理、函数等诸多功能。方便…...
Vue: watch5种监听情况
目录 一.watch的性质与作用 1.watch 的性质包括: 2.watch 常用于以下场景: 二.监视ref定义的基本类型数据 三.监视ref定义的对象类型数据 四.监视reactive定义的对象类型数据 五.监视ref或reactive定义的对象类型数据中的某个属性 六.监视上述的…...
Android 车联网——汽车系统介绍(附2)
汽车系统指的是由多个模块或组件组成的系统,如发动机系统、制动系统、空调系统等,这些系统通常由多个 ECU 协同工作来完成特定的任务。 一、汽车系统 1、防抱死制动系统 ABS(Anti-lock Braking System,防抱死制动系统)是一项重要的汽车安全技术,其主要功能是在车辆紧急…...
C++ 链表
基本用法 C++提供了list容器,这是一个双向链表,能高效进行数据添加和删除。 引入头文件 #include <iostream> #include <list> // 引入list头文件 using namespace std;创建和初始化 list...
中国初创公司数量下降了98%
近年来,中国风险投资市场的风云变幻,通过IT Juzi(IT桔子)等权威数据服务提供商的透镜,得以清晰展现。数据显示,自2018年的鼎盛时期——拥有51,302家初创公司以来,这一数字在短短五年内急剧下降至…...
【SSRF漏洞】——http协议常见绕过
改变的确很难,但结果值得冒险 本文如有错误之处,还请各位师傅指正 一.ssrf概述 SSRF全称为Server-side Request Fogery,中文含义服务器端请求伪造 SSRF是一种由攻击者构造形成由目标服务端发起请求的一个安全漏洞。一般情况下,SSRF攻击的目标…...
[网络][CISCO]CISCO_华为网络设备端口镜像配置
CISCO 华为网络设备端口镜像配置大全 isco交换机通常支持2组镜像,4000系列有支持6组镜象的。支持所全端口镜像。 Cisco catylist2820 有2个菜单选项 先进入menu选项,enable port monitor 进入cli模式, en conf term interface fast0/…...
第二十五章 添加数字签名
文章目录 第二十五章 添加数字签名数字签名概述添加数字签名 第二十五章 添加数字签名 本主题介绍如何向 IRIS Web 服务和 Web 客户端发送的 SOAP 消息添加数字签名。 通常,会同时执行加密和签名。为简单起见,本主题仅介绍签名。有关结合加密和签名的信…...
GHOST重装后DEF盘数据救援指南
一、现象解析:GHOST重装后的DEF盘失踪之谜 在计算机维护的日常中,GHOST重装因其快速便捷的特点,成为众多用户解决系统问题的首选方法。然而,这一操作虽能迅速恢复系统至初始状态,却也暗藏风险,尤其是当不慎…...
使用blender快速制作metahuman面部以及身体绑定教程
【metablriger教程】使用blender一键绑定自定义角色metahuman绑定并导入UE5引擎教程_哔哩哔哩_bilibili 目前市面上的制作metahuman绑定的工具大多是maya的,metablriger是一个帮助用户快速制作metahuman绑定的blender插件,可以平替市面上已有的metahuma…...
OpenHarmony鸿蒙( Beta5.0)智能窗户通风设备开发详解
鸿蒙开发往期必看: 一分钟了解”纯血版!鸿蒙HarmonyOS Next应用开发! “非常详细的” 鸿蒙HarmonyOS Next应用开发学习路线!(从零基础入门到精通) “一杯冰美式的时间” 了解鸿蒙HarmonyOS Next应用开发路…...
pandas 将多条记录整合成一条记录,每条记录的year和month字段组成新的字段名
你可以使用 Pandas 的 pivot_table() 或 groupby() 方法,将多条记录整合成一条,并通过 year 和 month 这两个字段生成新的字段名。具体的实现方法是通过 pivot_table() 将 year 和 month 作为列标签,将其他列中的数据进行整合。 假设你的数据…...
C# 中的多线程同步:原子变量、原子操作、内存顺序和可见性
C# 中的多线程同步:原子变量、原子操作、内存顺序和可见性 引言 随着现代计算机系统的发展,多核处理器已经变得非常普遍。在这种环境下,多线程编程成为提高应用程序性能的关键技术之一。然而,多线程编程带来了新的挑战ÿ…...
wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...
git: early EOF
macOS报错: Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/.git/ remote: Enumerating objects: 2691797, done. remote: Counting objects: 100% (1760/1760), done. remote: Compressing objects: 100% (636/636…...
《Docker》架构
文章目录 架构模式单机架构应用数据分离架构应用服务器集群架构读写分离/主从分离架构冷热分离架构垂直分库架构微服务架构容器编排架构什么是容器,docker,镜像,k8s 架构模式 单机架构 单机架构其实就是应用服务器和单机服务器都部署在同一…...
