Organizations

4 results for Actor
  • 作为单机 Actor 结构目前已经实现简单的转发功能, 但是需要注意对于客户端消息来说有以下区分: 请求(request): 客户端主动推送给服务端消息包 响应(response): 服务端主动推送给客户端消息包 需要区分 长连接 和 短连接 区别, 短连接(HTTP) 要求从发起到响应必须双向(请求必须要带响应); 而长连接(TCP|UDP) 是非双向, 也就是可能只有请求而没有响应或者干脆只有响应. 我们编写的简单 Actor 虽然完成基本将客户端消息请求功能, 但是目前没有合适的响应功能, 而没有合适响应功能也就没办法实现我们之前 服务端心跳包 需求. 但是这时候不要先急着去实现, 而是要回头思考下: 为什么消息格式能够被正确转发? 消息传递 从 ActorRef<T> 得出这里面推送的消息结构是泛型, 也就是可能本身也就是 Object 对象, 而 createReceive 的回调就更加明显展示消息转化流程: public <M extends T> ReceiveBuilder<T> onMessage(final Class<M> type, final Function<M, Behavior<T>> handler) { OptionVal.Some var10000 = org.apache.pekko.util.OptionVal.Some..MODULE$; org.apache.pekko.util.OptionVal..MODULE$.None(); // 关键的转化流程, 实际上就是按照传入的动态类型转化写入匹配路由 Case var3 = new Case(type, (Predicate) null, handler); this.messageHandlers_$eq((List) this.messageHandlers().$plus$colon(var3)); return this; } 这个方法往下就能看到 class Case<BT, MT> implements Product, Serializable 转化类, 其中关键内容方法已经展示出来了:
    Java Actor Created Sun, 20 Apr 2025 19:05:30 +0800
  • 之前已经创建好第一个属于我们的 Actor 系统, 但是内部完全没有任何交互, 现在就是开始设计业务来模拟日常业务, 这里需要定义设计个 世界boss 功能. 世界boos 每分钟都会刷新血量 websocket 每10s都会推送客户端心跳包 每个新连接 websocket 都支持攻击1次, 随机返回攻击数值并扣除血量 如果结算时间到就会给在线会话推送攻击的扣除最高血量 这里就是简单的初步游戏业务功能, 这里需要设计网络运输网关层组件: <!-- 第三方依赖 --> <dependencies> <!-- 之前的其他组件 --> <!-- SpringWebSocket --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency> </dependencies> 之后就是改造 main 入口和配置全局属性: import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.web.socket.config.annotation.EnableWebSocket; /** * 游戏项目启动入口, 现在托管给 SpringBoot 来管理 * 默认启动WebSocket设置 */ @EnableWebSocket @SpringBootApplication public class FusionActorApplication { /** * 启动项目方法 * * @param args 启动方法 */ public static void main(String[] args) { SpringApplication.
    Java Actor Created Sat, 19 Apr 2025 18:53:00 +0800
  • 这里依赖以下第三方库组件来构建第一个游戏网关: lombok: 节约 GET|SET 开发流程 spring-boot: 基础依赖注入组件 logback: 更新版本日志组件, spring-boot 老版本需要覆盖避免漏洞 spring-boot-websocket: WebSocket 传输层 pekko: akka 的开源替代 actor 模型 jvm 语言其实选择比较, 按照个人喜好就行了: java: 老牌语言实现, 稳定性和兼容性最好 groovy: 动态脚本语言, 支持 jvm 的动态热更新 scala: 携带大量语法糖且高度抽象的实现编程语言语言 kotlin: JetBrains 官方直接支持, 开发效率很不错 实际上还是建议还是采用 Java 语言作为编程语言, 因为大部分商业游戏都是挂靠 Unity3d+C# 实现, 而 C# 大部分语法都是和 Java 近似, 所以有时候服务端+客户端有时候业务繁忙的时候客户互相帮忙编写. 另外还有 pekko 挂载 quickjs|lua 虚拟来做动态热更新, 这种方式也能兼容游戏客户端如果采用双端脚本的方案 在正式进入之前需要说明下服务器架构选择流程: # 1. 转发服务集群 客户端(TCP) ------| | | | ------- [(同进程) NettyTCP -> GatewaActor (startProxy) ] ------- AuthorityActor | | ----------------------------------- WorldActor | ----------------------------------- PlayerActor # 2.
    Java Actor Created Sat, 19 Apr 2025 11:53:29 +0800
  • 这里首先按照官方文档测试下编写独立功能单一的 actor, 命名为 fusion-actor 作为日常可能用到测试项目 可以不提交版本库本地测试 这里第三方库依赖如下, 按照官方文档处理: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <artifactId>fusion-actor</artifactId> <!-- 继承框架 --> <parent> <groupId>com.meteorcat.fusion</groupId> <artifactId>fusion-framework</artifactId> <version>2024.4.19-SNAPSHOT</version> </parent> <!-- 第三方依赖 --> <dependencies> <!-- Lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <!-- Actor LogBack --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> </dependency> <!-- Actor --> <dependency> <groupId>org.apache.pekko</groupId> <artifactId>pekko-actor-typed_${scala.binary.version}</artifactId> </dependency> </dependencies> <!-- 打包配置 --> <build> <plugins> <!-- 这里利用 springframework 工具打包 --> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>${spring-boot.version}</version> <configuration> <mainClass>com.meteorcat.fusion.FusionActorApplication</mainClass> <skip>false</skip> </configuration> <executions> <execution> <id>repackage</id> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project> 注意在根目录的 pom.
    Java Actor Created Sat, 19 Apr 2025 11:53:29 +0800