当前位置: 首页 > news >正文

微服务拆分-远程调用

我们在查询购物车列表的时候,它有一个需求,就是不仅仅要查出购物车当中的这些商品信息,同时还要去查到购物车当中这些商品的最新的价格和状态信息,跟购物车当中的快照进行一个对比,从而去提醒用户。

现在我们已经做了服务的拆分,购物车功能和商品服务功能分别拆分到了两个独立的微服务当中,也就是说代码上面它们是隔离开的,不仅如此,每个微服务将来还会有自己独立的数据库,数据上也是隔离开的。一旦微服务进行了拆分,数据产生了隔离,服务之间也产生了隔离,这个时候没有办法像以前那样去做本地调用了。如果要做数据查询,查别人的数据,就必须通过网络调用。

问题的关键是我们该怎么样通过java代码,从一个服务向另一个服务发起网络请求查询数据。

 @RequiredArgsConstructor 必备参数的构造函数,那么这样一来这个注解的作用其实就是给加final的成员变量生成构造函数(常量必须初始化)。

new ParameterizedTypeReference<List<ItemDTO>>() {
},

字节码泛型会擦除,但是new的对象它的泛型是还在的,这个时候就可以利用反射拿到这个对象上的这个泛型,从而就知道了我们想要的返回值类型。也就是泛型的引用利用这个对象把泛型传过去。

CollUtil.join(itemIds,",")自动把这个id集合以逗号拼接变成字符串。

 

private void handleCartItems(List<CartVO> vos) {
        //TODO 1.获取商品id
        Set<Long> itemIds = vos.stream().map(CartVO::getItemId).collect(Collectors.toSet());
        // 2.查询商品
//        List<ItemDTO> items = itemService.queryItemByIds(itemIds);
        //2.1.利用RestTemplate发起http请求,得到http的响应
        ResponseEntity<List<ItemDTO>> response = restTemplate.exchange(
                "http://localhost:8081/items?ids={ids}",
                HttpMethod.GET,
                null,
                new ParameterizedTypeReference<List<ItemDTO>>() {
                },
                Map.of("ids", CollUtil.join(itemIds,","))
        );
        //2.2解析响应
        if (!response.getStatusCode().is2xxSuccessful()){
            //查询失败,直接结束
            return;
        }
        List<ItemDTO> items = response.getBody();
        if (CollUtils.isEmpty(items)) {
            return;
        }
        // 3.转为 id 到 item的map
        Map<Long, ItemDTO> itemMap = items.stream().collect(Collectors.toMap(ItemDTO::getId, Function.identity()));
        // 4.写入vo
        for (CartVO v : vos) {
            ItemDTO item = itemMap.get(v.getItemId());
            if (item == null) {
                continue;
            }
            v.setNewPrice(item.getPrice());
            v.setStatus(item.getStatus());
            v.setStock(item.getStock());
        }
    }

 

已经实现了从购物车服务到商品服务的远程查询。

相关文章:

  • 电子学会—2024年12月青少年软件编程(图形化)级等级考试真题——猜年龄互动小游戏
  • Linux之Web控制台管理系统命令终端管理系统(保姆级)
  • 精选一百道题备赛蓝桥杯 —— 1.子串简写
  • 【AI】Deepseek本地部署探索,尝试联网搜索
  • 碰撞率降低57.4%!VLM-AD显著提升自动驾驶规划准确性,无需VLM实时推理
  • 使用 Docker 构建不同 Node 环境下的 Hexo 调试环境
  • 推荐一个好用的在线文本对比网站 - diffchecker
  • 【新手指南】pyqt可视化远程部署deepseek7B蒸馏版模型
  • 测试大语言模型在嵌入式设备部署的可能性-ollama本地部署测试
  • HTTPS加密原理详解
  • 江协科技/江科大-51单片机入门教程——P[4-1] 静态数码管显示 P[4-2] 动态数码管显示
  • Dify 本地部署教程
  • 框架基本知识总结 Day16
  • 二级Python通关秘籍:字符串操作符/函数/方法全解析与实战演练
  • Android笔记:android 6.0 TextView对state_selected失效
  • [Python爬虫系列]bilibili
  • 【js逆向】某预约票网站 (webpack技术)
  • 【OpenCV图像处理基础与OCR应用】
  • 2025-03-09 学习记录--C/C++-PTA 习题10-7 十进制转换二进制
  • Spring Boot启动流程及源码实现深度解析
  • 观察|天空之外的战场:官方叙事、新闻与社交平台中的印巴冲突
  • 巴基斯坦军方:印度导弹袭击巴首都附近空军基地
  • 沃旭能源因成本上升放弃英国海上风电项目,或损失近40亿元
  • 中俄元首今年首次面对面会谈,达成哪些新的重要共识?
  • 体坛联播|曼联热刺会师欧联杯决赛,多哈世乒赛首日赛程出炉
  • 范志毅跨界归来做青训,探索中国足球人才培养新模式