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