端口-适配器的解耦魔法,到底怎么回事?
想象你有一个老式收音机,想给它接上蓝牙。如果收音机的电路和喇叭焊死在一起,你只能扔掉重买。但如果它提供标准的音频输入端口,你只需要一个蓝牙适配器。六边形架构就是这个逻辑。中心是领域,外部一切都是适配器。端口是契约,适配器是实现。数据库、消息队列、HTTP API,都是可以插拔的适配器。核心业务逻辑完全独立,它只认识端口接口,不知道外面是谁在调用。
依赖倒置的代价:多出的那8%延迟到底亏不亏?


三个深坑:那些年我们踩过的六边形架构陷阱
坑1:端口爆炸。刚开始我们过度热情,每个用例都定义一个端口接口,结果接口数量比实现类还多,“端口地狱”比XML地狱更可怕。后来我们按聚合根归拢端口,比如OrderPort包含create、cancel、query等方法,而不是OrderCreationPort、OrderCancellationPort。记住,端口要粗粒度,内聚业务能力。 坑2:事务边界混乱。一次线上事故:领域服务调用两个输出端口,一个存订单,一个扣库存。我们把@Transactional放在适配器上,结果订单存了,库存扣减失败,订单却未回滚——因为事务在适配器各自为政。解决方案:用应用服务层统一管理事务,通过命令模式或Unit of Work协调。领域服务绝不碰事务,它只负责业务规则。