SpringCloud | 单体商城项目拆分(微服务)
为什么要进行微服务拆分?
在平常的商城项目中,我们一般的项目结构模块都是将各种业务放在同一个项目文件夹,比如像:

用户,购物车,商品,订单,支付等业务都是放在一起,这样很容易一个文件改动造成多个文件也要变动,而且在团队项目中也不容易维护,所以可以进行微服务拆分,来解决这个问题。
怎么拆分?
从拆分目标来说,要做到:
- 高内聚:每个微服务的职责要尽量单一,包含的业务相互关联度高、完整度高。
- 低耦合:每个微服务的功能要相对独立,尽量减少对其它微服务的依赖。
从拆分方式来说,一般包含两种方式:
- 纵向拆分:按照业务模块来拆分
- 横向拆分:抽取公共服务,提高复用性
对于hmall商城项目,它分为5大模块:
- 用户模块
- 商品模块
- 购物车模块
- 订单模块
- 支付模块
我这里采用的是横向拆分,把它们公共的服务提取出来放在hm-api里面
比如在购物车模块里面,它使用到了商品模块里面的服务,

那么就可以把购物车模块里面用到的商品模块里面的服务抽取出来。
实现微服务拆分
前提:
IDEA(2021以上版本),JDK11,VMware Workstation Pro,MobaXterm
会使用docker,涉及到服务的远程调用(这里使用的是nacos注册中心)
项目架构:

hm-api:抽取出来的公共服务

用户业务
新建项目:


从原本的单体商城项目中,把用户模块的内容复制过来,如图:

这里还有很重要的是配置yaml文件
application.yaml

application-dev.yaml

application-local.yaml

在运行前,先配置一下UserApplication

连接上虚拟机,开启MySQL和nacos


一些命令:
# 设置开机自启systemctl enable docker#查看docker ps#启动数据库docker start mysql#访问nacosdocker log -f nacos
运行成功:


同理,剩下的4个业务也是这样拆分,其实公共服务就是把各个业务交织的部分,抽取出来,这样就只需要在hm-api里面去调用就可以,
并且pom.xml里面要引入这个公共服务api
<!-- hm-api--><dependency><groupId>com.heima</groupId><artifactId>hm-api</artifactId><version>1.0.0</version></dependency>
hm-api
项目结构:

client:
package com.hmall.api.client;import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.RequestParam;import java.util.List;
import java.util.Set;@FeignClient("cart-service")
public interface CartClient {@DeleteMapping("/carts")void deleteCartItemByIds(@RequestParam("ids") Set<Long> ids);
}
package com.hmall.api.client;import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.RequestParam;import java.util.List;
import java.util.Set;@FeignClient("cart-service")
public interface CartClient {@DeleteMapping("/carts")void deleteCartItemByIds(@RequestParam("ids") Set<Long> ids);
}
package com.hmall.api.client;import io.swagger.annotations.ApiImplicitParam;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PutMapping;
@FeignClient("trade-service")
public interface TradeClient {@ApiImplicitParam(name = "orderId", value = "订单id", paramType = "path")@PutMapping("/orders/{orderId}")void markOrderPaySuccess(@PathVariable("orderId") Long orderId);
}
package com.hmall.api.client;import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestParam;
@FeignClient("user-service")
public interface UserClient {@PutMapping("/users/money/deduct")public void deductMoney(@RequestParam("pw") String pw, @RequestParam("amount") Integer amount);
}
总结:
微服务架构,首先是服务化,就是将单体架构中的功能模块从单体应用中拆分出来,独立部署为多个服务。同时要满足下面的一些特点:
-
单一职责:一个微服务负责一部分业务功能,并且其核心数据不依赖于其它模块。
-
团队自治:每个微服务都有自己独立的开发、测试、发布、运维人员,团队人员规模不超过10人
-
服务自治:每个微服务都独立打包部署,访问自己独立的数据库。并且要做好服务隔离,避免对其它服务产生影响
相关文章:
SpringCloud | 单体商城项目拆分(微服务)
为什么要进行微服务拆分? 在平常的商城项目中,我们一般的项目结构模块都是将各种业务放在同一个项目文件夹,比如像: 用户,购物车,商品,订单,支付等业务都是放在一起,这样…...
uniapp 如何实现路由拦截,路由守卫
uniapp框架的全局文件:page.json全局文件,官网链接 背景: 通过封装 UniApp 的路由方法,并在封装方法中添加自定义逻辑,可以实现类似 Vue Router 的路由守卫功能。 在 UniApp 框架中,不像 Vue Router 直接支…...
人工智能算法工程师(中级)课程13-神经网络的优化与设计之梯度问题及优化与代码详解
大家好,我是微学AI,今天给大家介绍一下人工智能算法工程师(中级)课程13-神经网络的优化与设计之梯度问题及优化与代码详解。 文章目录 一、引言二、梯度问题1. 梯度爆炸梯度爆炸的概念梯度爆炸的原因梯度爆炸的解决方案 2. 梯度消失梯度消失的概念梯度…...
Qt/QML学习-ComboBox
QML学习 ComboBox例程视频讲解代码 main.qml import QtQuick 2.15 import QtQuick.Window 2.15 import QtQuick.Controls 2.15Window {width: 640height: 480visible: truetitle: qsTr("ComboBox")ComboBox {id: comboBox// 列表项数据模型model: ListModel {List…...
微服务实战系列之玩转Docker(一)
前言 话说计算机的“小型化”发展,历经了大型机、中型机直至微型机,贯穿了整个20世纪的下半叶。同样,伴随着计算机的各个发展阶段,如何做到“资源共享、资源节约”,也一直是一代又一代计算机人的不懈追求和历史使命。今…...
Java中常见的语法糖
文章目录 概览泛型增强for循环自动装箱与拆箱字符串拼接枚举类型可变参数内部类try-with-resourcesLambda表达式 概览 语法糖是指编程语言中的一种语法结构,它们并不提供新的功能,而是为了让代码更易读、更易写而设计的。语法糖使得某些常见的编程模式或…...
数据库使用SSL加密连接
简介 数据库开通SSL加密连接是确保数据传输过程中安全性的关键措施,它通过加密数据、验证服务器身份、保护敏感信息、维护数据完整性和可靠性,同时满足行业标准和法规要求,进而提升用户体验和信任度,为企业的数据安全和业务连续性…...
华为OD算法题汇总
60、计算网络信号 题目 网络信号经过传递会逐层衰减,且遇到阻隔物无法直接穿透,在此情况下需要计算某个位置的网络信号值。注意:网络信号可以绕过阻隔物 array[m][n],二维数组代表网格地图 array[i][j]0,代表i行j列是空旷位置 a…...
服务器的rabbitmq的guest账号登不进去
要配置 RabbitMQ 允许 guest 账号从非 localhost 地址登录,需要执行以下步骤: 编辑 RabbitMQ 配置文件: 打开 RabbitMQ 的配置文件,通常位于 /etc/rabbitmq/rabbitmq.conf 或者 /etc/rabbitmq/rabbitmq-env.conf。如果这些文件不存…...
决策树(ID3,C4.5,C5.0,CART算法)以及条件推理决策树R语言实现
### 10.2.1 ID3算法基本原理 ### mtcars2 <- within(mtcars[,c(cyl,vs,am,gear)], {am <- factor(am, labels c("automatic", "manual"))vs <- factor(vs, labels c("V", "S"))cyl <- ordered(cyl)gear <- ordered…...
文心一言《使用手册》,文心一言怎么用?
一、认识文心一言 (一)什么是文心一言 文心一言是百度研发的 人工智能大语言模型产品,能够通过上一句话,预测生成下一段话。 任何人都可以通过输入【指令】和文心一言进行对话互动、提出问题或要求,让文心一言高效地…...
Spring Boot集成qwen:0.5b实现对话功能
1.什么是qwen:0.5b? 模型介绍: Qwen1.5是阿里云推出的一系列大型语言模型。 Qwen是阿里云推出的一系列基于Transformer的大型语言模型,在大量数据(包括网页文本、书籍、代码等)进行了预训练。 硬件要求:…...
GreenDao实现原理
GreenDao 是一款针对 Android 平台优化的轻量级对象关系映射 (ORM) 框架,它将 Java 对象映射到 SQLite 数据库,以简化数据持久化操作。GreenDao 的主要优点包括高性能、低内存占用、易于使用以及对数据库加密的支持。 以下是基于源码的 GreenDao 实现原…...
Perl语言之数组
Perl数组可以存储多个标量,并且标量数据类型可以不同。 数组变量以开头。访问与定义格式如下: #! /usr/bin/perl arr("asdfasd",2,23.56,a); print "输出所有:arr\n"; print "arr[0]$arr[0]\n"; #输出指定下标 print…...
写材料word和PPT
一、WORD 1、写内容 2、参考GPT改:内容、逻辑结构、语句 3、查标题及其标号 4、修改格式:仿宋 、正文统一为小三,标题三号,1.5倍行距,加页码。 采用VBA代码自动修改,不知为何标题无法修改字体 Sub 插入页…...
Centos---命令详解 vi 系统服务 网络
目录 一、CentOS vi命令详解 二、CentOS系统服务命令 三、CentOS权限管理命令: 四、CentOS网络管理命令介绍: 一、CentOS vi命令详解 Vi是一款强大的文本编辑器,在CentOS中广泛使用。以下是Vi编辑器的一些常用命令: 1. 打开…...
【.NET全栈】ASP.NET开发web应用——ASP.NET中的样式、主题和母版页
文章目录 前言一、在ASP.NET中应用CSS样式1、创建CSS样式(1)内联样式(2)内部样式表(3)外部样式表 2、应用CSS样式(1)菜鸟教程-简单例子(2)菜鸟教程-用户界面&…...
[ruby on rails]部署时候产生ActiveRecord::PreparedStatementCacheExpired错误的原因及解决方法
一、问题: 有时在 Postgres 上部署 Rails 应用程序时,可能会看到 ActiveRecord::PreparedStatementCacheExpired 错误。仅当在部署中运行迁移时才会发生这种情况。发生这种情况是因为 Rails 利用 Postgres 的缓存准备语句(PreparedStatementCache)功能来…...
函数传值面试题
let a {name: aa };function fun1(a) {a []; // 这里创建了一个新的局部变量a,它是一个空数组// a.name "芜湖" }fun1(a); // 调用fun1,传入a的引用副本 console.log(a); // 输出:{ name: aa }在 JavaScript 中,当你…...
redis笔记2
redis是用c语言写的,放不频繁更新的数据(用户数据。课程数据) Redis 中,"穿透"通常指的是缓存穿透(Cache Penetration)问题,这是指一种恶意或非法请求直接绕过缓存层,直接访问数据库或…...
Triton模型服务化:构建高可用AI推理生产系统
1. 项目概述:当模型走出Jupyter,真正开始呼吸真实世界空气“From Notebook to Production: Running ML in the Real World (Part 4)”——这个标题本身就像一句暗号,专为那些在Jupyter里调通了模型、画出了漂亮ROC曲线、却在部署时被生产环境…...
XUnity Auto Translator:打破语言壁垒的Unity游戏翻译解决方案
XUnity Auto Translator:打破语言壁垒的Unity游戏翻译解决方案 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 你是否曾经因为语言障碍而错过精彩的Unity游戏?面对日文、韩文或其他…...
大模型零样本学习新突破:USP自适应提示方法原理与实践
1. 项目概述:当大模型“自学成才”成为可能作为一名长期在自然语言处理(NLP)一线摸爬滚打的从业者,我见过太多关于大语言模型(LLMs)的“神话”与“现实”之间的落差。其中最让我头疼的一个现实就是…...
告别杂乱窗口:QTTabBar如何用标签页重塑Windows文件管理体验
告别杂乱窗口:QTTabBar如何用标签页重塑Windows文件管理体验 【免费下载链接】qttabbar QTTabBar is a small tool that allows you to use tab multi label function in Windows Explorer. https://www.yuque.com/indiff/qttabbar 项目地址: https://gitcode.com…...
RAG + Agent = 王炸组合:知识增强型Agent详解
完整版合集、面试题库、项目实战,全网同名【图解 AI 系列】前几篇文章我们讲了Agent的核心能力:调用工具、记忆系统、规划能力、多Agent协作。但有一个问题一直没解决:Agent的知识从哪来? 大模型的知识是训练时学到的,…...
手把手教你把Windows虚拟内存文件pagefile.sys从C盘挪走,给SSD系统盘腾出几十G空间
彻底解放C盘空间:Windows虚拟内存文件迁移全指南 你是否遇到过这样的场景:刚装完系统时C盘还剩下大半空间,用着用着却突然弹出"磁盘空间不足"的警告?打开资源管理器一看,一个名为pagefile.sys的"巨无霸…...
Android动态调试实战:密钥提取四步法与JEB深度用法
1. 这不是“破解游戏”,而是一场对Android应用安全边界的系统性测绘你有没有遇到过这样的情况:一个内部工具APK,文档里写着“密钥已硬编码在so中”,但反编译Java层完全找不到明文;或者某SDK的初始化方法里反复调用getS…...
BBEdit 16 正式发布!新增百多项功能,部分用户可免费升级
产品 产品 BBEdit Yojimbo iPad 版 Yojimbo TextWrangler 支持 支持 BBEdit Yojimbo iPad 版 Yojimbo TextWrangler 产品下载 找回序列号 SDK 与开发者信息 公司书架 商店 商店 购物车 许可协议 Mac App Store 常见问题 销售政策 查找经销商 多用户许可证 联系我们 联系我们 找…...
毫米波混合波束成形技术在VR中的应用与优化
1. 毫米波VR中的混合波束成形技术解析在无线VR应用中,用户对低延迟和高带宽的需求日益增长。传统Wi-Fi标准在密集环境下难以满足这些QoS要求,而毫米波技术凭借其高传输速率和低延迟特性成为理想选择。本文将深入探讨毫米波频段下混合波束成形技术的实现原…...
JWT权限治理:从无状态凭证到可管控权限单元
1. 这不是又一个“登录后跳转首页”的玩具项目JWT在Java Web权限控制里被讲烂了,但绝大多数人写的所谓“基于JWT的系统”,其实连Token刷新都靠前端定时重登,后端连黑名单都没建,更别提并发登出、设备绑定、权限粒度动态变更这些真…...
