两顶帽子,是落地重构的重要开发模式,是一种工作习惯 , 或者说是一种高效的工作流程 。两顶帽子法 , 将软件变更落地过程分为两个阶段:
- 优化结构阶段 。在不改变软件行为的前提下,对软件结构进行优化,使其更具扩展性 。比如:
- 【重构】抽取公共逻辑到方法、类,以便更好的被复用;
- 【设计模式】抽取模板方法,对核心逻辑进行统一;
- 【架构模式】抽取功能微内核,确定插件签名和功能;
- 添加功能阶段 。在调整后的具备更好的扩展性的代码基础上完成功能调整或者增加新功能,如:
- 新功能复用已有组件能力,避免重复开发;
- 以扩展点的方式增加新功能,提升开发效率;
根据应用场景的不同,我们将外六边形的组件分成两类:
- 输入适配器 。将来自外部的数据转换为系统可以使用的格式;
- 输出适配器 。将系统内部的数据转换为外部可以使用的格式
2.2.1. 输入适配器
负责将外部系统的请求转换为应用服务能够处理的格式,通常包括Web 请求、RPC调用、消息队列、定时任务等,是将外部请求转换为内部指令的桥梁 。常见的输入适配器主要包括:
- Web 请求 。处理 HTTP 请求,对请求进行转换、验证,将其转换为应用服务所需格式 , 调用接口完成业务逻辑,最后将处理结果转化为所需格式进行返回 。常见的框架有 Spring MVC、Struct2等;
- RPC 调用 。处理远程调用请求 , 将请求转换为应用程序所需格式,调用应用服务接口完成业务逻辑,最后返回处理结果;在 Spring Cloud 技术栈下,与 Web 请求高度类似,但仍旧具有自己的特点,需要与 Web 请求进行区分处理 。常见的 RPC 框架有 Spring Cloud、gRPC、Thrift、Dubbo等;
- 消息队列 。主要指的是消息队列的消费端,从消息队列中读取消息,将信息转换为应用程序所需格式 , 调用应用服务接口完成业务逻辑 。常见的有 RocketMQ、Kafka、RabbitMQ等;
- 定时任务 。由定时器周期性触发,调用应用服务的业务方法,完成某种后台任务 。常见的有Quartz、XXL-job、Spring Task 等;
负责将应用程序输出结果转换为外部系统能够理解的格式,通常包括数据库、RPC调用、缓存、搜索、消息队列、文件系统等,是将内部响应转换为外部响应的桥梁 。常见的输出适配器主要包括:
- 数据库 。将领域模型中的模型数据保存到数据库进行持久化存储 , 常用的框架包括 MyBatis、Jpa、Hibernate等,中间件主要是 MySQL;
- 缓存 。模型数据发生变更后,对缓存数据进行清理或更新,常见框架包括本地缓存 Guava、Caffeine、EhCache,分布式缓存有 redis、Memcache、TAIr等;
- 搜索 。为应对多维度查询,系统会引入搜索引擎组件,在模型数据发生变更后,需要将变更同步到搜索引擎,常见的有Elasticsearch、Solr、Sphinx等;
- 消息队列 。这里主要指的是消息队列的发送端,当业务操作完成后,系统会向外发布领域事件,以将变更通知到下游系统,常见的有 RocketMQ、Kafka、RabbitMQ等;
- RPC调用 。这里主要指的是 RPC 的调用端 , 当业务模型对其他领域服务存在依赖时,需要通过 RPC 进行系统通信,常见的 RPC 框架有 Spring Cloud、gRPC、Thrift、Dubbo等;
- 文件系统 。这里简单理解为系统的日志输出即可,常见的有Log4j、Logback、SLF4J、JUL等;
推荐阅读
- 平面设计必备的三大软件设计教程
- 听说你会架构设计?来,弄一个群聊系统
- 一文读懂Android架构演进历程
- Instagram 早期技术架构,你了解了吗?
- 登雪山装备哪些是必备的 登雪山怎么选购装备
- 五一出行物品清单 五一出行必备装备
- 护发精油哪个牌子用了改善毛躁?以下6款好产品“毛孩子”必备!
- Python编程必备:掌握列表遍历的六种神级技巧!
- 自驾游必备100个清单 自驾游注意事项和准备工作
- 听说你会架构设计?来,弄一个微信群聊系统