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

微服务拆分的一些基本原则

文章首发公众号:海天二路搬砖工

单一职责原则

什么是单一职责原则

单一职责原则原本是面向对象设计中的一个基本原则,它指的是一个类只负责一项职责,不要存在多于一个导致类变更的原因。

在微服务架构中,一个微服务也应该只负责一个功能或业务领域,这样可以使微服务的职责清晰、可维护性高、易于扩展和替换。

单一职责原则案例

以一个简单的电商系统为例,可以拆分为用户服务、商品服务、订单服务、物流服务等微服务,每个微服务只负责单一的业务领域。

在这里插入图片描述

涉及用户身份信息的修改,只需要变更用户服务,其他服务不受影响。

实现单一职责原则的挑战与应对

在微服务架构中,实现单一职责原则,其实最大的挑战职责边界不够清晰。

在微服务设计的初期,尽可能地定义出微服务之间的职责边界,确保每个微服务负责的业务领域和功能范围都能够清晰地定义出来。

在设计的过程中,可以采用 DDD(领域驱动设计)等设计技术来帮助确定职责边界。

如果我们无法确定一个功能是否应该属于某个微服务,或者认为该功能当前属于这个微服务,但以后可能不是,那它就不应该放在当前的微服务中。可以进一步定义这个功能所属的业务领域,也可以单独使用某个微服务来托管这些类似的功能。

服务自治原则

什么是服务自治原则

微服务架构的服务自治原则(Service Autonomy)是指每个微服务都应该具备高度自治的能力,即每个服务要能做到独立开发、独立测试、独立构建、独立部署,独立运行。

服务自治原则是微服务架构中的一条基本原则,它有利于提高整个系统的可靠性和弹性,并能够更快速地响应业务需求和变化。

服务自治原则还可以鼓励团队之间更加分散化、独立化的协作方式,并减少不同团队的耦合度,提高系统的可扩展性和可重用性。

服务自治原则示例

同样以上面的电商系统为例,每一个微服务应该有自己的存储、配置,在进行开发、部署、构建、运行和测试时,并不需要过多关注其他微服务的状态和数据。

在这里插入图片描述

实现服务自治原则的挑战和应对

对于一个相对复杂的系统而言,是没有办法完全切割成完全独立的子系统(服务)的。
比如上面的示例中,订单管理可能包含下单逻辑,下单需要考虑商品是否还有库存(商品管理)。微服务之前可能发生流程的联动,或者数据的共享。

在实现服务自治原则时,需要定义好服务间交互的协议。要尽可能避免直接访问对方的数据,而应该通过统一的接口来获取信息和提供能力。

分层单向依赖原则

什么是分层单向依赖原则

在更为复杂的业务中,微服务的水平拆分已经无法满足微服务治理的需求。针对不同的功能定位,可以做纵向的分层。

通常,系统可以分为下面几层

  • **API 网关层:**提供统一的服务接口和面向用户的商业逻辑处理,是微服务系统和外部系统的统一接口,具备流量控制、认证授权、缓存等功能。
  • **应用服务层:**处理业务逻辑、事务管理、权限控制等,对外提供领域服务接口,同时维护业务状态和业务规则。应用服务层对其他层具有扩展性和可配置性,是整个系统的关键决策层。
  • **领域服务层:**实现业务功能和核心业务逻辑,是核心的业务处理层。领域服务层之间不直接互相调用,只能通过公开的作用于领域范围内的接口完成。
  • **数据访问层:**提供数据访问和持久化,例如数据库的读写、缓存管理等,对领域实体进行持久化操作。

分层单向依赖原则示例

在这里插入图片描述

实现分层单向依赖的挑战与应对

  • 接口设计问题: 分层单向依赖要求每个层次都只能调用下层的接口,需要对接口设计进行规范化和优化。对于接口设计问题,需要注意保持接口的稳定性和向后兼容性,避免调用者和实现者之间的耦合度过高。
  • 性能问题: 在做分层单向依赖的时候,需要完成大量的层间信息传递,这有可能导致性能瓶颈增强。为了解决这个问题,可以采用一些优化策略,如缓存、异步等方式来加速服务处理和减少系统负担。

我的公众号

在这里插入图片描述

http://www.lryc.cn/news/228546.html

相关文章:

  • Ubuntu取消sudo的输入密码
  • 基于ubuntu22.04手动安装openstack——2023.2版本(最新版)的问题汇总
  • 如何入门学习黑客技术?如何选择编程语言?如何选择适合黑客的操作系统?
  • 教育局档案室智慧档案库房建设方案
  • 智慧城市数据中台建设方案:PPT全文51页,附下载
  • 计算复杂性理论(一)图灵机
  • VM虚拟机只有一个C盘怎么添加硬盘新分区盘符
  • 堆排序(大根堆、小根堆)
  • 操作系统专栏 学习导航or使用说明
  • 计算机毕业设计选题推荐-课程学习微信小程序/安卓APP-项目实战
  • OracleLinux9 安装 fcgiwrap 并添加 selinux 规则以在 nginx 调用
  • Django框架
  • 用C语言来实现冒泡排序
  • flink的副输出sideoutput单元测试
  • 使用Inis搭配内网穿透实现Ubuntu上快速搭建博客网站远程访问
  • 基于蝴蝶算法优化概率神经网络PNN的分类预测 - 附代码
  • flink的KeyedBroadcastProcessFunction测试
  • 【pytorch深度学习】torch-张量Tensor
  • odoo16前端框架源码阅读——rpc_service.js
  • Nat. Med. | 成年人的城市生活环境对心理健康的影响
  • stm32 WIFI模块_8266使用
  • 【C/C++】malloc 或者 new 动态分配内存
  • 如果让你重新开始学 C/C++,你的学习路线会是怎么选择?
  • PCL安装与使用
  • 力扣刷题-二叉树-对称二叉树
  • 常见面试题-计算机网络相关
  • leetcode做题笔记231. 2 的幂
  • AI主播“败走”双11,想用AI省成本的商家醒醒吧,程序员不必担心失业,发展空间依旧很大
  • ◢Django 自写分页与使用
  • 某城高速综合管控大数据大屏可视化【可视化项目案例-04】