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

news2024/11/27 18:48:00

 💥 该系列属于【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());
        }
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2060576.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数学生物学-1-指数增长与衰退(Exponential Growth and Decay)

我们注意到数学专业的学生往往没有生物学系统的思维&#xff0c;而生物专业的学生则常常对数学感到恐惧。许多生物专业的学生可能一直对科学感兴趣&#xff0c;部分原因是他们认为生物学是一个不需要任何数学技能或背景就可以研究的科学领域。我认为这是不对的思维。 虽然大多…

Fortify相比其他扫描工具的优势在哪里?

最新发布的 Fortify 22.1.0 版本&#xff0c;不仅能高度兼容最新的软件技术&#xff0c;同时继续保持对运营环境常见的应用安全用例的广泛兼容性。经过强化的 Fortify 进一步提升了性能、准确性、可扩展性和易用性。 无论是运行 DevSecOps、开展云计算转型&#xff0c;还是确保…

Mac移动硬盘选什么格式最好 Mac怎么用ntfs移动硬盘

在使用Mac电脑的过程中&#xff0c;很多用户可能有需要扩展存储空间的需求。选择合适的移动硬盘格式对于数据传输的效率和兼容性至关重要。本文将详细介绍Mac移动硬盘选什么格式好&#xff0c;以及Mac怎么用ntfs移动硬盘&#xff0c;帮助用户优化Mac的使用体验。 一、Mac移动硬…

【具体数学 Concrete Mathematics】1.1.2 平面上的直线

【具体数学 Concrete Mathematics】1.1.2 平面上的直线

仿照ContentLoadingProgressBar 的特点在Android项目中自定义Loading对话框

ContentLoadingProgressBar 是 Android 中的一个控件&#xff0c;继承自 ProgressBar。它在 ProgressBar 的基础上添加了一些特殊功能&#xff0c;主要用于在加载内容时显示进度。它的一些主要特点如下&#xff1a; 自动隐藏和显示&#xff1a;ContentLoadingProgressBar 会在…

引发C++程序内存泄漏的常见原因分析与排查方法总结

目录 1、概述 2、内存泄漏与程序的位数 3、调用哪些接口去动态申请内存&#xff1f; 4、引发内存泄漏的常见原因总结 4.1、通过malloc/new等动态申请的内存&#xff0c;在使用完后&#xff0c;没有调用free/delete去释放&#xff08;也可能是调用了上面讲到的HeapAlloc或V…

计算机专业大四毕业生如何在一天内完成开题报告?一招教你解锁开题报告写作技巧

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人 八年开发经验&#xff0c;擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等&#xff0c;大家有这一块的问题可以一起交流&…

SQL Server数据库 创建表,和表的增删改查

打开SQL Server工具,连接服务器 右击数据库&#xff0c;创建新的数据库 新建表 填写列&#xff0c;我添加了Id,Name,Sex,Age,和class列 右键表刷新一下就有了 我又同时创建了一个Class表 点击新建查询&#xff0c;现在写代码添加数据&#xff0c;也可以操作表来对数据进行添加 …

GEC6818开发板显示BMP格式图片

1、BMP格式图片 bmp格式图片是没有经过任何压缩过的图片,缺点是为文件尺寸比较大,不适合传播;优点是文件必须要解码器可以读出来直接使用。 虽然BMP格式文件内部存储的就是RGB数据,无需任何解码,但毕竟RGB数据是纯数据,没有任何图片尺寸、色深等具体信息,因此我们需要了…

滴滴二季度GTV达963亿元 经调整EBITA盈利13亿元

8月21日&#xff0c;滴滴在其官网发布2024年二季度业绩报告。 二季度&#xff0c;包括中国出行和国际业务在内的核心平台交易量为38.75亿单&#xff0c;较去年同期增长17.4%。其中&#xff0c;中国出行总单量为30.04亿单&#xff0c;较去年同期增长12.3%&#xff1b;国际业务总…

python爬虫--pyquery解析库整理

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文整理python的爬虫解析库pyquery的语法 简洁快速的整理&#xff0c;建议有前端基础的人看 pyquery解析原理 pyquery的原理就是拿到网站的前端源码后&#xff0c;我们根据我们需求信息所在的标签进行筛选。 选…

C语言第15篇

1.阅读下面的程序 #include<stdio.h> void main() { int i,j; i010; j9; printf("%d,%d",i-j,ij); } 则程序的运行结果是________. A) 1,19 B) -1,19 C) 1,17 D) -1,17 提示&#xff1a;八进制 2.以下程序段__________. x-1; do { xx*…

Aria2安装和使用-Mac版

起因是需要网盘下载&#xff0c;无奈限速很烦&#xff0c;查找很多方案后&#xff0c;最终决定使用Aria2 Tampermonkey。 其中Aria2是一款开源轻量的下载软件&#xff0c;简单来说就是可以通过URL直接下载。 Tampermonkey则是一款插件&#xff0c;我这里是.crx结尾的谷歌插件…

WPF调用CEF插件运行时启动CefSharp.BrowserSubprocess.exe三个进程

cefsharp.browsersubprocess.exe 是CefSharp&#xff08;一个基于Chromium的开源浏览器控件&#xff09;的一部分。这个可执行文件通常在以下情况下启动&#xff1a; 渲染进程&#xff1a;CefSharp使用多进程架构&#xff0c;类似于Chrome浏览器。cefsharp.browsersubprocess.e…

【网络】HTTPS——HTTP的安全版本

1.HTTP的问题 1、使用明文通信 HTTP协议不具备给通讯内容加密的功能&#xff0c;所有使用HTTP协议通信的请求和响应的内容无法进行加密,都是使用明文发送。由于HTTP属于TCP/IP协议族的协议&#xff0c;按照TCP/IP协议族的通讯机制&#xff0c;HTTP在整个通讯线路上都存在被窃听…

商务场合的白酒艺术,助你轻松搭建人脉

在繁忙的商务世界中&#xff0c;每一次会面都可能是开启新机遇的钥匙。而在这些重要的场合中&#xff0c;白酒不仅仅是一种饮品&#xff0c;更是一种文化的载体、一种沟通的桥梁。今天&#xff0c;就让我们一起探讨如何在商务场合中&#xff0c;通过豪迈白酒&#xff08;HOMANL…

深度好文:从《黑神话:悟空》看未来游戏趋势:高互动性、个性化与全球化

引言 在数字时代的浪潮中&#xff0c;游戏产业以其独特的魅力和无限的可能性&#xff0c;成为了全球娱乐文化的重要组成部分。随着科技的飞速发展&#xff0c;特别是高性能计算和人工智能技术的突破&#xff0c;游戏的世界变得越来越真实、细腻且富有深度。而在这股技术洪流中…

从0-1建一个webpack/vue项目,熟悉一下webpack知识点

以下配置项部分优化来自于国内直连GPT/Claude 第一步 首先整个新文件夹&#xff0c;打开终端&#xff0c;然后创建一个新目录&#xff0c;或者直接在vscode里面建个新文件夹&#xff0c;并进入该目录&#xff1b; mkdir my-vue-webpack-project第二步 进入当前目录 cd my-v…

SpringBoot项目多线程实现定时任务-只需要三步

众所周知&#xff0c;项目中需要使用定时任务发布的需求时非常常见的&#xff0c;例如&#xff1a;数据同步&#xff0c;清理垃圾文件&#xff0c;清理过期用户等需求&#xff0c;可能需要我们定时去清理数据。 但是我们如果集成xxl-job&#xff0c;Quartz&#xff0c;spring …

IPC 进程间通信方式

IPC对象(共享内存) 共享内存&#xff1a; 1.是一块&#xff0c;内核预留的空间 2.最高效的通信方式 //避免了用户空间 到 内核空间的数据拷贝 用中间那个get函数&#xff0c;就可以使key与共享内存一一对应 怎么将共享内存与进程关联起来 //step1 产生key值 ftok: 功能&am…