实现微服务:匹配系统

HTTP与WebSocket协议

  1. HTTP协议是无状态的,每次请求都是独立的,服务器不会保存客户端的状态信息。而WebSocket协议是有状态的,一旦建立连接后,服务器和客户端可以进行双向通信,并且可以保持连接状态,服务器可以主动向客户端发送消息。

  2. HTTP协议是基于请求-响应模式的,客户端发送请求,服务器返回响应。而WebSocket协议是全双工通信,双方都可以主动发送消息。

  3. HTTP协议默认使用TCP协议进行通信,每次请求都需要建立和关闭TCP连接,而WebSocket协议在建立连接后,可以通过保持连接状态,避免了多次建立和关闭连接的开销,减少了网络传输的延迟。

  4. HTTP协议使用标准的HTTP端口(默认80端口),而WebSocket协议使用的是非标准的WebSocket端口(默认为80或443)。

  5. HTTP协议的通信是通过HTTP头部和请求体来传递数据,而WebSocket协议可以直接传输原始数据,减少了通信的开销。

总而言之,HTTP协议适用于客户端发送请求,服务器返回响应的场景,而WebSocket协议适用于需要实时双向通信的场景,如聊天应用、实时游戏等。

建立前后端WebSocket协议通信

  1. 集成WebSocket

在pom.xml文件中添加依赖:

spring-boot-starter-websocket

XML 复制代码
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-websocket -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
    <version>3.2.3</version>
</dependency>

前后端的通信

fastjson

XML 复制代码
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>2.0.47</version>
</dependency>

添加config.WebSocketConfig配置类:

java 复制代码
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;

@Configuration
public class WebSocketConfig {

    @Bean
    public ServerEndpointExporter serverEndpointExporter() {

        return new ServerEndpointExporter();
    }
}
添加consumer.WebSocketServer类
import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;

@Component
@ServerEndpoint("/websocket/{token}")  // 注意不要以'/'结尾
public class WebSocketServer {
    @OnOpen
    public void onOpen(Session session, @PathParam("token") String token) {
        // 建立连接
    }

    @OnClose
    public void onClose() {
        // 关闭链接
    }

    @OnMessage
    public void onMessage(String message, Session session) {
        // 从Client接收消息
    }

    @OnError
    public void onError(Session session, Throwable error) {
        error.printStackTrace();
    }
}

配置config.SecurityConfig

java 复制代码
@Override
public void configure(WebSecurity web) throws Exception {
    web.ignoring().antMatchers("/websocket/**");
}

如果在卸载的时候没有断掉链接的话,每一次打开都会建立一个额外的链接

验证jwt

实现对战前端界面

对手图片:https://cdn.acwing.com/media/article/image/2022/08/09/1_1db2488f17-anonymous.png

云端生成地图

在数据库中创建表record

record表用来记录每局对战的信息

表中的列:

id: int

a_id: int

a_sx: int

a_sy: int

b_id: int

b_sx: int

b_sy: int

a_steps: varchar(1000)

b_steps: varchar(1000)

map: varchar(1000)

loser: varchar(10)

createtime: datetime

实现微服务

thrift----socket

SpringCloud----http

matchingsystem收到请求后:

将所有用户放到匹配池中(数组),开一个额外的新线程,每隔1秒钟扫描一遍数组,将能够匹配的人匹配到一起,匹配两名分值接近的玩家,随着时间推移允许的分差可以越来越大

相关推荐
梦想的颜色16 分钟前
DeepSeek‑Harness 插件系统源码级拆解:热插拔、自动装卸原理与自研 Web 插件架构落地指南
架构·deepseekharness·cordis内核·可插拔架构·web框架自研·后端架构设计·插件系统源码
这个DBA有点耶1 小时前
数据库迁移灰度验证:从读流量到双写再到全量切换的完整路径
数据库·mysql·架构
数据技术说2 小时前
MySQL 和 PostgreSQL 的 CDC 方案到底有什么区别?
数据库·架构
两万五千个小时3 小时前
DeepSeek Harness 从 0 开始:08 Compaction 模块(上下文压缩)
人工智能·程序员·架构
得物技术3 小时前
EP-Harness:从个人 AI Coding 到团队级 Agent 工作流|得物技术
后端·程序员·架构
heimeiyingwang3 小时前
【架构实战】可观测性三支柱实战:Metrics、Logging、Tracing 如何统一落地
开发语言·架构·php
Jucai_in_AI3 小时前
企业培训场景下的个性化课程推荐系统设计与实现:混合推荐架构的工程实践
架构
有脚就行4 小时前
第33篇-KServe推理平台-标准化的K8s推理服务管理
人工智能·云原生·容器·kubernetes
代码方舟4 小时前
零信任架构实战:基于天远企业年报信息核验构建自动化高并发尽调网关
运维·人工智能·架构·自动化