Spring boot开发微信小游戏后台-websocket服务

news2025/2/23 6:57:15

        最近在做一个微信小游戏的后台,需要使用websocket与小游戏端建立连接,实时推送数据,小游戏后台是一个单体spring boot项目,管理玩家的一些基础信息和游戏配置信息,起初在这个单体项目中加入了websocket,可以做到统计实时在线数量,并由后端主动推送消息给小游戏端。

        后来发现当后台因为一些业务逻辑改动需要重新发版或业务服务出现异常需要重启时,会导致已有的websocket连接全部断开,所以决定将websocket服务独立出来,原本的业务服务与websocket服务解耦,两个服务通过http进行简单的交互。后期随着业务逻辑复杂度上升,可以考虑改用spring cloud,以微服务形式治理。

        业务服务负责:玩家登录、玩家信息管理、游戏配置管理、系统公告等业务逻辑处理。

        webscoket服务负责:创建socket连接、在线人数统计、上下线通知、公告推送、服务运行状态管理等。

玩家上下线

        两个服务间通过HTTP协议交互,在两个服务中配置对方的IP端口及接口地址,小游戏端与websocket服务建立连接时,传入玩家id,woesocket服务将玩家id与socket session本地存储,并调用业务服务对应的上线、下线接口。后台服务做相应的逻辑处理。

@Component
@ServerEndpoint("/socket/{gamerId}")
public class WebSocketServer {

    // 后台服务接口,spring 注入
    private static CallbackService callBackService;

    @Autowired
    public void setGamerService(CallbackService callBackService) {
        WebSocketServer.callBackService = callBackService;
    }

    //concurrent包的线程安全Set,用来存放每个客户端对应的WebSocketServer对象。
    private static final ConcurrentHashMap<String, GamerSessionInfo> sessionPools = new ConcurrentHashMap<>();


    //建立连接成功调用
    @OnOpen
    public void onOpen(Session session, @PathParam(value = "gamerId") String gamerId) {

        GamerSessionInfo gamerSessionInfo = new GamerSessionInfo();
        gamerSessionInfo.setGamerId(gamerId);
        gamerSessionInfo.setSession(session);
        gamerSessionInfo.setOnlineTime(new Date());

        // 本地存储session
        sessionPools.put(gamerId, gamerSessionInfo);

        // 调用后台服务的上线接口
        callBackService.onOpen(gamerId);
    }

    //关闭连接时调用
    @OnClose
    public void onClose(Session session, @PathParam(value = "gamerId") String gamerId) {
       
        // 移除本地存储session
        sessionPools.remove(gamerId);

        // 调用后台服务下线接口
        callBackService.onClose(gamerId);
    }
}

公告推送

       当业务服务需要推送消息时,调用websocket提供的消息发送http接口,传入要发送的内容,传入gamerId。

        websocket服务提供以下接口,收到后台服务对以下接口的调用后,根据本地存储的session发送消息给小游戏前端。

@RestController
@RequestMapping(value = "/api/socket-server")
public class SocketController {

    // 消息推送接口
    @PostMapping("/message/send")
    public void sendMessage(@RequestBody GamerSocketMessage gamerSocketMessage) {
        WebSocketServer.sendMessage(gamerSocketMessage.getGamerId(),gamerSocketMessage.getMessage());
    }

    // 消息群发接口
    @PostMapping("/message/broadcast")
    public void broadcastMessage(@RequestBody SocketMessage socketMessage) {
        WebSocketServer.broadcastMessage(socketMessage);
    }
}

服务器状态管理

        websocket服务本地维护一个业务服务状态标志,取值为“正常”或“异常”,小游戏前端在启动后,登录前首先连接到websocket服务,websocket服务此时自动给前端推送一条业务服务运行状态消息,若不是正常运行状态,则小游戏端提示服务正在维护,反之进入登录流程。

        状态标志更新机制如下:

        1、心跳轮询:业务服务提供一个无返回值的get接口,websocket服务轮询定时调用,每30秒调用一次,超时时间设置为3秒,若请求正常且响应状态码为200,则表示业务服务运行正常,标志位置为“正常”。反之,则将标志位置为“异常”。

        2、主动通知:websocket服务提供一个标志位修改接口,业务服务在启动和停止时,调用此修改接口,启动时修改为“正常”,停止时修改为“异常”。

使用此方式开发的微信小游戏已上线,欢迎体验~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/653102.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

spring boot+easyui粮油质量管控防伪溯源系统源码

基于物联网技术、RFID技术和RSA、PGP加密算法开发的粮油质量追溯系统 粮油安全关系千千万万消费者的健康问题。近年来&#xff0c;许多食品行业安全事故频频涌现&#xff0c;成为社会关注焦点。粮油生产加工质量管控防伪溯源系统为粮油提供从种植、生产、加工、销售等各环节的…

Linux下实现自己的printf函数

Linux下实现自己的printf函数 文章目录 Linux下实现自己的printf函数项目中的使用实现自己的printf函数 项目中的使用 /*********************************************************************** 函数名称&#xff1a; DebugPrint* 功能描述&#xff1a; 打印信息的总入口函…

Nodejs四、npm与包

零、文章目录 Nodejs四、npm与包 1、包 &#xff08;1&#xff09;包是什么 Node.js 中的第三方模块又叫做包。就像电脑和计算机指的是相同的东西&#xff0c;第三方模块和包指的是同一个概念&#xff0c;只不过叫法不同。 &#xff08;2&#xff09;包的来源 不同于 Nod…

Linux SSH PublicKey 登录

前言 ssh 远程登录密码认证的方式有 Password、Keyboard Interactive 和 Public Key 三种主要方式。 前面两种方式就是密码认证&#xff0c;含义都是一样大同小异。第三种是登录方式最安全的一种&#xff0c;也是我们常用的云服务器默认使用的一种方式。 本文就如何配置并使用…

torchvision.ops.nms实现NMS

nms原理&#xff1a; 当目标检测模型对一个目标有多个检测框时&#xff0c;需要滤掉多余的框&#xff0c;留下最接近真实目标的框。 步骤是这样的&#xff1a; 1.先把目标框初筛一波&#xff0c;比如设阈值为0.25, 把预测概率 < 0.25的目标框滤掉。 2.把 每个类别的 目标框 …

DEVONthink 3:Mac文档管理工具,知识管理app

DEVONthink Pro是一款功能强大的文档管理软件&#xff0c;它可以帮助用户高效地组织、管理和查找各种类型的文件和信息。 下面是DEVONthink Pro的主要特点介绍&#xff1a; 多功能性&#xff1a;DEVONthink Pro支持多种文件类型和数据源&#xff0c;并提供全面的搜索、分类、过…

在 ZBrush、Substance 3D Painter 和 UE5 中创作警探角色(P1)

小伙伴们大家好&#xff0c;今天瑞云渲染小编给大家分享的是自由CG艺术家Jean Zoudi创建《极乐迪斯科》的警探角色的项目花絮&#xff0c;会解释身体和服装的建模方式&#xff0c;分享角色发型和面部毛发背后的工作流程&#xff0c;也会详细介绍渲染过程。 介绍 大家好&#…

性能测试怎么做?性能测试策略配套适用场景,打通性能测试...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、常见的测试策略…

直流对数放大器

Logarithmic Amplifiers 对数放大器的应用场合 在雷达和一些其他测距的场合&#xff0c;sensor输出的信号的动态范围比较宽&#xff0c;也就是要求sensor输出的弱信号时有比较大的放大倍数&#xff0c;强的信号有较小的放大倍数&#xff0c;以保证sensor输出的信号经过放大器后…

可移动硬盘无媒体是什么意思?移动硬盘显示无媒体数据如何恢复

案例分享&#xff1a;【最近我遇到了一个麻烦&#xff0c;我的移动硬盘突然显示“无媒体”。我不知道发生了什么&#xff0c;我很担心我的硬盘中存储的大量重要数据是否还能恢复。我该怎么解决移动硬盘显示无媒体问题呢&#xff0c;求大神帮帮我吧&#xff01;&#xff01;&…

浏览器是如何实现生成HTTP消息的

我们经常会使用浏览器访问各种网站&#xff0c;获取各种信息&#xff0c;帮助解决工作生活中的问题。那你知道&#xff0c;浏览器是怎么帮助我们实现对web服务器的访问&#xff0c;并返回给我们想要的信息吗&#xff1f; 1. 浏览器生成HTTP消息 我们平时使用的浏览器有很多种&…

【强烈推荐】 十多款2023年必备国内外王炸级AI工具 (免费 精品 好用) 让你秒变神一样的装逼佬感受10倍生产力 (6) AI学习

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;web开发者、设计师、技术分享博主 &#x1f40b; 希望大家多多支持一下, 我们一起进步&#xff01;&#x1f604; &#x1f3c5; 如果文章对你有帮助的话&#xff0c;欢迎评论 &#x1f4ac;点赞&#x1…

【LLMs系列】90%chatgpt性能的小羊驼Vicuna模型学习与实战

一、前言 UC伯克利学者联手CMU、斯坦福等&#xff0c;再次推出一个全新模型70亿/130亿参数的Vicuna&#xff0c;俗称「小羊驼」&#xff08;骆马&#xff09;。小羊驼号称能达到GPT-4的90%性能 github 地址: GitHub - lm-sys/FastChat: An open platform for training, servi…

ChatGPT爆火网络背后的故事?

文章目录 前言一、ChatGPT的诞生背景二、ChatGPT的技术原理三、ChatGPT的推广策略四、ChatGPT的未来展望五、橙子送书第2期 前言 ChatGPT是一款基于人工智能技术的聊天机器人&#xff0c;它的出现引起了广泛的关注和热议。在短短的时间内&#xff0c;ChatGPT就成为了全球范围内…

实测|飞凌嵌入式OK3588-C开发板4G模组的使用与测试

本篇试用报告由发烧友 ouxiaolong提供&#xff0c;感谢ouxiaolong的支持。飞凌嵌入式会持续开展开发板有奖试用活动&#xff0c;更有京东E卡等着你&#xff01;欢迎大家的持续关注。 飞凌嵌入式OK3588-C开发板是一款性能强劲的旗舰产品&#xff0c;采用核心板底板的分体式设计…

linuxOPS系统服务_Linux下用户管理

用户概念以及基本作用 **用户&#xff1a;**指的是Linux操作系统中用于管理系统或者服务的人 一问&#xff1a;管理系统到底在管理什么&#xff1f; 答&#xff1a;Linux下一切皆文件&#xff0c;所以用户管理的是相应的文件 二问&#xff1a;如何管理文件呢&#xff1f; …

JDK、JRE、JVM三者的区别

JDK&#xff08;Java Development Kit&#xff09;&#xff1a;Java开发工具包 JRE&#xff08;Java Runtime Environment&#xff09;&#xff1a;Java运行环境 JVM&#xff08;Java Virtual Mechinal&#xff09;&#xff1a;Java虚拟机 &#xff08;1&#xff09;JDK和JRE 是…

Python海龟画图 几种基本图形

注&#xff1a;本文主要根据绘制步骤进行区分&#xff0c;实际使用时应当调节参数以绘制需要的图形。文中的步骤均为循环进行&#xff0c;循环50到100次&#xff0c;具体次数见代码示例。 1.前进小角度旋转 绘制效果如图&#xff0c;如果旋转角度为360的因数则绘制出多边形。 …

OJ Summation of Four Primes

1.题目 题目描述 Euler proved in one of his classic theorems that prime numbers are infinite in number. But can every number be expressed as a summation of four positive primes? I don’t know the answer. May be you can help!!! I want your solution to be v…

弹性盒子(display: flex)布局超全讲解|Flex 布局教程

文章目录 什么是弹性布局&#xff1f;弹性布局的特点&#xff1f;容器的属性justify-contentalign-itemsflex-directionflex-wrapflex-flowalign-contentorder属性flex-grow属性flex-shrink属性flex-basis属性flex属性align-self属性 什么是弹性布局&#xff1f; 弹性布局&…