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

微服务拆分-远程调用

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

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

问题的关键是我们该怎么样通过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());
        }
    }

 

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


http://www.kler.cn/a/578795.html

相关文章:

  • 梯度计算中常用的矩阵微积分公式
  • 相机几何:从三维世界到二维图像的映射
  • MyBatis增删改查:静态与动态SQL语句拼接及SQL注入问题解析
  • golang dlv调试工具
  • 如何监控 Pod 的 CPU/内存使用率,prometheus+grafana
  • ②Modbus TCP转Modbus RTU/ASCII网关同步采集无需编程高速轻松组网
  • VSCode+AI编程生态实战:从环境配置到智能编码的全栈指南
  • 软考 中级软件设计师 考点知识点笔记总结 day02
  • Vite 打包后Nginx部署配置
  • QOJ9700 Ying’s Cup(拉格朗日插值优化卷积,背包,二项式反演)
  • 驱动开发系列46 - Linux 显卡KMD驱动代码分析(七)- 显存管理
  • VS Code连接服务器教程
  • 泛型、泛型上限、泛型下限、泛型通配符
  • Codeforces Round 566 (Div. 2) E. Product Oriented Recurrence 矩阵加速、欧拉降幂
  • 自然语言模型NLP :tensorflow搭建情感分析模型
  • 企业数据挖掘平台×DeepSeek强强联合,多种应用场景适用
  • 实现静态网络爬虫(入门篇)
  • 数据结构--【栈与队列】笔记
  • 计算机视觉算法实战——犯罪行为检测(主页有源码)
  • C++复试笔记(一)