Skip to content

Commit

Permalink
update ES
Browse files Browse the repository at this point in the history
  • Loading branch information
hongshanru committed Apr 9, 2023
1 parent 14ef62b commit 29370c1
Showing 1 changed file with 47 additions and 5 deletions.
52 changes: 47 additions & 5 deletions src/main/java/com/other/SYSTEM_DESIGN.md
Original file line number Diff line number Diff line change
Expand Up @@ -189,14 +189,57 @@ SOA的架构经常利用一个被称为企业服务总线(Enterprise Service B
- 基础设施自动化(Infrastructure Automation)


**拆分原则**
- 垂直划分优先原则:应该根据业务领域对服务进行垂直划分,让团队能关注业务实现。
- 持续演进原则: 服务数量在非必要的情况下,应该逐步划分,持续演进,避免服务数量的爆炸性增长

#### 拆分原则
垂直划分优先原则:应该根据业务领域对服务进行垂直划分,让团队能关注业务实现。

持续演进原则: 服务数量在非必要的情况下,应该逐步划分,持续演进,避免服务数量的爆炸性增长
### 六边形架构

![image](https://raw.githubusercontent.com/rbmonster/file-storage/main/learning-note/design/systemdesign/hexagonal-architecture.png)

#### DDD 领域驱动
六边形架构又称”端口适配器架构“,本质上也是一种分层架构,跟传统的MVC架构不同的是,从上下层转为了内外层。
- 内部代表了应用的业务逻辑
- 外部代表应用的驱动逻辑、基础设施或其他应用
核心理念是应用通过端口与外部进行交互。核心的业务逻辑与外部资源完全隔离,仅通过适配器进行交互。

六边形体系结构是围绕**领域逻辑设计**软件应用程序以将其与**外部因素隔离**的模型。

![image](https://raw.githubusercontent.com/rbmonster/file-storage/main/learning-note/design/systemdesign/hexagonal-architecture-2.png)

六边形架构可以被分为了三层:端口适配器、应用层与领域层。而端口又可以分为输入端口和输出端口。
- 输入端口: 用于系统提供服务时暴露API接口,接受外部客户系统的输入,并客户系统的输入转化为程序内部所能理解的输入。系统作为服务提供者是对外的接入层可以看成是输入端口。
- 输出端口: 为系统获取外部服务提供支持,如获取持久化状态、对结果进行持久化,或者发布领域状态的变更通知(如领域事件)。系统作为服务的消费者获取服务是对外的接口(数据库、缓存、消息队列、RPC调用)等都可以看成是输入端口。
- 应用层: 定义系统可以完成的工作,很薄的一层。它并不处理业务逻辑通过协调领域对象或领域服务完成业务逻辑,并通过输入端口输出结果。也可以在这一层进行事务管理。
- 领域层: 负责表示业务概念、规则与状态,属于业务的核心。
> 应用层与领域层的不变性可以保证核心领域不受外部的干扰,而端口的可替换性可以很方便的对接不用的外部系统。
![image](https://raw.githubusercontent.com/rbmonster/file-storage/main/learning-note/design/systemdesign/hexagonal-architecture-puml.png)


**特性**
- **外部可替换**: 一个端口对应多个适配器,是对一类外部系统的归纳,它**体现了对外部的抽象**。应用通过端口为外界提供服务,这些端口需要被良好的设计和测试。
- **自动测试**: 在六边形架构中,自动化测试和用户具有同等的地位,在实现用户界面的同时就需要考虑自动化测试。它们对应相同的端口。
- **依赖倒置**: 六边形架构必须遵循如下规则:内部相关的代码不能泄露到外部。所谓的泄露是指不能出现内部依赖外部的情况,只能外部依赖内部,这样才能保证外部是可以替换的

优点:
- 业务领域的边界更加清晰
- 更好的可扩展性
- 对测试的友好支持
- 更容易实施DDD


与DDD的共性和区别:
- 在六边形架构中,业务逻辑位于中心,被称为“领域层”或“核心层”,外部环境通过“端口”或“适配器”与其交互
- DDD的核心思想是将业务问题领域建模,以此来指导软件设计和开发。其核心是领域模型,其目的是为了实现业务规则和业务流程的自然映射
共性。首先它们都关注业务逻辑的独立性,六边形架构通过将业务逻辑与外部环境分离,DDD则通过领域模型来描述业务逻辑。其次,它们都鼓励团队使用统一的业务语言(Ubiquitous Language)来描述领域模型或业务逻辑,这也是DDD中的重要概念之一。


参考文章:
- [微服务架构设计之六边形架构](https://xmmarlowe.github.io/2021/08/26/%E6%9E%B6%E6%9E%84/%E5%BE%AE%E6%9C%8D%E5%8A%A1%E6%9E%B6%E6%9E%84%E4%B9%8B%E5%85%AD%E8%BE%B9%E5%BD%A2%E6%9E%B6%E6%9E%84/)
- [从三明治到六边形](https://insights.thoughtworks.cn/architecture-from-sandwich-to-hexagon/)

### DDD 领域驱动
详细见
[DDD设计思想](https://github.com/rbmonster/learning-note/blob/master/src/main/java/com/toc/DDD.md)

Expand Down Expand Up @@ -453,5 +496,4 @@ zuul.ratelimit.verify-path = /api/v1/user/v-code/captcha/verify

### 系统可用性测量


MTTA

0 comments on commit 29370c1

Please sign in to comment.