微服务拆分-远程调用

server/2025/3/10 21:59:28/

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

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

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

 

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


http://www.ppmy.cn/server/174028.html

相关文章

IDE集成开发环境MyEclipse中安装SVN

打开Myeclipse的help菜单----install from site 点击add弹出对话框 在输入框中输入对应内容 http://subclipse.tigris.org/update_1.10.x 点击OK之后&#xff0c;会刷新出两个选项&#xff0c;需要选中的 点击next&#xff0c;出现许可的时候选中同意&#xff0c;一直结束等…

自然语言处理:高斯混合模型

介绍 大家好&#xff0c;博主又来给大家分享知识了&#xff0c;今天给大家分享的内容是自然语言处理中的高斯混合模型。 在自然语言处理这个充满挑战与机遇的领域&#xff0c;我们常常面临海量且复杂的文本数据。如何从这些数据中挖掘出有价值的信息&#xff0c;对文本进行有…

Linux 基础---重定向命令(>、>>)、echo

重定向命令 关于重定向使用的最多就是输出重定向&#xff1a;修改输出数据的位置&#xff0c;通过重定向操作可以非常方便的进行文件的复制&#xff0c;或者文件内容的追加 > &#xff1a;将文件内容写入到指定文件中&#xff0c;如果文件中已有数据&#xff0c;则会使用新…

2025-03-09 学习记录--C/C++-PTA 习题10-8 递归实现顺序输出整数

合抱之木&#xff0c;生于毫末&#xff1b;九层之台&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; 一、题目描述 ⭐️ 裁判测试程序样例&#xff1a; #include <stdio.h>void printdigits( int n );int main() {int n;sca…

linux下 安装rime输入法后使用Rime-ICE配置自定义词库

Rime-ICE&#xff08;「冰海」&#xff09;是一个由 iDvel 维护的 Rime 输入方案&#xff0c;提供更强的词库、简繁优化、双拼支持&#xff0c;并且对现代汉语输入体验做了大量优化。如果你已经在 Linux 上安装了 Rime&#xff08;如 fcitx5-rime&#xff09;&#xff0c;那么可…

探秘 C++:从基础语法到复杂项目实践的全攻略(一)

目录 C 是什么 搭建开发环境 常见的 IDE 介绍 安装步骤与简单配置 创建和运行 C 项目 基础语法入门 变量与数据类型 运算符与表达式 控制结构 C 是什么 C 是一种强大的编程语言&#xff0c;它的历史可以追溯到 20 世纪 70 年代末。当时&#xff0c;计算机科学家比雅尼…

Git与GitHub:理解两者差异及其关系

目录 Git与GitHub&#xff1a;理解两者差异及其关系Git&#xff1a;分布式版本控制系统概述主要特点 GitHub&#xff1a;基于Web的托管服务概述主要特点 Git和GitHub如何互补关系现代开发工作流 结论 Git与GitHub&#xff1a;理解两者差异及其关系 Git&#xff1a;分布式版本控…

vulnhub靶场之【digitalworld.local系列】的snakeoil靶机

前言 靶机&#xff1a;digitalworld.local-snakeoil&#xff0c;IP地址为192.168.10.11 攻击&#xff1a;kali&#xff0c;IP地址为192.168.10.6 kali采用VMware虚拟机&#xff0c;靶机选择使用VMware打开文件&#xff0c;都选择桥接网络 这里官方给的有两种方式&#xff0…