广告
您当前的位置: 首页 >  技术 >  编程开发

领域设计战略:解密六边形架构的接口端口(Ports)与适配器(Adapters)设计

作者:CoderWang 时间:2026-07-07 阅读数:3人阅读

在传统的三层架构设计中,业务逻辑层(BLL)通常直接依赖于底层的数据访问层(DAL)。这种依赖关系导致业务逻辑与特定的数据库技术(如 SQL Server、MyBatis)产生强绑定。当我们需要将底层数据库迁移到 NoSQL 或者重构外部 API 接口时,业务逻辑层将面临灾难性的被迫修改。

为了实现**“业务逻辑与技术细节的彻底隔离”**,领域驱动设计(DDD)推荐使用**六边形架构(Hexagonal Architecture,又称端口与适配器架构 Ports and Adapters)**。

本文将系统拆解六边形架构的输入输出端口、适配器装配总线、以及在 Spring Boot 体系下的解耦代码实现。

一、 核心概念:什么是“端口”与“适配器”

六边形架构将系统划分为“内部”(业务逻辑核心)与“外部”(技术实现细节),它们之间仅通过抽象的**“端口(Ports)”**进行通信:

架构组件分类物理定义与生命周期典型技术实体设计模式应用
1. 输入端口 (Driving/Inbound Port)由业务核心层暴露的接口,定义了系统能够处理的**业务用例范围**。应用服务接口。如 OrderUseCase外观模式(Facade)/ 门面模式。
2. 输入适配器 (Driving/Inbound Adapter)外部请求的物理接入点。负责接收 HTTP/gRPC 请求,并将其翻译并调用输入端口。Spring MVC 的 Controller、消息队列监听器(Listener)。适配器模式(Adapter)。
3. 输出端口 (Driven/Outbound Port)由业务核心层声明的、需要外部提供服务的**抽象规范契约**。仓储网关接口。如 OrderRepository依赖倒置原则(DIP)。
4. 输出适配器 (Driven/Outbound Adapter)具体的外部服务物理实现类。负责实现输出端口定义的契约,操作外部系统。MyBatis Mapper 实现、Redis 缓存操作类。适配器模式(Adapter)。
---

二、 六边形架构物理通信拓扑

当一个外部请求注入并持久化数据时,在六边形架构中的流转拓扑如下:

      [ 外部请求源 (如 手机App) ] ──> 发起 HTTP Post 请求 ──> [ 输入适配器: OrderController ]
                                                                       │
                                                                       ▼ 1. 转换并调用输入端口
                                                     [ 输入端口: OrderUseCase (接口) ]
                                                                       │
                                                                       ▼ 2. 驱动核心运行
                                                     ┌───────────────────────────────────┐
                                                     │ [ 六边形内: 业务领域核心 (Domain) ] │
                                                     │  - 订单聚合根 (SalesOrder)        │
                                                     └───────────────────────────────────┘
                                                                       │
                                                                       ▼ 3. 核心调用输出端口
                                                     [ 输出端口: OrderRepository (接口) ]
                                                                       │
                                                                       ▼ 4. 实现类在基础设施层注入
                                                     [ 输出适配器: OrderJpaAdapter ] ──> 强写入 MySQL
---

三、 代码实战:贷款审批上下文的端口与适配器设计

以下展示了如何在 Spring Boot 中通过划分包结构,实现规范的六边形架构端口装配:

1. 领域/应用层(内部核心):定义输入与输出端口

package com.company.loan.core.port.in;

/**
 * 输入端口:贷款申请用例接口
 */
public interface ApplyLoanUseCase {
    void apply(String userId, double amount);
}
package com.company.loan.core.port.out;

/**
 * 输出端口:账户信息网关契约(由外部提供)
 */
public interface AccountPort {
    boolean isCreditValid(String userId);
}

2. 基础设施层(外部技术细节):实现输入与输出适配器

package com.company.loan.adapter.in.web;

import com.company.loan.core.port.in.ApplyLoanUseCase;
import org.springframework.web.bind.annotation.*;

/**
 * 输入适配器:HTTP Web 控制器
 */
@RestController
@RequestMapping("/loans")
public class LoanController {

    private final ApplyLoanUseCase applyLoanUseCase; // 注入输入端口

    public LoanController(ApplyLoanUseCase useCase) {
        this.applyLoanUseCase = useCase;
    }

    @PostMapping("/apply")
    public String apply(@RequestParam String userId, @RequestParam double amount) {
        // 将 HTTP 原始请求参数翻译为核心用例请求
        applyLoanUseCase.apply(userId, amount);
        return "申请提交成功!";
    }
}
package com.company.loan.adapter.out.persistence;

import com.company.loan.core.port.out.AccountPort;
import org.springframework.stereotype.Component;

/**
 * 输出适配器:具体依赖 MySQL 数据库查询的适配器
 */
@Component
public class AccountPersistenceAdapter implements AccountPort {

    private final UserMapper userMapper; // MyBatis 物理 DAO

    public AccountPersistenceAdapter(UserMapper mapper) {
        this.userMapper = mapper;
    }

    @Override
    public boolean isCreditValid(String userId) {
        // 调用底层物理 SQL 执行查询并回填
        UserPO user = userMapper.selectUserWithCredit(userId);
        return user != null && user.getCreditScore() > 600;
    }
}
---

四、 总结

六边形架构(Ports and Adapters)是解耦云原生复杂分布式微服务系统技术噪声的“过滤器”。

它通过**将输入输出隔离在明确的端口之下,达成了核心业务领域代码与底层物理框架(JPA/Spring Web)的彻底无涉,保障了核心模型能在 100% 单元测试覆盖率下清洁运行**;并**结合依赖注入(DI),实现了随时随地将关系型数据库无损替换为 NoSQL 的高弹性适配**。掌握这套六边形架构划分与输入输出端口设计,是进行高性能微服务开发、构建可演进式高可用系统架构的看家基本功!

本站所有文章、数据、图片均来自互联网,一切版权均归源网站或源作者所有。

如果侵犯了你的权益请来信告知我们删除。

评论交流 (0)

正在加载评论...
头像

CoderWang

当你还撑不起你的梦想时,就要去奋斗。如果缘分安排我们相遇,请不要让她擦肩和过。我们一起奋斗!

微信