SpringBoot:将单体项目拆分成微服务项目

 💥 该系列属于【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.CartServiceImplhandleCartItems方法,发送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());
        }
    }

  • 20
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值