我們在查詢購物車列表的時候,它有一個需求,就是不僅僅要查出購物車當中的這些商品信息,同時還要去查到購物車當中這些商品的最新的價格和狀態信息,跟購物車當中的快照進行一個對比,從而去提醒用戶。
現在我們已經做了服務的拆分,購物車功能和商品服務功能分別拆分到了兩個獨立的微服務當中,也就是說代碼上面它們是隔離開的,不僅如此,每個微服務將來還會有自己獨立的數據庫,數據上也是隔離開的。一旦微服務進行了拆分,數據產生了隔離,服務之間也產生了隔離,這個時候沒有辦法像以前那樣去做本地調用了。如果要做數據查詢,查別人的數據,就必須通過網絡調用。
問題的關鍵是我們該怎么樣通過java代碼,從一個服務向另一個服務發起網絡請求查詢數據。
?@RequiredArgsConstructor 必備參數的構造函數,那么這樣一來這個注解的作用其實就是給加final的成員變量生成構造函數(常量必須初始化)。
new ParameterizedTypeReference<List<ItemDTO>>() {
},
字節碼泛型會擦除,但是new的對象它的泛型是還在的,這個時候就可以利用反射拿到這個對象上的這個泛型,從而就知道了我們想要的返回值類型。也就是泛型的引用利用這個對象把泛型傳過去。
CollUtil.join(itemIds,",")自動把這個id集合以逗號拼接變成字符串。
?
private void handleCartItems(List<CartVO> vos) {//TODO 1.獲取商品idSet<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的mapMap<Long, ItemDTO> itemMap = items.stream().collect(Collectors.toMap(ItemDTO::getId, Function.identity()));// 4.寫入vofor (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());}}
?
已經實現了從購物車服務到商品服務的遠程查詢。