💥 该系列属于【SpringBoot基础】专栏,如您需查看其他SpringBoot相关文章,请您点击左边的连接
目录
一、项目准备
二、拆分商品服务和购物车服务
1. 商品服务
(1)创建模块
(2)填写依赖
(3)新建包、启动类和配置文件
(4)拷贝domain, mapper, service和controller
2. 购物车服务
3. 跨服务远程调用(简单方法,不涉及负载均衡)
(1)RestTemplate
(2)远程调用
一、项目准备
准备一个单体项目黑马商城,项目名为hmall,项目结构如下:
黑马商城主要模块介绍:
二、拆分商品服务和购物车服务
1. 商品服务
(1)创建模块
点击【新建】,选择【模块】,然后添加一个名字为item-service的模块
创建成功:
(2)填写依赖
然后把hm-service的pom.xml里面的依赖<dependencies>,拷贝到item-service的pom.xml中,然后删除不需要的依赖:
(3)新建包、启动类和配置文件
新建各种包:
新建启动类:
@MapperScan("com.hmall.item.mapper")
@SpringBootApplication
public class ItemApplication {
public static void main(String[] args) {
SpringApplication.run(ItemApplication.class, args);
}
}
要扫描的mapper在com.hmall.item下。
新建配置文件:
端口号,微服务名字,数据库名字是需要改动的。
新增一个数据库hm-item:
(4)拷贝domain, mapper, service和controller
把hm-service里面的相关商品服务的业务都拷贝到item-service中:
在idea中按Alt+8启动SpringBoot的所有服务。
查看Swagger文档 :
2. 购物车服务
按照上面的拆分方法,对购物车功能进行拆分,微服务取名为cart-service,拆分结果如下:
Alt+8并运行 :
可以看见三个微服务都成功运行了。
3. 跨服务远程调用(简单方法,不涉及负载均衡)
(1)RestTemplate
Spring给我们提供了一个RestTemplate的API,可以方便的实现Http请求的发送。
先将RestTemplate注册为一个Bean:
(2)远程调用
在购物车微服务(port:8082)中,有查询该购物车中所有商品信息的功能,然而查询商品信息在另一个商品微服务(port:8081)中,因此需要跨服务远程调用。可以通过RestTemplate框架发送HTTP请求。
例如,修改cart-service
中的com.hmall.cart.service.impl.
CartServiceImpl
的handleCartItems
方法,发送http请求到item-service
,代码如下:
完整代码:
private void handleCartItems(List<CartVO> vos) {
// 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());
}
}