Organizations

56 results for Java
  • 这里首先按照官方文档测试下编写独立功能单一的 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
  • Akka Actor服务 这里按照官方说明直接采用多项目 Maven + JDK17 设置, 基础的父根目录框架名为 fusion-framework 需要注意其实还有热更新方案等考虑, 但是这里基于 websocket 对于服务热更要求不高所以直接跳过 另外还需要注意: akka 在 2.6.x 之后的版本转向闭源付费, 仅允许在开发和非生产系统中免费使用, 如果为了规避商业行为清尽量采用 2.6.x 版本二次开发. 或者采用后续开源版本: Pekko <?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.meteorcat.fusion</groupId> <artifactId>fusion-framework</artifactId> <version>1.0-SNAPSHOT</version> <packaging>pom</packaging> <!-- 全局属性 --> <properties> <java.version>17</java.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <spring-boot.version>3.3.10</spring-boot.version> <maven-compiler.version>3.13.0</maven-compiler.version> <lombok.version>1.18.36</lombok.version> <!-- 2023.0.x 又名 Leyton SpringBoot 3.3.x, 3.2.x --> <spring-cloud.version>2023.0.2</spring-cloud.version> <!-- akka3 Actor --> <akka3.version>2.6.21</akka3.version> <scala.binary.version>2.13</scala.binary.version> <logback.version>1.5.18</logback.version> </properties> <!-- 子模块定义 --> <modules> <module>fusion-actor</module> <!-- Actor集群项目 --> </modules> <!
    Java 部署 Created Thu, 17 Apr 2025 22:29:39 +0800
  • 微服务API网关设计 当项目负载规模不大的时候, 基本上单个项目 http://域名/user 和 http://域名/pay 这样访问API就行了, 在之后如果项目规模开始上来最多用 nginx 负载均衡处理一下分流到不同服务器, 但是后续功能业务和流量大规模上来之后也会到达瓶颈. 按照业务程度分布起始就这以下阶段: 简单实现基础 api 功能, 业务功能比较少且接口简单 流量上来需要对请求限流和负载均衡, 与此同时业务接口还是在可控可维护范围 不止接口流量庞大, 同时业务也规模上去(用户模块,订单模块,统计模块,广告模块,….将近上千多个), 这时候单项目维护就很麻烦了 当超大流量的情况把功能集中在单个项目里面, 哪怕按照目录区分(/user,/pay,/activity,...) 也是很耗费精力的事, 所以需要做模块拆分. 拆分出来之后很可能内部不同地址需要统一的网关服务器, 网关负责接收外部请求统一入口并协调转发到内网服务. 对于内网来说就是编写模块下业务并且注册到网关提供服务, 这样的好处就是隔离不同业务服务并且支持热更, 如果某个服务请求过大卡住的时候不会直接影响到其他服务, 只要不是同个模块下的服务都互不影响从而方便开发针对业务调试. 这里也引申出微架构的主要结构: 网关 和 模块 网关负责模块的服务注册和转发, 利用 eureka 可以更加方便做服务注册中心来处理服务重连等情况 模块就是具体业务分层, 启动的时候注册到网关来暴露自己的业务功能, 利用 springCloud 可以直接无缝接入到 eureka 以下方案也是直接采用 eureka 和 springCloud, 同时最低Java版本为17 配置多模块 直接在项目目录下追加 pom.xml, 文件内容如下: <?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.meteorcat.fusion</groupId> <artifactId>micro</artifactId> <version>1.0-SNAPSHOT</version> <packaging>pom</packaging> <!-- 全局属性 --> <properties> <java.
    Java 部署 Created Fri, 28 Mar 2025 23:48:33 +0800
  • JPA-DataRedis多数据源切换 这里主要基于 SpringBoot 目前的 spring-boot-starter-data-redis Redis Repositories 依赖. 日常项目使用当中可能不止有单个 Redis, 有时候需要切换多个 Redis 方便读写数据, 这里目前网上数据比较少所以总结下. 首先就是引入目前组件依赖: <!-- Redis --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> 引入比较简单, 后续关键就是编写配置项, 这里就是相对比较复杂的阶段, 首先是定义 application.properties 内部配置: # ===================================== # Redis中心库 # ===================================== spring.data.redis.center.host=192.168.1.110 spring.data.redis.center.port=6379 spring.data.redis.center.password=redis2024 spring.data.redis.center.database=0 # ===================================== # Redis会话库 # ===================================== spring.data.redis.session.host=192.168.1.100 spring.data.redis.session.port=6379 spring.data.redis.session.password=redis2024 spring.data.redis.session.database=1 这两个就是不同库对象和连接, 之后就是加载具体配置备用: /** * 数据库多库配置, 这里编写集成数据库相关配置 */ @Configuration public class DataSourceConfig { /** * 注意: * 1.必须要利用 @Primary 指定默认数据库主库, 其他配置默认都为从库不需要配置该注解 * 2.@Bean最好手动声明指定全局配置数据源名称,也就是指定 name 配置 * 3.
    Java Created Sat, 28 Dec 2024 23:53:58 +0800
  • 全局动态数据 这里主要涉及到 SpringBoot 授权对话基于认证规范该怎么全局获取到玩家信息实体. 通用HTTP授权规范 一般授权完成授权之后会以 Header 形式追加以下格式结构: Authorization: <type> <credentials> type 字段包含有: Basic: 基本明文账号密码之后base64编码 Bearer: OAuth|JWT 授权机制, 目前最常见 ….., 其他可以自行了解 可以按照自身需求构建 JWT 或者直接采用唯一哈希对应放置在 Redis 关联即可, 用户重新登录会去 Redis 注销上一次的 token 映射. 言归正传就是当登录完全通过 HandlerInterceptor 检索出来 Token 在数据库|Redis查询到对应数据实体之后怎么让全局被访问. 网上很多说采用 ThreadLocal 直接线程本地变量保存, 这样其实最大问题是内部出现 Exception 会导致内存没办法回收, 最后到达一定量及就会出现大量内存泄露. 另外设置和释放都需要手动进行分配和注销, 比如在 HandlerInterceptor 当中: public class HandlerInterceptorConfigurer implements HandlerInterceptor { private static final ThreadLocal<UserModel> USER = new ThreadLocal<>(); /** * 请求拦截 */ @Override public boolean preHandle(@NonNull HttpServletRequest request, @NonNull HttpServletResponse response, @NonNull Object handler) throws Exception { User.
    Java Created Sat, 28 Dec 2024 14:23:01 +0800
  • JPA多数据源配置 Java 的 JPA ORM 框架默认单数据处理, 也就是假设数据库当中有 admin|app|business 这个不同区域数据库的时候就需要自己处理好相关多数据源配置. 这种情况是十分常见的, 在高并发负载的情况下业务会拆分到多个数据源的数据库来暴露给内网服务机连接 首先需要编写 application.properties 配置文件, 改写原来的配置: # 其他略 #================================================================ # Admin库, 注意这里采用 jdbc-url 而不是单纯的 url 配置, 并且采用 MariaDB 驱动而非 MySQL spring.datasource.admin.driver-class-name=org.mariadb.jdbc.Driver spring.datasource.admin.jdbc-url=jdbc:mariadb://127.0.0.1:3306/admin?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=UTC spring.datasource.admin.username=admin spring.datasource.admin.password=admin # App库 spring.datasource.app.driver-class-name=org.mariadb.jdbc.Driver spring.datasource.app.jdbc-url=jdbc:mariadb://127.0.0.1:3306/app?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=UTC spring.datasource.app.username=app spring.datasource.app.password=app # hikari配置 spring.datasource.type=com.zaxxer.hikari.HikariDataSource spring.datasource.hikari.maximum-pool-size=2 spring.datasource.hikari.connection-test-query=SELECT 1 #================================================================ 需要说明如果采用多数据源配置, 应该采用 spring.datasource.数据源KEY标识.driver-class-name 格式来处理, 另外需要注意 spring.datasource.数据源KEY标识.jdbc-url 这个配置采用的是 jdbc-url 而不是 url. 现在就是编写将这些配置注入到 IOC 容器当中配置: package com.meteorcat.sdk.orange.config; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.jdbc.DataSourceBuilder; import org.springframework.context.annotation.Bean; import org.
    Java Created Thu, 31 Oct 2024 22:13:21 +0800
  • H5游戏服务端(十) 到了这里基本上可以回过头总结游戏开发基本流程, 后续如果采用 skyent|netty 等网络框架开发基本上都能了解. 主要是 Actor 机制实现和异步数据对接的情况, 如果对内存有强需求可以自己从 C 裸写集成 lua|python 业务脚本, 而对开发工具链和开发效率有要求可以采用 netty 自己研究 Java 游戏服务端相关系列. 而对于传输协议 H5 相关不需要对游戏服务端进行数据封包|解包操作, 所以只需要确认数据就行了; 而 TCP 数据传输之流则需要自定义封包协议, 虽然 TCP 数据是流没有 粘包 问题, 但还是需要对流进行切分: # 将数据以二进制数据流编码 # [ value(int32) ] [ length(int32) ] [ data(byte[]) ] # 采用单个int32字节 采用单个int32字节 二进制数据 # 标识转发的协议id 标识后续二进制长度 具体传输的数据 TCP 传输就像绳子一样, 把获取玩家数据比喻成 ‘切绳子’, 你需要多条 3 米的绳子必然是从 1-3(1,2,3),4-6(4,5,6) 开始切: # 以下为伪代码 # 假设 SOCKET 获取到数据: var socket = socket(); # 首先读取首位 int, 用来判断是否存在该协议号 var value = socket.
    H5游戏服务端 Java Created Tue, 20 Feb 2024 18:15:13 +0800
  • H5游戏服务端(九) 到了这个章节的时候基本已经能够满足网络游戏的需求, 后续就是客户端和策划案的准备不是技术能够主导了, 所以这篇章当作杂谈处理. 相比独立游戏来说, 网络游戏更加推崇分工合作来各司其职, 因为本身之前介绍过涉及方方面面: 运营 运维 策划 客户端 SDK 哪怕是多面手也只能勉强满足以上需求对接, 所以这时候涉足游戏界面开发就比较力不从心. 在兼顾游戏服务端的同时参与游戏客户端开发, 这里工作重点权重分配很难把控 其实大部分服务端都不参与游戏玩法|美术决策, 所以基本上如果想要了解游戏美术设计到玩法落地可能要失望, 这里并不会牵涉到美术玩法相关系列; 美术和玩法才是最贴近玩家的交互, 而服务端则是保证在线游玩的体验, 两者对应方向需要区分. 如果抱着想直接设计游戏美术交互方向参与游戏服务端开发, 可能很快就会意识到 ‘参与游戏开发’ 和理想当中有很大差距 AI兴起 这个是和朋友讨论过关于 AI美术(AI Art) 在游戏应用, 感觉在具体应用方向未来可期 像是在策划方面现在都会先做个初版游戏玩法, 可能是对 活动|玩法 等元素做关键词提取后生成初版 UI 的 Demo, 然后可以给美术参考探讨研究; 这种方式大大加快策划和美术对接效率, 不像以前都要策划每次需要和美术沟通浪费时间. 像是之前网上所说的需求 ‘五彩斑斓的黑’ 这种抽象需求, 可以让策划让 AI 美术生成参考稿之后告诉美术需求方向参考 在简单需求方向上 AI 也给出了不错思考方向, 这也是比较看好的一点; 后续也开始出现 AI 的建模方式, 虽然目前还是难堪大任但还是未来可期. 哪怕是在服务端上面也可以提供代码参考和概念解析等方式, 在某些知识点忘记的时候可以帮助回顾和梳理. 相比有些人对于 AI 的排斥上, 我觉得要更快去掌握了解才能应对 AI 时代浪潮的冲击
    H5游戏服务端 Java Created Sun, 04 Feb 2024 00:00:42 +0800
  • H5游戏服务端(八) 结合之前的篇章, 目前已经实现: 网络数据传输 Actor处理模式 数据库异步落地 策划Excel对接 客户端协议对接 网络状态同步和帧同步 Linux系统( 需要分析游戏规模和架构部署游戏服务端, 必须学习项 ) 这里还需要补上最后关于 运营 的部分, 最基本上需要实现以下功能: 给玩家发送资源: 玩家直接发放补偿资源 给单人|全体玩家发送邮件: 玩家单独|全服补偿推送 更新上架|下架活动: 游戏内部活动通知和结束发放 单个|全体玩家下线处理: 游戏维护将玩家下线处理 这里有很多方法处理, 如果但是这里我倾向采用的是 Redis 内存数据库处理, 然后生成单个 Actor 来监听以上相关对运营服务, 这里先引入类库处理: <!-- Redis 数据库组件 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> 配置好 application.properties 的连接配置, 这里不需要采用 redis.lettuce.pool 连接池处理: # Redis 数据库配置 spring.data.redis.host = 127.0.0.1 spring.data.redis.port = 6379 # spring.data.redis.password=xxx # 密码设置 spring.data.redis.database = 2 最后挂起 Actor 服务来监听: /** * 运营商业指令 */ @EnableActor(owner = BusinessLogic.
    H5游戏服务端 Java Created Thu, 01 Feb 2024 22:14:59 +0800
  • H5游戏服务端(七) 之前大概粗略处理了策划与客户端的基本对接流程, 回顾下基本流程: 客户端对接: 主要针对协议数据格式推送 策划对接: 主要针对 excel 导出 json 共享 初期这样配置就差不多打通 服务端 - 客户端 - 策划 三端的联调功能, 之后就可以准备以此当网络框架进行网络游戏开发. 这时候你也对 postman 直接调试开始感觉都厌烦了, 没有 GUI 所见即所得从而对开发兴致一下子降低了, 所以这时候需要提振自己信心. 这里可以考虑去找些开源的单机游戏仿品改造成在线版本, 从而测试下功能可行性并且学习下客户端方面的处理方式从而在服务端构建需求时候加入客户端理解. 推荐B站UP主 Hi小胡 做的 土豆兄弟样例 采用 Godot 内部已基本上已经实现具体的客户端相关所有功能, 剩下具体就是需要自己去补充或者挂载在服务端实现逻辑. 直接拉取源码测试下( 注意 Godot 切换成 兼容模式 ): git clone https://gitee.com/hi_xiaohu/brotato-like-teach.git 如果对于 Godot 客户端有兴趣可以去学习怎么构建项目, 这里作为补充附加功能补充, 客户端目前已经完成以下 Scene 功能: bg_map/bg_map.tscn: 游戏战斗界面 ui/game_ui.tscn: 游戏GUI界面 scenes/scene_update/scene_update_tscn: 关卡更新界面 但是在开始之前, 有些概念必须要清楚才能进行有效开发. 游戏同步 先说明下游戏的同步机制方式: 帧同步: 把客户端的 update|_process 之类的更新方法移交到服务端定时执行, 运算全部在服务端执行并返回. 状态同步: 把客户端负责全部运算, 最后场景|关卡结果已经确定, 服务端只需要负责最后结算验证写入玩家信息.
    H5游戏服务端 Java Created Tue, 30 Jan 2024 13:49:55 +0800