目录
复习
上一节我们使用gradle构建了一个多模块系统。
并且在登录服启动了Netty服务,监听config文件中配置的端口。
在client模块中使用Netty创建一个客户端连接到登录服,并且发送并接收协议。
本节内容
本节我们学习一下Actor模型。并将其应用在我们的登录服中。
我们将会为每一个连接上来的客户端生成一个actor专门用于处理该连接发送上来的请求数据。
正文
什么是Actor模型
Actor模型是一种强大的并发计算模型。
在Actor模型中,一个Actor是一个最基本的计算单元,它可以看作是一个个独立的实体,它们之间毫无关联,但是可以通过消息来通信。
一个Actor收到其他Actor的信息后,可以根据需要作出各种响应。每个Actor的数据相互隔离,使用消息传递的方式来进行并发操作,避免了多线程编程中常见的同步和共享内存问题,从而提高了程序的可靠性和可伸缩性。
使用Actor模型最好的一点在于,为Actor逻辑进行编码时,无需过多考虑多线程并发问题,因为它是通过消息驱动的且其内部数据只能由其本身进行修改,而每个Actor的消息处理是串行的,所以每个Actor内部的数据不会被并发修改。
出bug的情况较少,对新人友好,意味着可以多招新人程序员来开发以节约项目成本。
如何应用
要在java中使用Actor模型,可以使用akka的actor库进行开发。
Kilim是一个比akka更轻量化的actor库,但是社区规模相对较小。
本项目选择使用akka的actor库。
implementation group: 'com.typesafe.akka', name: 'akka-actor-typed_3', version: '2.8.5'
创建Actor基类
因为我们项目中将会有多种不同功能的actor出现,我们先定一个actor基类用于规范所有actor。
创建BaseMsg和BaseActor两个类
/**
* 消息基类 所有Actor消息的基类
*/
public class BaseMsg implements Serializable {
}
/**
* Actor基类
*/
@Slf4j
public abstract class BaseActor extends AbstractBehavior<BaseMsg> {
public BaseActor(ActorContext<BaseMsg> context) {
super(context);
}
@Override
public Receive<BaseMsg> createReceive() {
ReceiveBuilder<BaseMsg> builder = newReceiveBuilder();
builder.onMessage(BaseMsg.class, this::onBaseMsg);
return builder.build();
}
private Behavior<BaseMsg> onBaseMsg(BaseMsg msg) {
log.info("receive base msg. {}", msg.toString());
return this;
}
}
BaseActor继承与AbstractBehavior,它接收所有BaseMsg类型的消息,当收到BaseMsg消息时打印receive base msg.
创建RootActor
RootActor是一个用于初始化ActorSystem和创建其他Actor的守护Actor
public class RootActor extends BaseActor{
public RootActor(ActorContext<BaseMsg> context


1万+

被折叠的 条评论
为什么被折叠?



