03-微服务架构构建之微服务拆分
文章目录
- 前言
- 一、微服务拆分的原则
- 二、微服务拆分的时机
- 三、微服务拆分的方法
- 总结
前言
微服务架构是将一个单体应用程序拆分为一个个独立且保持松耦合的服务的一种架构方式,每个服务有着独立的数据库并且能独立运行部署。微服务架构的构建过程中,第一步也是最为重要的一步是进行服务拆分。只有将微服务按照合理的方式进行拆分,才能确保整个项目能够高效而正确地运行。
一、微服务拆分的原则
微服务拆分原则有以下几个:
-
单一职责原则:每个微服务应该有一个明确的职责范围,只负责自己的一部分业务功能,不涉及其他职责。
-
服务自治原则:每个微服务应该具备自我管理、独立部署、独立伸缩、独立运维的能力,不与其他服务强依赖。
-
服务可复用原则:每个微服务应该是可复用的,可以为其他服务提供通用的服务功能。
-
服务粒度原则:微服务应该按照业务功能划分,而不是按照技术、数据结构等因素划分,保持服务规模适度。
-
服务高内聚、低耦合原则:微服务内部业务功能高度内聚,与其他服务之间耦合度低,便于分布式部署和独立开发、维护。
-
服务易于测试原则:每个微服务应该具备自我测试的能力,包括单元测试、接口测试、集成测试等多种形式,确保服务质量。
-
服务可扩展原则:每个微服务应该能够按照业务需求进行扩展,包括水平扩展和垂直扩展两种方式,以应对高并发、大流量等场景。
同样,也可以参考一下,这篇文章对服务拆分原则的理解。以下摘自该文章。
-
使用有界上下文。
-
确定核心域并保持竞争优势。
-
对通用域进行成本优化。
-
考虑支持领域。
-
引入反腐层。
-
识别数据通信模式。
-
引入事件驱动架构。
-
使API简洁明了。
-
将相关的微服务合并为更大的服务。
-
引入无缝开发支持工具。
不管是哪种拆分原则,目标都是需要将相同或相似的服务聚合在一起,形成一个独立的自治服务。
二、微服务拆分的时机
通过《02-微服务架构的概念与优缺点》可以了解到微服务架构具备很多的优点,能够有效解决项目业务扩大所带来的问题。然而,并非所有公司都适合采用微服务架构,尤其是规模较小且业务相对固定的公司。对于这些公司来说,从服务层面,他们不会有更多变化,通过优化现有服务即可满足需求。从成本方面,构建微服务架构,需要很多资源和配套的中间件。因此,对于那些规模较大,业务服务复杂度高,同时业务也在不断更新或新增的项目,微服务架构则是非常适合的选择。
在确定使用微服务架构后,服务的拆分是一项重要任务。根据拆分原则,我们可以在恰当的时机进行服务拆分。然而,根据行业经验来看,并不建议在项目构建初期进行服务拆分。主要原因有以下几点:
-
项目构建初期,服务单一,数据量较少,及时是单体系统都可以支撑业务。
-
项目构建初期,服务没有形成体系,更没有规模服务,很难做到微服务的单一职责和服务自治。
-
业务架构不够成熟,目前提供的服务,很有可能会优化,甚至更改技术栈重构。
因此,项目构建初期无需将其拆分,因为强行拆分此时可能会产生适得其反的效果。而遇到下面这些情况就可以进行服务拆分了。
-
项目足够成熟并且业务稳定,团队成员不断扩大并且目前的服务想要扩展很难。只有在项目成熟的情况下,业务专家才可以从精确的划分出业务领域,进而将各个服务分解到业务领域内,最终形成各自独立的微服务。
-
项目要求CI/CD(持续集成/持续交付)。尤其是很多新兴的互联网公司,要求系统在尽可能不停机的情况下,还需要持续上线新的功能。使用敏捷开发,可以更好地让开发者在完成周期形的业务交付,而DevOps则可以将这些代码,进行自动化测试、构建和集成,不断的完成新的需求提交,并保证代码的质量和稳定性。
-
正式运行的项目,部分服务需要停机。当上线一些有问题的服务时,将该部分服务停机,这个情况对单体应用是非常有困难的。而微服务架构中,可以对存在问题的微服务进行下线处理,从而达到快速解决问题的目的。
三、微服务拆分的方法
在掌握了准确的微服务拆分时机和有了强有力的拆分原则后,拆分方法将成为下一个关键环节。现在微服务拆分的方法有很多种,常见的包括:
-
按业务功能拆分:将整个系统按照不同的业务模块进行拆分,每个模块对应一个微服务。这种方式能够有效地降低系统的复杂度,提高系统的可维护性和可扩展性。
-
按数据拆分:将整个系统的数据按照不同的领域进行拆分,每个领域对应一个微服务。这种方式能够提高系统的性能和可扩展性。
-
按用户界面拆分:将整个系统按照不同的用户界面进行拆分,每个用户界面对应一个微服务。这种方式能够实现快速迭代和响应用户需求的能力。
-
按技术栈拆分:将整个系统按照不同的技术栈进行拆分,每个技术栈对应一个微服务。这种方式能够提高开发效率和降低系统的复杂度。
-
按性能拆分:将整个系统按照不同的性能需求进行拆分,每个需求对应一个微服务。这种方式能够提高系统的性能和可扩展性。
从行业经验来看,可以确定领域驱动设计(Domain Driven Design,简称DDD)在微服务拆分方面具有显著优势。
DDD是一种软件开发方法论,它强调将软件划分为不同的领域,每个领域都由一个核心模型驱动。 微服务架构的核心概念是将单一的应用程序拆分为一组小型、自治的服务。而DDD则提供了一种方法来设计这些微服务的边界和交互。 领域驱动设计引入了领域模型的概念,该模型描述了业务领域的核心概念和实体,而不关注技术实现细节。这使得团队可以专注于业务逻辑,而不被底层技术细节所干扰。 通过将领域模型作为微服务拆分的基础,可以确保每个微服务都是高内聚的,并且只关注自己领域内的业务逻辑。这种拆分方式使得每个微服务都能够独立开发、部署和维护,从而提高了系统的可伸缩性和可靠性。 此外,DDD还强调了领域驱动设计的语言在业务团队和开发团队之间的沟通和理解的重要性。通过共享统一的语言和概念,可以确保业务需求能够准确地传达给开发团队,并且开发团队能够将其转化为可行的技术解决方案。 因此,DDD是一种非常适合成为微服务拆分的方法论。它能够帮助开发人员更好地理解业务需求,找到合适的服务边界,构建高质量的领域模型和微服务。
总结
以上就是今天要讲的关于微服务拆分的全部内容。通过了解微服务的拆分时机并掌握拆分原则,我们可以选择合适的拆分方式,从而顺利进行微服务的拆分。微服务的拆分时机一般是在系统庞大、业务复杂或者团队扩大的情况下,以应对系统的瓶颈和团队协作的问题。同时,在进行微服务拆分时,我们需要遵循一些原则,如单一职责原则、服务自治原则等,以确保拆分后的服务具有清晰的职责和松耦合的关系。最后,要根据实际情况选择合适的拆分方式,提出使用领域驱动设计作为方法论的优势。只有通过这样的准备和选择,才能够顺利进行微服务的拆分工作。
相关文章:
03-微服务架构构建之微服务拆分
文章目录 前言一、微服务拆分的原则二、微服务拆分的时机三、微服务拆分的方法总结 前言 微服务架构是将一个单体应用程序拆分为一个个独立且保持松耦合的服务的一种架构方式,每个服务有着独立的数据库并且能独立运行部署。微服务架构的构建过程中,第一…...
Linus:我休假的时候也会带着电脑,否则会感觉很无聊
目录 Linux 内核最新版本动态 关于成为内核维护者 代码好写,人际关系难处理 内核维护者老龄化 内核中 Rust 的使用 关于 AI 的看法 参考 12.5-12.6 日,Linux 基金会组织的开源峰会(OSS,Open Source Summit)在日…...
快速排序的新用法
普通快排 简介 快速排序是一种高效的排序算法,利用分治的思想进行排序。它的基本原理是在待排序的n个数据中任取一个数据为分区标准,把所有小于该排序码的数据移到左边,把所有大于该排序码的数据移到右边,中间放所选记录&#x…...
利用乔拓云SAAS系统,快速、高效搭建小程序
a-service,软件即服务)系统来搭建他们的微信小程序。SAAS系统作为一种创新的软件应用模式,将软件作为一种服务提供给用户,为用户提供了更高效、更便捷的解决方案。本文将探讨为什么越来越多的商家选择使用乔拓云这种SAAS系统搭建小…...
Kubernetes(K8s 1.27.x) 快速上手+实践,无废话纯享版
文章目录 1 基础知识1.1 K8s 有用么?1.2 K8s 是什么?1.3 k8s 部署方式1.4 k8s 环境解析 2 环境部署2.1 基础环境配置2.2 容器环境操作2.3 cri环境操作2.4 harbor仓库操作2.5 k8s集群初始化2.6 k8s环境收尾操作 3 应用部署3.1 应用管理解读3.2 应用部署实…...
非常抱歉的通知
非常感谢有这么多的同志向我提问一些问题,也非常感谢很多的同志可以看我的学习文章,这次大概有四五个月没有上csdn,看到了许多同志的疑问和慰问,我也很感动,但是由于我自己以及其他的原因,我现在打算以考编…...
rust 包模块组织结构
一个包(package)可以拥有多个二进制单元包及一个可选的库单元包。随着包内代码规模的增长,你还可以将代码拆分到独立的单元包(crate)中,并将它作为外部依赖进行引用。 RUST提供了一系列的功能来帮助我们管…...
深入浅出:HTTPS单向与双向认证及证书解析20231208
介绍: 网络安全的核心之一是了解和实施HTTPS认证。本文将探讨HTTPS单向认证和双向认证的区别,以及SSL证书和CA证书在这些过程中的作用,并通过Nginx配置实例具体说明。 第一部分:HTTPS单向认证 定义及工作原理:HTTPS单向认证是一…...
水利安全监测方案——基于RTU200的解决方案
引言: 水资源是人类赖以生存的重要基础,对于保障水利系统安全运行以及应对自然灾害起着关键作用。为了实现水利安全监测的目标,我们提出了基于RTU200的解决方案。本方案将结合RTU200的可靠性、灵活性和高效性,为您打造一个全面的…...
安卓开发学习---kotlin版---笔记(一)
Hello word 前言:上次学习安卓,学了Java开发,简单的搭了几个安卓界面。这次要学习Kotlin语言,然后开发安卓,趁着还年轻,学点新东西,坚持~ 未来的你会感谢现在努力的你~ 主要学习资料:…...
挑选在线客服系统的七大注意事项
越来越多的企业开始注重客户服务,所以在线客服系统也逐渐成为了电商企业不可或缺的一部分。然而在挑选在线客服系统的过程中,蛮多企业会遇到各种各样的问题,这就导致了最终选择的系统并不适合自己企业的需求。接下来我将提醒大家挑选在线客服…...
剧本杀小程序搭建:打造线上剧本杀新体验
剧本杀是一款以角色扮演为主的游戏,一度成为了年轻人的最喜爱的社交游戏。在剧本杀市场需求下,剧本杀规模也迅速上升。今年第一季度,剧本杀市场规模环比增长47%,市场整体消费水平逐渐呈上升趋势。 随着剧本杀的不断发展ÿ…...
机器学习实战:预测波士顿房价
前言: Hello大家好,我是Dream。 今天来学习一下机器学习中一个非常经典的案例:预测波士顿房价,在此过程中也会补充很多重要的知识点,欢迎大家一起前来探讨学习~ 一、导入数据 在这个项目中,我们利用马萨诸…...
基于个微机器人的开发
简要描述: 下载消息中的动图 请求URL: http://域名/getMsgEmoji 请求方式: POST 请求头Headers: Content-Type:application/jsonAuthorization:login接口返回 参数: 参数名必选类型说明…...
程序员学习方法
https://www.zhihu.com/question/24187324 https://www.zhihu.com/question/505750740 windows系统: 如何业余开展 Windows 系统的学习? - 知乎 wifi工作原理: WiFi的工作原理是什么? - 知乎 发...
VUE+THREE.JS 点击模型相机缓入查看模型相关信息
点击模型相机缓入查看模型相关信息 1.引入2.初始化CSS3DRenderer3.animate 加入一直执行渲染4.点击事件4.1 初始化renderer时加入监听事件4.2 触发点击事件 5. 关键代码分析5.1 移除模型5.2 创建模型上方的弹框5.3 相机缓入动画5.4 动画执行 1.引入 引入模型所要呈现的3DSprite…...
cpu 300% 爆满 内存占用不高 排查
top查询 cpu最高的PID ps -ef | grep PID 查看具体哪一个jar服务 jstack -l PID > ./jstack.log 下载/打印进程的线程栈信息 可以加信息简单分析 或进一步 查看堆内存使用情况 jmap -heap Java进程id jstack.log 信息示例 Full thread dump Java HotSpot(TM) 64-Bit Se…...
Halcon 简单的ORC 字体识别
文章目录 仿射变化识别 仿射变化 将图片进行矫正处理 dev_close_window() read_image(Image,C:/Users/Augustine/Desktop/halcon/image.png) *获取图片的大小 get_image_size(Image, Width, Height) *仿射运算获取图片的角度对图片进行矫正 *选中图片的区域 gen_rectangle1 (Re…...
12月7日作业
使用QT模仿一个登陆界面(模仿育碧Ubisoft登录界面) #include "myqq.h"MyQQ::MyQQ(QWidget *parent): QMainWindow(parent) {this->resize(880,550); //设置窗口大小this->setFixedSize(880,550); //固定窗口大小this->setStyleShee…...
【腾讯云HAI域探密】- AIGC应用助力企业降本增效之路
一、前言: 近年来,随着深度学习、大数据、人工智能、AI等技术领域的不断发展,机器学习是目前最火热的人工智能分支之一,是使用大量数据训练计算机程序,以实现智能决策、语音识别、图像处理等任务。 作者也是经过了以上…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...
