当前位置: 首页 > article >正文

【从零开始学习微服务 | 第一篇】单体项目到微服务拆分实践

目录

引言

一、选择聚合结构进行拆分的优势

二、微服务模块创建步骤

(一)引入 pom 文件与修改

(二)创建 Spring Boot 启动类

(三)搭建基本包结构

三、配置文件的引入与调整

四、业务代码的引入与注意事项

(一)引入 domain 包实体类

(二)迁移 mapper 文件

(三)调整 service 层代码

(四)引入 controller 层代码

五、实践感悟


引言

这是我在学习springcloud的过程中进行项目拆分的一点点小感悟,因为觉得有意义所以就上传了,希望大家看到后可以有不同的感受,仅此


一、选择聚合结构进行拆分的优势

如果一开始是一个单体项目的话我们可以使用聚合结构,就在单体架构的项目结构下去拆分,这项不仅我们可以很方便的去引入我们的pom文件,还可以继承我们的父pom文件配置,而且还可以很方便我们去copy我们这个微服务项目下的业务代码。

二、微服务模块创建步骤

(一)引入 pom 文件与修改

在父project工程下创建module来引入微服务。首先要做的就是引入pom文件。由于微服务追求高内聚低耦合,所以需要对引入的pom文件进行清理,删除不必要的依赖,只保留与该微服务紧密相关的依赖项,以确保微服务的独立性和简洁性。

(二)创建 Spring Boot 启动类

启动类是微服务运行的入口,我们可以选择手写,也可以从其他相似项目中复制。推荐copy因为这些代码格式都是固定的,没必要手写

(三)搭建基本包结构

接着,我们开始创建一些基本的包,如servicecontrollermapperdomain等。service包用于存放业务逻辑处理代码,实现具体的业务功能;controller包负责接收外部请求,并将请求转发给相应的service进行处理,同时将处理结果返回给客户端;mapper包主要用于定义数据访问接口,与数据库进行交互;domain包又有dto,po,vo等,用于表示与数据库表结构相关的实体。后续可根据具体业务需求,自行增加我们的包,就比如interceptor,until,aspect

三、配置文件的引入与调整

这样做之后,我们需要引入我们的配置文件,配置文件主要是我们的依赖所需要的配置,我们视情况而改动,但是我们的微服务端口号port和名字一定要改,以及swagger的一些名字要修改。

四、业务代码的引入与注意事项

在引入我们的业务代码的时候,我们要注意自底而上的去构建copy代码

(一)引入 domain 包实体类

按照自底而上的构建方式,首先引入domain包下的实体类。这些实体类是与数据库表结构对应的对象,引入后,我们一定要一定要仔细的检查是否存在包层级、包引入等方面的问题,确保实体类能够在新的微服务环境中正常使用。要不然特别麻烦,会一直出错

(二)迁移 mapper 文件

在domain文件copy完成之后,我们可以接着复制mapper文件。同样,要对mapper文件进行全面检查,因为在从单体项目迁移到微服务的过程中,包的结构和依赖关系可能发生变化,需要确保mapper文件中的接口定义、SQL 映射等内容都能正确适配新的环境。

(三)调整 service 层代码

service层代码通常是最最最最需要改动的部分,因为业务代码都在这里写着。由于微服务强调高内聚低耦合,在将service层代码迁移到新的微服务中时,要特别注意包的依赖路径已经发生改变。需要对代码进行梳理和重构,将与该微服务紧密相关的业务逻辑保留在本服务内,去除不必要的耦合,使每个微服务都能独立地完成特定的业务功能。

(四)引入 controller 层代码

最后引入controller层代码。在COPY过程中,要确保请求的路由和处理逻辑正确无误,能够准确地将请求转发给相应的service层,并将处理结果以合适的格式返回给客户端。

五、实践感悟

这时候我们的微服务拆分基本就已经完成了。很多都是细节上的,但是只要我们抽丝剥茧,一层一层的去构建,这个微服务肯定会构建完成了

当然我们仅仅是将一个业务模块从我们单体项目中拆分了出来,当我们全部拆分完,高内聚低耦合的时候,我们还需要

相关文章:

【从零开始学习微服务 | 第一篇】单体项目到微服务拆分实践

目录 引言 一、选择聚合结构进行拆分的优势 二、微服务模块创建步骤 (一)引入 pom 文件与修改 (二)创建 Spring Boot 启动类 (三)搭建基本包结构 三、配置文件的引入与调整 四、业务代码的引入与注意…...

【高并发】Celery + Redis异步任务队列方案提高OCR任务时的并发

线程池处理OCR仍然会阻塞请求的原因主要有以下几点,以及为什么CeleryRedis是更好的解决方案: 1. 线程池的阻塞本质 请求-响应周期未分离:即使使用线程池,HTTP请求仍需要等待线程池任务完成才能返回响应。当所有线程都繁忙时&#…...

2025数维杯数学建模竞赛B题完整参考论文(共38页)(含模型、代码、数据)

2025数维杯数学建模竞赛B题完整参考论文 目录 摘要 一、问题重述 二、问题分析 三、模型假设 四、定义与符号说明 五、 模型建立与求解 5.1问题1 5.1.1问题1思路分析 5.1.2问题1模型建立 5.1.3问题1求解结果 5.2问题2 5.2.1问题2思路分析 5.2.2问题2…...

C#黑魔法:鸭子类型(Duck Typing)

C#黑魔法:鸭子类型(Duck Typing) 如果它走起路来像鸭子,叫起来像鸭子,那么它就是鸭子。 鸭子类型,主要应用于动态语言类型,比如JS、Python等,核心理念为:关注对象的行为(方法或属性…...

AI数据分析中的伪需求场景:现状、挑战与突破路径

在当今企业数字化转型浪潮中,AI数据分析产品如雨后春笋般涌现,但其中存在大量"伪需求场景"——看似创新实则难以落地的功能设计。本文将从技术限制、用户体验和商业价值三个维度,系统分析AI数据分析产品中常见的伪场景现象&#xf…...

大尺寸PCB如何重塑通信与新能源产业格局

在5G通信基站与新能源电站的机房内,一块块面积超过600mm600mm的PCB板正悄然推动着技术革命。作为电子设备的核心载体,大尺寸PCB凭借其高密度集成与复杂工艺,成为通信、能源等领域的“隐形功臣”。以猎板PCB为代表的厂商,凭借宽幅曝…...

base64与图片的转换和预览(高阶玩法)

1.完整的功能描述 功能概述 这是一个网页工具,支持用户输入不同格式的图片数据或上传本地图片文件,对图片进行预览、转换为多种格式,并支持导出不同格式的图片数据。 输入方式 1. 文本输入 :用户可以输入 Data URL、公网图片 UR…...

AI客服问答自动生成文章(基于deepseek实现)

小编一直在用AI做网站平台文章的润色或者二创。一直有一个想法,在自己网站加一个AI智能客服,通过文心或者deepseek来智能回答网友提出的问题,这样就能减少很多人工回复的麻烦,提高互动效率。 开发背景 其实很多网友提出的问题非…...

Langchain、RAG、Agent相关

ChatBot-销售型机器人 优化点:把相似度低于10条的请求Query打印出来。 RAG 类型:RAG、Latent RAG(产生一个回答,再用回答进行召回)、Logit RAG、Speculative RAG 个人感觉RAG召回可以分成3种:一种是que…...

Spring Web MVC基础理论和使用

目录 什么是MVC 什么是SpringMVC SpringMVC基础使用 建立连接 RequestMapping介绍 请求 传递参数 传递对象 参数重命名 传递数组 传递JSON数据 获取URL中参数 上传文件 获取Cookie/Session 获取Header 响应 返回静态页面 RestController和Controller的区别 返…...

课程审核流程揭秘:确保内容合规与用户体验

业务流程 为什么课程审核通过才可以发布呢? 这样做为了防止课程信息有违规情况,课程信息不完善对网站用户体验也不好,课程审核不仅起到监督作用,也是 帮助教学机构规范使用平台的手段。 如果流程复杂用工作流 说明如下&#xff…...

Mac电脑,idea突然文件都展示成了文本格式,导致ts,tsx文件都不能正常加载或提示异常,解决方案详细说明如下

有一天使用clean my mac软件清理电脑 突然发现idea出现了文件都以文本格式展示,如图所示 然后就卸载,计划重新安装,安装了好几个版本,并且setting->file types怎么设置都展示不对,考虑是否idea没卸载干净&#xff…...

HarmonyOS开发-组件市场

1. HarmonyOS开发-组件市场 HarmonyOS NEXT开源组件市场是一个独立的插件,需通过DevEco Studio进行安装,可以点击下载,无需解压,直接通过zip进行安装,具体安装和使用方法可参考HarmonyOsNEXT组件市场使用说明。Harmony…...

【Python 列表(List)】

Python 中的列表(List)是最常用、最灵活的有序数据集合,支持动态增删改查操作。以下是列表的核心知识点: 一、基础特性 有序性:元素按插入顺序存储可变性:支持增删改操作允许重复:可存储重复元…...

vison transformer vit 论文阅读

An Image is Worth 16x16 Words 20年的论文看成10年的哈斯我了 [2010.11929] 一张图像胜过 16x16 个单词:用于大规模图像识别的转换器 --- [2010.11929] An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale 为什么transformer好训练&am…...

图像移动图像归类代码

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 图像移动图像归类代码 import os import shutilvalue_dir rJ:\IDM_data\cls_chinese_medicine\cls_chinese_medicine\traintrain_dir rJ:\IDM_data\cls_chinese_medicine\c…...

Day 15 训练

Day 15 对鸢尾花数据集进行处理,特征可视化,贝叶斯优化随机森林,Shap解释1. 导入必要的库2. 设置中文字体3. 加载数据集4. 查看数据5. 数据准备6. 贝叶斯优化随机森林7. 评估结果8. 绘制箱形图9. 绘制特征相关性热力图10. SHAP模型解释总结 对…...

Vue Router 3 使用详解:从零构建嵌套路由页面

Vue Router 是 Vue.js 官方的路由管理器,常用于构建单页面应用(SPA)。本文将手把手带你完成 vue-router3.6.5 的基本配置,并实现一个带有嵌套路由的页面结构。本文适用于 Vue 2.x 项目 一、安装 vue-router3.6.5 npm install vue…...

物理服务器紧急救援:CentOS系统密码重置全流程实战指南

前言 在企业IT运维实践中,物理服务器密码丢失是典型的"低概率高风险"事件。某金融科技公司曾因核心服务器密码遗失导致业务中断36小时,直接损失超过800万元。这起真实案例揭示了系统密码管理的关键性——当承载重要业务的物理服务器遭遇密码丢…...

第J7周:对于ResNeXt-50算法的思考

目录 思考 一、代码功能分析 1. 构建 shortcut 分支(残差连接的旁路) 2. 主路径的第一层卷积(11) 4. 主路径的第三层卷积(11) 5. 残差连接 激活函数 二、问题分析总结:残差结构中通道数不一致的…...

华为云短信接入实现示例

1&#xff09;构建Springboot项目 2) 添加依赖 <dependency><groupId>com.huawei.apigateway</groupId><artifactId>java-sdk-core</artifactId><version>3.2.4</version> </dependency> 3) 配置文件 huaweiyun:sms:url:…...

Linux系统下使用Kafka和Zookeeper

Apache Kafka 是一个分布式流处理平台,最初由 LinkedIn 开发,后来成为 Apache 软件基金会的顶级项目。它具有高吞吐量、可扩展性、持久性、容错性等特点,主要用于处理实时数据流。 Linux系统下使用Kafka 1.安装 Java Kafka 和 Zookeeper 都是基于 Java 开发的,所以需要先…...

Unity按钮事件冒泡

今天unity写程序时&#xff0c;我做了一个透明按钮&#xff0c;没图片&#xff0c;只绑了点击事件&#xff0c;把子对象文字组件也删了&#xff0c;空留一个透明按钮&#xff0c;此时运行时点击按钮是没有反应的&#xff0c;网上的教程说必须指定target graphic&#xff08;目标…...

指令图像编辑模型:ICEdit-MoE-LoRA

ICEdit-MoE-LoRA 一、研究背景与目标 In-Context Edit 是一种新颖的基于指令的图像编辑方法&#xff0c;旨在实现与现有最佳方法相当甚至更优的编辑效果。传统图像编辑技术在处理复杂指令时存在一定局限性&#xff0c;尤其是在多轮编辑任务中&#xff0c;结果的准确性和连贯性…...

第十六届蓝桥杯 2025 C/C++B组第一轮省赛 全部题解(未完结)

目录 前言&#xff1a; 试题A&#xff1a;移动距离 试题C&#xff1a;可分解的正整数 试题D&#xff1a;产值调整 试题E&#xff1a;画展布置 前言&#xff1a; 我参加的是第一轮省赛&#xff0c;说实话第一次参加还是比较紧张的&#xff0c;真到考场上看啥都想打暴力&…...

捌拾叁- 量子傅里叶变换

1. 前言 最近公司地震&#xff0c;现在稍微有点时间继续学习。 看了几个算法&#xff0c;都说是基于 量子傅里叶变换 &#xff0c;好&#xff0c;就是他了 Quantum Fourier。 2. 傅里叶变换 大学是学通信的&#xff0c;对于傅里叶变换还是有所理解的。其实就是基于一个 时域…...

2.在Openharmony写hello world

原文链接&#xff1a;https://kashima19960.github.io/2025/03/21/openharmony/2.在Openharmony写hello%20world/ 前言 Openharmony 的第一个官方例程的是教你在Hi3861上编写hello world程序&#xff0c;这个例程相当简单编写 Hello World”程序&#xff0c;而且步骤也很省略&…...

STM32外设-串口UART

STM32外设-串口UART 一&#xff0c;串口简介二&#xff0c;串口基础概念1&#xff0c;什么是同步和异步/UART与USART对比2&#xff0c;串行与并行3&#xff0c;波特率 (Baud Rate)4&#xff0c;数据帧 (Data Frame)5&#xff0c;TX 和 RX 三&#xff0c;硬件连接1&#xff0c;u…...

计算机视觉与深度学习 | 视觉+激光雷达+惯惯性SLAM算法汇总(原理,公式,代码)

视觉+激光雷达+惯性 1. LVI-SAM(Laser-Visual-Inertial SLAM)2. MMF-LVINS(Multi-Modal Feature-based LVINS)3. FAST-LIVO(Fast LiDAR-Inertial-Visual Odometry)4. CamVox5. Coco-LIC6. FAST-LIO27. SLICT(Surfel-Based LiDAR-Inertial Mapping)总结与对比以下是对视…...

MCU存储系统架构解析

今天和大家分享一下MCU存储器层次结构的设计思路。这种分层存储架构通过整合不同特性的存储单元&#xff0c;能够很好地平衡性能与成本需求。 首先是寄存器层&#xff0c;它直接集成在CPU内核里&#xff0c;速度最快&#xff08;纳秒级&#xff09;&#xff0c;但容量比较小&a…...