目录

微服务拆分-远程调用

目录

微服务拆分-远程调用

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

https://i-blog.csdnimg.cn/direct/f39449d3b3e443f9b3a457c2d7e786c1.png

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

https://i-blog.csdnimg.cn/direct/0a7b927346614020a9e3bd62afe324df.png

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

https://i-blog.csdnimg.cn/direct/8b530e34722c4b53bbf376b4e0f34f81.png

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

new ParameterizedTypeReference<List>() {

},

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

CollUtil.join(itemIds,",")自动把这个id集合以逗号拼接变成字符串。 https://i-blog.csdnimg.cn/direct/b69b6a9a44524d10b726d5a103ae2c63.png

https://i-blog.csdnimg.cn/direct/ba95d79bb3294f3e89d2f7eb844eb0fb.png

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());
        }
    }

https://i-blog.csdnimg.cn/direct/580e2552cf4a4d82a0cc53bf2d0897a9.png

https://i-blog.csdnimg.cn/direct/77499fc80a9541bf899010beac4eb7c3.png

https://i-blog.csdnimg.cn/direct/5d5e31ec7f8b4561b72bb6c3707b314a.png

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