--- title: "08-微服务-匹配逻辑细化" created: 2025-12-02 tags: - 项目 aliases: - 微服务-匹配逻辑细化 --- # 微服务-匹配逻辑细化 bankend部分 与client进行websocket连接 接收到client相应的matching请求 又onmessage分配给startmatching函数执行 匹配逻辑交给微服务处理 使用restTemplate连接匹配服务 将用户信息加入匹配池 本质还是http请求 对加入匹配池的用户进行增删操作 ![[image-5d4ee588.png]] 在匹配服务端仍使用getmapper、postmapper等接收信息 匹配服务端使用多线程的形式 异步处理这类生产者消费者模型的调度 基于分数(权值)和等待时间 进行调度 匹配服务器开启时 就一直在尝试进行匹配 如果得到两个符合条件的 同样使用restTemplate将结果传回bankend bankend同样使用getmapper、postmapper处理信息 将匹配结果返回给前端 ![[image-e1e58f26.png]] 基本逻辑得到了实现 不足之处在于 没能实现仅本地127.0.0.1可访问的鉴权 当前版本的security 弃用access+正则表达式也没能成功 索性不添加security依赖 或许这个可以等部署后 在云服务器上 利用安全组的方式实现? - 创建匹配池 - 包含参数 - players: `池中的玩家` - lock : `3000服务会通过路由向匹配池添加/删除玩家, 匹配池中也会对玩家进程读写操作, 所以需要加锁控制` - RestTemplate : `发送请求需要的类` - 添加addPlayer, removePlayer方法 : `使用lock.lock try{ .. }finally{lock.unlock} 控制` - 实现匹配策略: `通过分值 + 时间匹配, 每增加一秒分值差距提升10` - increaseWaitingTime : `增加所有人的等待时间` - matchPlayers: `匹配玩家` - 匹配池run函数 - while(true) + sleep(1000): `实现每隔一秒匹配一次` - lock.lock : `increaseWaitingTime与matchPlayers都对player有操作, 需要加锁` ```java @Override public void run() { while (true) { try { Thread.sleep(1000); lock.lock(); try { increaseWaitingTime(); matchPlayers(); } finally { lock.unlock(); } } catch (InterruptedException e) { e.printStackTrace(); break; } } } ``` - MatchSystem添加API: `addPlayer与removePlayer`供3000服务添加与移除匹配玩家 - 3000服务接收匹配系统匹配玩家信息 ```java public String startGame(Integer aId, Integer aBotId, Integer bId, Integer bBotId) { System.out.println("start game: " + aId + " " + bId); WebSocketServer.startGame(aId, aBotId, bId, bBotId); return "start game success"; } ``` --- **项目分区导航**: [[07-bot代码执行 排行榜页面|bot代码执行 排行榜页面]] ⬅️ | 08-微服务-匹配逻辑细化 | ➡️ [[00-项目上线|项目上线]]