分解单块系统

单体地狱

早期单体架构的好处:

  1. 应用开发简单
  2. 易于大规模更改
  3. 测试部署扩展简单

随着应用的不断丰富,单体暴露出了下列问题:

  1. 复杂性
  2. 影响开发效率
  3. 扩展难
  4. 错误无法隔离,软件变得不那么可靠

定义微服务架构

  1. 定义系统操作:根据用户需求
  1. 定义服务
  2. 定义服务API与协作方式

拆分单体

根据改变速度,团队结构,安全需求以及实现技术等对其进行分离

绞杀单体应用:

屏幕截图 2021-02-01 102751

拆分维度

停止挖掘

当开发新功能时不应该为旧单体应用添加新代码,最佳方法应该是将新功能开发成独立微服务

批注 2020-03-24 093946

前后端分离

将单体应用进行前后端分离,有两个好处:

抽出服务

与单体协作

单体重构的过程中,微服务肯定需要与单体进行协作,需要定义好一个它们之间的协作方式。

拆分服务

批注 2020-06-18 163522

批注 2020-06-18 163534

202032494927

那么如何将对应的系统操作拆分为独立的服务?

根据业务能力

组织的业务是做什么。

从业务能力到服务的映射是一个非常主观的判断。围绕业务能力建模的好处在于最终的架构会趋于稳定。

利用DDD子域的概念来避免不同子领域复用相同术语所带来的混乱。

基于扩展性

将已经成熟和改动不大的服务拆分为稳定服务,将经常变化和迭代的服务拆分为变动服务

基于可靠性

将可靠性要求高的核心服务和可靠性要求低的非核心服务拆分开来,然后重点保证核心服务的高可用

基于性能需求

将性能要求高或者性能压力大的模块拆分出来,避免性能压力大的服务影响其他服务

服务API定义

依赖处理

数据库

外键

放弃,改用api调用来实现数据查询

共享数据

如果要求不苛刻,可以使用配置文件,否则使用一个专门的服务器来管理静态数据

独立出一个服务,专门来处理

需要重新审视设计,进行分表操作

数据库重构

先分离数据库再分离服务,虽然这样会破坏事务完整性,但是可以保证随时可以回退

事务

分离数据库之后,如何保证事务的安全性?

如果一个事务中的部分操作成功,部分操作失败,该如何?

引入这些都会增加系统的复杂性,最好的方式是避免这种跨服务的事务

报表问题

如果分离了数据库,那么如何解决需要所有数据的后台报表应用?

拆分单体到服务的难点