微服务-匹配逻辑细化

bankend部分 与client进行websocket连接 接收到client相应的matching请求 又onmessage分配给startmatching函数执行 匹配逻辑交给微服务处理 使用restTemplate连接匹配服务 将用户信息加入匹配池 本质还是http请求 对加入匹配池的用户进行增删操作

image-5d4ee588

在匹配服务端仍使用getmapper、postmapper等接收信息

匹配服务端使用多线程的形式 异步处理这类生产者消费者模型的调度

基于分数(权值)和等待时间 进行调度

匹配服务器开启时 就一直在尝试进行匹配 如果得到两个符合条件的

同样使用restTemplate将结果传回bankend

bankend同样使用getmapper、postmapper处理信息

将匹配结果返回给前端

image-e1e58f26

基本逻辑得到了实现 不足之处在于 没能实现仅本地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有操作, 需要加锁
    @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-微服务-匹配逻辑细化 | ➡️ 项目上线