六边形架构:数字世界与现实世界的分离

六边形只是边界的视觉符号。真正的架构约束是:业务核心只使用业务语言;HTTP、数据库、MQ、文件系统、第三方 SDK 等现实世界细节,都停在边界之外,通过 Port + Adapter 翻译。
判断标准:换掉外部技术,核心业务代码是否可以不动?
REAL WORLD · 现实世界 / 技术世界 变化快 · 有 I/O · 有协议 · 有框架 · 有厂商 · 有失败与延迟 这些东西都不应该成为业务规则的一部分 DIGITAL WORLD · 数字业务世界 稳定 · 可推理 · 可单测 · 只描述“业务是什么”,不描述“技术怎么做” 业务核心 Domain Model + Application / Use Cases 订单 / 商品 / 金额 / 库存 / 支付状态 创建订单 · 取消订单 · 计算价格 · 确认支付 纯业务语义,不认识外部技术 DRIVING PORT PlaceOrder “我要下单” DRIVEN PORT OrderStore “保存 / 查询订单” DRIVEN PORT PaymentGateway “发起支付” DRIVEN PORT EventPublisher “发布领域事件” DRIVEN PORT DocumentStore “保存业务文档” ① 用户 / UI / HTTP Web Adapter REST · GraphQL · CLI · Controller Request/JSON → 业务命令 翻译 ② 数据库 / 持久化 Persistence Adapter JPA · MyBatis · SQL · ORM 业务对象 ↔ 数据模型 MySQL 可换 PostgreSQL ③ 第三方系统 / API Client Adapter HTTP Client · SDK · RPC 业务请求 ↔ 厂商协议 支付平台 Stripe / 微信支付 ④ 消息队列 / 事件系统 Messaging Adapter Kafka · RabbitMQ · Pulsar ⑤ 文件 / 对象存储 Storage Adapter File System · S3 · OSS 边界真正隔离的是什么? 现实世界说: HTTP / SQL / Kafka / SDK / File 数字世界只说: PlaceOrder / SaveOrder / Pay PublishEvent / StoreDocument PORT = 边界契约 / 业务语言 代码依赖方向 Adapter → Port → Core 核心不能反向 import JPA / Kafka / SDK / HTTP “解耦成功”的验证方式 REST → gRPC MySQL → PostgreSQL Kafka → RabbitMQ S3 → OSS / Local 核心业务代码:0 修改 六边形的“六条边”没有语义;需要几类外部交互,就可以有几个 Port / Adapter。
核心不是“六边形”
核心是建立一道明确边界:内部保存业务意义,外部承担技术事实。六边形只是为了提醒我们:外部世界可以从任意方向接入。
Port 是业务自己的话
OrderStore、PaymentGateway 描述“业务需要什么”,不能叫 JpaRepository、KafkaProducer 这类技术名字。
Adapter 是翻译官
它可以知道 Spring、MyBatis、Kafka、S3、第三方 SDK;它把这些现实技术翻译成 Port 所定义的业务契约。

整个六边形架构中的参与者,可以归为五类

它们共同围绕一个目标协作:让数字世界中的业务逻辑,不直接依赖现实世界中的技术实现。 Domain 保持业务规则纯粹,Application 组织业务用例,Ports 定义边界契约,Adapters 负责跨越边界做技术翻译,而 UI、数据库及外部系统则存在于边界之外。
这版特意把五类典型外部依赖画在“现实世界”中:UI/HTTP、数据库、第三方 API、消息系统、文件/对象存储。它们都可以独立替换;如果替换时需要修改领域模型或用例,说明边界仍然被技术细节穿透。