2、六边形架构详细目录结构参考.md 36 KB

六边形架构(端口和适配器)目录结构

📋 目录

  1. 单体工程目录结构
  2. 大型微服务工程目录结构
  3. 架构原则与依赖关系
  4. 六边形架构核心概念

🏢 单体工程目录结构

适用场景: 中小型项目,单一限界上下文,需要清晰的技术隔离

order-service/                                    # 订单服务(单体应用)
├── 📁 src/
│   ├── 📁 main/
│   │   ├── 📁 java/io/ddd4j/order/
│   │   │   │
│   │   │   ├── 📁 application/                  # 应用层(用例层)
│   │   │   │   ├── 📁 ports/                    # 端口定义(接口)
│   │   │   │   │   ├── 📁 inbound/             # 入站端口(驱动端)
│   │   │   │   │   │   ├── IOrderService.java          # 订单服务端口
│   │   │   │   │   │   │   ├── createOrder(CreateOrderCmd): OrderId
│   │   │   │   │   │   │   ├── getOrder(OrderId): Order
│   │   │   │   │   │   │   └── cancelOrder(OrderId): void
│   │   │   │   │   │   │
│   │   │   │   │   │   ├── ICustomerService.java       # 客户服务端口
│   │   │   │   │   │   └── IPaymentService.java        # 支付服务端口
│   │   │   │   │   │
│   │   │   │   │   └── 📁 outbound/            # 出站端口(被驱动端)
│   │   │   │   │       ├── IOrderRepository.java       # 订单仓储端口
│   │   │   │   │       │   ├── save(Order): void
│   │   │   │   │       │   ├── findById(OrderId): Order
│   │   │   │   │       │   └── findByCustomer(CustomerId): List<Order>
│   │   │   │   │       │
│   │   │   │   │       ├── ICustomerRepository.java    # 客户仓储端口
│   │   │   │   │       ├── IProductRepository.java     # 产品仓储端口
│   │   │   │   │       │
│   │   │   │   │       ├── IPaymentProvider.java       # 支付提供商端口
│   │   │   │   │       │   └── processPayment(PaymentInfo): PaymentResult
│   │   │   │   │       │
│   │   │   │   │       ├── INotificationService.java   # 通知服务端口
│   │   │   │   │       └── IEventPublisher.java        # 事件发布端口
│   │   │   │   │
│   │   │   │   ├── 📁 services/                 # 应用服务实现
│   │   │   │   │   ├── OrderServiceImpl.java          # 实现IOrderService
│   │   │   │   │   │   ├── @Service
│   │   │   │   │   │   └── implements IOrderService
│   │   │   │   │   │
│   │   │   │   │   ├── CustomerServiceImpl.java        # 实现ICustomerService
│   │   │   │   │   └── PaymentServiceImpl.java         # 实现IPaymentService
│   │   │   │   │
│   │   │   │   ├── 📁 usecases/                 # 具体用例
│   │   │   │   │   ├── 📁 order/                    # 订单用例
│   │   │   │   │   │   ├── CreateOrderUseCase.java
│   │   │   │   │   │   │   ├── execute(CreateOrderCmd): OrderId
│   │   │   │   │   │   │   └── validate(CreateOrderCmd): void
│   │   │   │   │   │   │
│   │   │   │   │   │   ├── ProcessOrderUseCase.java
│   │   │   │   │   │   └── CancelOrderUseCase.java
│   │   │   │   │   │
│   │   │   │   │   ├── 📁 customer/                # 客户用例
│   │   │   │   │   │   ├── RegisterCustomerUseCase.java
│   │   │   │   │   │   └── ValidateCustomerUseCase.java
│   │   │   │   │   │
│   │   │   │   │   └── 📁 dto/                      # 用例DTO
│   │   │   │   │       ├── CreateOrderCmd.java
│   │   │   │   │       ├── OrderDTO.java
│   │   │   │   │       └── PaymentDTO.java
│   │   │   │   │
│   │   │   │   └── 📁 exception/                # 应用层异常
│   │   │   │       ├── ApplicationException.java
│   │   │   │       ├── ValidationException.java
│   │   │   │       └── BusinessRuleException.java
│   │   │   │
│   │   │   ├── 📁 domain/                       # 领域层(核心业务逻辑)
│   │   │   │   ├── 📁 model/                    # 领域模型/实体
│   │   │   │   │   ├── Order.java                # 订单聚合根
│   │   │   │   │   │   ├── OrderId
│   │   │   │   │   │   ├── CustomerId
│   │   │   │   │   │   ├── List<OrderItem>
│   │   │   │   │   │   ├── OrderStatus
│   │   │   │   │   │   ├── Money
│   │   │   │   │   │   ├── place()
│   │   │   │   │   │   ├── pay()
│   │   │   │   │   │   └── cancel()
│   │   │   │   │   │
│   │   │   │   │   ├── OrderItem.java            # 订单项
│   │   │   │   │   ├── Customer.java             # 客户实体
│   │   │   │   │   └── Product.java              # 产品实体
│   │   │   │   │
│   │   │   │   ├── 📁 valueobject/              # 值对象
│   │   │   │   │   ├── OrderId.java
│   │   │   │   │   ├── CustomerId.java
│   │   │   │   │   ├── Money.java
│   │   │   │   │   │   ├── amount: BigDecimal
│   │   │   │   │   │   ├── currency: Currency
│   │   │   │   │   │   ├── add(Money): Money
│   │   │   │   │   │   └── equals(): boolean
│   │   │   │   │   │
│   │   │   │   │   ├── Email.java
│   │   │   │   │   ├── PhoneNumber.java
│   │   │   │   │   ├── Address.java
│   │   │   │   │   └── Quantity.java
│   │   │   │   │
│   │   │   │   ├── 📁 event/                    # 领域事件
│   │   │   │   │   ├── DomainEvent.java         # 基础事件接口
│   │   │   │   │   │   ├── occurredOn(): Instant
│   │   │   │   │   │   └── getAggregateId(): String
│   │   │   │   │   │
│   │   │   │   │   ├── OrderCreatedEvent.java
│   │   │   │   │   ├── OrderPaidEvent.java
│   │   │   │   │   ├── OrderCancelledEvent.java
│   │   │   │   │   └── CustomerRegisteredEvent.java
│   │   │   │   │
│   │   │   │   ├── 📁 service/                  # 领域服务
│   │   │   │   │   ├── OrderValidationService.java
│   │   │   │   │   ├── PricingService.java
│   │   │   │   │   └── InventoryService.java
│   │   │   │   │
│   │   │   │   └── 📁 exception/                # 领域异常
│   │   │   │       ├── DomainException.java
│   │   │   │       └── InvalidStateException.java
│   │   │   │
│   │   │   ├── 📁 infrastructure/               # 基础设施层(适配器实现)
│   │   │   │   ├── 📁 adapter/                  # 适配器实现
│   │   │   │   │   ├── 📁 inbound/             # 入站适配器(驱动适配器)
│   │   │   │   │   │   ├── 📁 web/             # Web适配器
│   │   │   │   │   │   │   ├── 📁 controller/
│   │   │   │   │   │   │   │   ├── OrderController.java           # REST控制器
│   │   │   │   │   │   │   │   │   ├── @RestController
│   │   │   │   │   │   │   │   │   ├── @RequestMapping("/api/orders")
│   │   │   │   │   │   │   │   │   └── implements IOrderService
│   │   │   │   │   │   │   │   │
│   │   │   │   │   │   │   │   ├── CustomerController.java
│   │   │   │   │   │   │   │   └── PaymentController.java
│   │   │   │   │   │   │   │
│   │   │   │   │   │   │   ├── 📁 dto/         # 请求/响应DTO
│   │   │   │   │   │   │   │   ├── 📁 request/
│   │   │   │   │   │   │   │   │   ├── CreateOrderRequest.java
│   │   │   │   │   │   │   │   │   └── UpdateOrderRequest.java
│   │   │   │   │   │   │   │   │
│   │   │   │   │   │   │   │   └── 📁 response/
│   │   │   │   │   │   │   │       ├── OrderResponse.java
│   │   │   │   │   │   │   │       └── ApiResponse.java
│   │   │   │   │   │   │   │
│   │   │   │   │   │   │   ├── 📁 filter/      # Web过滤器
│   │   │   │   │   │   │   │   ├── AuthenticationFilter.java
│   │   │   │   │   │   │   │   ├── LoggingFilter.java
│   │   │   │   │   │   │   │   └── CorsFilter.java
│   │   │   │   │   │   │   │
│   │   │   │   │   │   │   ├── 📁 interceptor/ # 拦截器
│   │   │   │   │   │   │   │   └── PerformanceInterceptor.java
│   │   │   │   │   │   │   │
│   │   │   │   │   │   │   └── 📁 exception/   # 异常处理
│   │   │   │   │   │   │       ├── GlobalExceptionHandler.java
│   │   │   │   │   │   │       └── ErrorResponse.java
│   │   │   │   │   │   │
│   │   │   │   │   │   ├── 📁 cli/         # 命令行适配器
│   │   │   │   │   │   │   └── CommandLineInterface.java
│   │   │   │   │   │   │
│   │   │   │   │   │   ├── 📁 messaging/   # 消息适配器
│   │   │   │   │   │   │   ├── OrderMessageConsumer.java
│   │   │   │   │   │   │   └── EventSubscriber.java
│   │   │   │   │   │   │
│   │   │   │   │   │   └── 📁 scheduled/   # 定时任务适配器
│   │   │   │   │   │       └── OrderCleanupScheduler.java
│   │   │   │   │   │
│   │   │   │   │   └── 📁 outbound/        # 出站适配器(被驱动适配器)
│   │   │   │   │       ├── 📁 persistence/  # 持久化适配器
│   │   │   │   │       │   ├── 📁 repositoryimpl/
│   │   │   │   │       │   │   ├── OrderRepositoryImpl.java    # 实现IOrderRepository
│   │   │   │   │       │   │   ├── CustomerRepositoryImpl.java
│   │   │   │   │       │   │   └── ProductRepositoryImpl.java
│   │   │   │   │       │   │
│   │   │   │   │       │   ├── 📁 mapper/
│   │   │   │   │       │   │   ├── OrderMapper.java           # MyBatis Mapper
│   │   │   │   │       │   │   └── OrderDataMapper.java      # DO<->Entity转换
│   │   │   │   │       │   │
│   │   │   │   │       │   └── 📁 entity/
│   │   │   │   │       │       ├── OrderEntity.java           # JPA/MyBatis实体
│   │   │   │   │       │       ├── CustomerEntity.java
│   │   │   │   │       │       └── ProductEntity.java
│   │   │   │   │       │
│   │   │   │   │       ├── 📁 external/     # 外部服务适配器
│   │   │   │   │       │   ├── PaymentProviderAdapter.java   # 实现IPaymentProvider
│   │   │   │   │       │   │   ├── @Service
│   │   │   │   │       │   │   └── implements IPaymentProvider
│   │   │   │   │       │   │
│   │   │   │   │       │   ├── EmailServiceAdapter.java     # 实现INotificationService
│   │   │   │   │       │   │   ├── SMSServiceAdapter.java
│   │   │   │   │       │   │   └── ThirdPartyApiClient.java
│   │   │   │   │       │
│   │   │   │   │       ├── 📁 messaging/   # 消息适配器
│   │   │   │   │       │   ├── EventPublisherAdapter.java   # 实现IEventPublisher
│   │   │   │   │       │   ├── MessageProducer.java
│   │   │   │   │       │   └── QueueSender.java
│   │   │   │   │       │
│   │   │   │   │       └── 📁 cache/       # 缓存适配器
│   │   │   │   │           ├── RedisCacheAdapter.java
│   │   │   │   │           └── LocalCacheAdapter.java
│   │   │   │   │
│   │   │   │   ├── 📁 config/                   # 配置类
│   │   │   │   │   ├── DatabaseConfig.java
│   │   │   │   │   ├── WebConfig.java
│   │   │   │   │   ├── SecurityConfig.java
│   │   │   │   │   ├── CacheConfig.java
│   │   │   │   │   └── BeanConfig.java
│   │   │   │   │
│   │   │   │   ├── 📁 database/                 # 数据库相关
│   │   │   │   │   ├── 📁 migration/
│   │   │   │   │   │   ├── V1__init.sql
│   │   │   │   │   │   └── V2__add_orders.sql
│   │   │   │   │   │
│   │   │   │   │   └── 📁 enums/
│   │   │   │   │       ├── OrderStatus.java
│   │   │   │   │       └── UserRole.java
│   │   │   │   │
│   │   │   │   └── 📁 security/                 # 安全相关
│   │   │   │       ├── JwtTokenProvider.java
│   │   │   │       ├── PasswordEncoder.java
│   │   │   │       └── SecurityUtils.java
│   │   │   │
│   │   │   ├── 📁 shared/                       # 共享组件
│   │   │   │   ├── 📁 kernel/                   # 核心共享
│   │   │   │   │   ├── BaseEntity.java
│   │   │   │   │   ├── AggregateRoot.java
│   │   │   │   │   ├── ValueObject.java
│   │   │   │   │   └── Identifier.java
│   │   │   │   │
│   │   │   │   ├── 📁 util/                     # 工具类
│   │   │   │   │   ├── DateUtils.java
│   │   │   │   │   ├── StringUtils.java
│   │   │   │   │   ├── Validator.java
│   │   │   │   │   └── ObjectMapperUtils.java
│   │   │   │   │
│   │   │   │   ├── 📁 constants/                # 常量定义
│   │   │   │   │   ├── AppConstants.java
│   │   │   │   │   ├── ErrorCodes.java
│   │   │   │   │   └── ValidationMessages.java
│   │   │   │   │
│   │   │   │   └── 📁 exception/                # 全局异常
│   │   │   │       ├── GlobalException.java
│   │   │   │       ├── ErrorResponse.java
│   │   │   │       └── ExceptionHandler.java
│   │   │   │
│   │   │   └── OrderApplication.java           # 应用启动类
│   │   │       ├── @SpringBootApplication
│   │   │       └── main(String[] args)
│   │   │
│   │   └── 📁 resources/
│   │       ├── application.yml
│   │       ├── application-dev.yml
│   │       ├── application-prod.yml
│   │       ├── 📁 db/
│   │       │   ├── migration/
│   │       │   └── seed/
│   │       ├── 📁 i18n/
│   │       │   ├── messages.properties
│   │       │   └── messages_zh.properties
│   │       ├── 📁 templates/
│   │       │   └── email/
│   │       ├── logback-spring.xml
│   │       └── banner.txt
│   │
│   └── 📁 test/
│       ├── 📁 unit/
│       │   ├── 📁 domain/
│       │   │   ├── OrderTest.java
│       │   │   └── MoneyTest.java
│       │   ├── 📁 application/
│       │   │   └── CreateOrderUseCaseTest.java
│       │   └── 📁 infrastructure/
│       │       └── OrderRepositoryImplTest.java
│       │
│       ├── 📁 integration/
│       │   └── OrderIntegrationTest.java
│       │
│       └── 📁 e2e/
│           └── ApiE2ETest.java
│
├── 📁 docker/
│   ├── Dockerfile
│   └── docker-compose.yml
│
├── pom.xml
├── README.md
└── .gitignore

🏢 大型微服务工程目录结构

适用场景: 大型企业项目,多限界上下文,需要独立部署和技术隔离

ecommerce-platform/                                  # 电商平台(微服务父工程)
│
├── 📁 order-service/                              # 订单服务(独立微服务)
│   ├── 📁 order-api/                              # API模块(端口定义)
│   │   ├── 📁 src/main/java/io/ddd4j/order/api/
│   │   │   ├── 📁 ports/                          # 端口接口
│   │   │   │   ├── 📁 inbound/
│   │   │   │   │   ├── IOrderService.java         # 订单服务端口
│   │   │   │   │   ├── ICustomerService.java
│   │   │   │   │   └── IPaymentService.java
│   │   │   │   │
│   │   │   │   └── 📁 outbound/
│   │   │   │       ├── IOrderRepository.java      # 仓储端口
│   │   │   │       ├── ICustomerRepository.java
│   │   │   │       ├── IPaymentProvider.java      # 支付端口
│   │   │   │       └── IEventPublisher.java       # 事件发布端口
│   │   │   │
│   │   │   └── 📁 dto/                            # API DTO
│   │   │       ├── CreateOrderCmd.java
│   │   │       ├── OrderDTO.java
│   │   │       └── OrderItemDTO.java
│   │   │
│   │   └── pom.xml
│   │
│   ├── 📁 order-domain/                           # 领域模块(核心业务)
│   │   ├── 📁 src/main/java/io/ddd4j/order/domain/
│   │   │   ├── 📁 model/
│   │   │   │   ├── Order.java                     # 聚合根
│   │   │   │   ├── OrderItem.java
│   │   │   │   ├── Customer.java
│   │   │   │   └── Product.java
│   │   │   │
│   │   │   ├── 📁 valueobject/
│   │   │   │   ├── OrderId.java
│   │   │   │   ├── Money.java
│   │   │   │   └── Email.java
│   │   │   │
│   │   │   ├── 📁 event/
│   │   │   │   ├── OrderCreatedEvent.java
│   │   │   │   └── OrderPaidEvent.java
│   │   │   │
│   │   │   ├── 📁 service/
│   │   │   │   └── OrderValidationService.java
│   │   │   │
│   │   │   └── 📁 exception/
│   │   │       └── DomainException.java
│   │   │
│   │   └── pom.xml
│   │
│   ├── 📁 order-application/                      # 应用模块(用例实现)
│   │   ├── 📁 src/main/java/io/ddd4j/order/application/
│   │   │   ├── 📁 services/
│   │   │   │   ├── OrderServiceImpl.java           # 实现IOrderService
│   │   │   │   └── CustomerServiceImpl.java
│   │   │   │
│   │   │   ├── 📁 usecases/
│   │   │   │   ├── CreateOrderUseCase.java
│   │   │   │   ├── ProcessOrderUseCase.java
│   │   │   │   └── CancelOrderUseCase.java
│   │   │   │
│   │   │   └── 📁 exception/
│   │   │       └── ApplicationException.java
│   │   │
│   │   └── pom.xml
│   │
│   ├── 📁 order-infrastructure/                   # 基础设施模块(适配器实现)
│   │   ├── 📁 src/main/java/io/ddd4j/order/infrastructure/
│   │   │   ├── 📁 adapter/
│   │   │   │   ├── 📁 inbound/
│   │   │   │   │   ├── 📁 web/
│   │   │   │   │   │   ├── OrderController.java   # REST适配器
│   │   │   │   │   │   └── dto/
│   │   │   │   │   │
│   │   │   │   │   ├── 📁 messaging/
│   │   │   │   │   │   └── OrderEventConsumer.java  # 消息适配器
│   │   │   │   │   │
│   │   │   │   │   └── 📁 cli/
│   │   │   │   │       └── CommandLineAdapter.java
│   │   │   │   │
│   │   │   │   └── 📁 outbound/
│   │   │   │       ├── 📁 persistence/
│   │   │   │       │   ├── OrderRepositoryImpl.java    # 持久化适配器
│   │   │   │       │   ├── OrderMapper.java
│   │   │   │       │   └── OrderEntity.java
│   │   │   │       │
│   │   │   │       ├── 📁 external/
│   │   │   │       │   ├── PaymentProviderAdapter.java   # 外部服务适配器
│   │   │   │       │   └── EmailServiceAdapter.java
│   │   │   │       │
│   │   │   │       └── 📁 messaging/
│   │   │   │           └── EventPublisherAdapter.java   # 消息发布适配器
│   │   │   │
│   │   │   ├── 📁 config/
│   │   │   │   ├── DatabaseConfig.java
│   │   │   │   ├── WebConfig.java
│   │   │   │   └── SecurityConfig.java
│   │   │   │
│   │   │   └── 📁 security/
│   │   │       └── JwtTokenProvider.java
│   │   │
│   │   └── pom.xml
│   │
│   ├── 📁 order-start/                             # 启动模块
│   │   ├── 📁 src/main/java/io/ddd4j/order/
│   │   │   └── OrderApplication.java
│   │   │
│   │   ├── 📁 src/main/resources/
│   │   │   ├── application.yml
│   │   │   └── 📁 mapper/
│   │   │
│   │   └── pom.xml
│   │
│   └── pom.xml                                     # 订单服务父POM
│
├── 📁 customer-service/                           # 客户服务(独立微服务)
│   ├── 📁 customer-api/                           # 客户API模块
│   │   └── 📁 src/main/java/io/ddd4j/customer/api/
│   │       ├── 📁 ports/
│   │       │   ├── ICustomerService.java
│   │       │   └── ICustomerRepository.java
│   │       └── 📁 dto/
│   │
│   ├── 📁 customer-domain/                        # 客户领域模块
│   │   └── 📁 src/main/java/io/ddd4j/customer/domain/
│   │       ├── 📁 model/
│   │       │   └── Customer.java
│   │       └── 📁 valueobject/
│   │           └── Email.java
│   │
│   ├── 📁 customer-application/                   # 客户应用模块
│   │   └── 📁 src/main/java/io/ddd4j/customer/application/
│   │       └── 📁 services/
│   │           └── CustomerServiceImpl.java
│   │
│   ├── 📁 customer-infrastructure/               # 客户基础设施模块
│   │   └── 📁 src/main/java/io/ddd4j/customer/infrastructure/
│   │       └── 📁 adapter/
│   │           ├── 📁 inbound/
│   │           │   └── 📁 web/
│   │           │       └── CustomerController.java
│   │           └── 📁 outbound/
│   │               └── 📁 persistence/
│   │                   └── CustomerRepositoryImpl.java
│   │
│   ├── 📁 customer-start/                         # 客户启动模块
│   │   └── 📁 src/main/java/io/ddd4j/customer/
│   │       └── CustomerApplication.java
│   │
│   └── pom.xml
│
├── 📁 payment-service/                            # 支付服务(独立微服务)
│   ├── 📁 payment-api/
│   ├── 📁 payment-domain/
│   ├── 📁 payment-application/
│   ├── 📁 payment-infrastructure/
│   └── 📁 payment-start/
│
├── 📁 product-service/                            # 产品服务(独立微服务)
│   ├── 📁 product-api/
│   ├── 📁 product-domain/
│   ├── 📁 product-application/
│   ├── 📁 product-infrastructure/
│   └── 📁 product-start/
│
├── 📁 shared-kernel/                              # 共享内核
│   ├── 📁 shared-domain/                          # 共享领域模块
│   │   └── 📁 src/main/java/io/ddd4j/shared/domain/
│   │       ├── 📁 model/
│   │       │   ├── Money.java
│   │       │   └── Email.java
│   │       └── 📁 event/
│   │           └── DomainEvent.java
│   │
│   ├── 📁 shared-infrastructure/                  # 共享基础设施
│   │   └── 📁 src/main/java/io/ddd4j/shared/infrastructure/
│   │       ├── 📁 config/
│   │       │   └── CommonConfig.java
│   │       └── 📁 util/
│   │           └── JsonUtils.java
│   │
│   └── pom.xml
│
├── 📁 gateway/                                    # API网关
│   └── 📁 src/main/java/io/ddd4j/gateway/
│       ├── GatewayApplication.java
│       └── 📁 filter/
│           ├── AuthFilter.java
│           └── RateLimitFilter.java
│
├── 📁 docker/                                     # Docker编排
│   ├── docker-compose.yml
│   └── 📁 docker/
│       ├── order-service/
│       ├── customer-service/
│       └── gateway/
│
├── 📁 k8s/                                        # Kubernetes配置
│   ├── 📁 order-service/
│   │   ├── deployment.yaml
│   │   └── service.yaml
│   │
│   ├── 📁 customer-service/
│   └── 📁 gateway/
│
├── pom.xml                                        # 父POM
├── README.md
└── .gitignore

🏗 架构原则与依赖关系

六边形架构核心原则

         ┌─────────────────────────────────────┐
         │         应用层(Application)          │
         │  - 用例(Use Cases)                 │
         │  - 应用服务(Application Services)   │
         └─────────────────────────────────────┘
                      ↑           ↓
    ┌─────────────────┴─────────────┴─────────────────┐
    │                    端口(Ports)                    │
    │         - 入站端口(Inbound/Driving)              │
    │         - 出站端口(Outbound/Driven)              │
    └─────────────────────────────────────────────────┘
                      ↑           ↓
    ┌─────────────────┴─────────────┴─────────────────┐
    │                适配器(Adapters)                  │
    │  - 入站适配器:Web、CLI、Messaging               │
    │  - 出站适配器:Database、External API、Cache     │
    └─────────────────────────────────────────────────┘

依赖规则

适配器(Adapters) → 端口(Ports) ← 应用层(Application) ← 领域层(Domain)
  • 领域层:完全独立,无任何外部依赖
  • 应用层:依赖领域层,定义端口接口
  • 基础设施层:实现应用层定义的端口
  • 适配器:通过端口与应用层交互

🎯 六边形架构核心概念

1. 端口(Ports)

端口是应用与外部世界交互的接口,分为两类:

入站端口(Inbound/Driving Ports)

定义应用对外提供的服务能力:

// application/ports/inbound/IOrderService.java
public interface IOrderService {
    OrderId createOrder(CreateOrderCmd cmd);
    Order getOrder(OrderId id);
    void cancelOrder(OrderId id);
    List<Order> getCustomerOrders(CustomerId customerId);
}

出站端口(Outbound/Driven Ports)

定义应用依赖的外部服务:

// application/ports/outbound/IOrderRepository.java
public interface IOrderRepository {
    void save(Order order);
    Optional<Order> findById(OrderId id);
    List<Order> findByCustomer(CustomerId customerId);
}

// application/ports/outbound/IPaymentProvider.java
public interface IPaymentProvider {
    PaymentResult processPayment(PaymentInfo paymentInfo);
}

// application/ports/outbound/IEventPublisher.java
public interface IEventPublisher {
    void publish(DomainEvent event);
}

2. 适配器(Adapters)

适配器是端口的具体实现,分为两类:

入站适配器(Inbound/Driving Adapters)

驱动应用执行的适配器:

// infrastructure/adapter/inbound/web/OrderController.java
@RestController
@RequestMapping("/api/orders")
public class OrderController implements IOrderService {

    private final IOrderService orderService; // 注入端口

    @PostMapping
    public ResponseEntity<OrderResponse> createOrder(@RequestBody CreateOrderRequest request) {
        CreateOrderCmd cmd = toCommand(request);
        OrderId orderId = orderService.createOrder(cmd);
        return ResponseEntity.ok(new OrderResponse(orderId));
    }

    @GetMapping("/{id}")
    public ResponseEntity<OrderResponse> getOrder(@PathVariable String id) {
        Order order = orderService.getOrder(new OrderId(id));
        return ResponseEntity.ok(toResponse(order));
    }
}

出站适配器(Outbound/Driven Adapters)

被应用调用的适配器:

// infrastructure/adapter/outbound/persistence/OrderRepositoryImpl.java
@Repository
public class OrderRepositoryImpl implements IOrderRepository {

    private final OrderMapper orderMapper;

    @Override
    public void save(Order order) {
        OrderEntity entity = toEntity(order);
        orderMapper.insert(entity);
    }

    @Override
    public Optional<Order> findById(OrderId id) {
        OrderEntity entity = orderMapper.selectById(id.getValue());
        return Optional.ofNullable(toDomain(entity));
    }
}

// infrastructure/adapter/outbound/external/PaymentProviderAdapter.java
@Service
public class PaymentProviderAdapter implements IPaymentProvider {

    private final AlipayClient alipayClient;

    @Override
    public PaymentResult processPayment(PaymentInfo paymentInfo) {
        // 调用支付宝API
        return alipayClient.pay(paymentInfo);
    }
}

3. 用例(Use Cases)

用例封装特定的业务流程:

// application/usecases/order/CreateOrderUseCase.java
@Component
public class CreateOrderUseCase {

    private final IOrderRepository orderRepository;
    private final ICustomerRepository customerRepository;
    private final IProductRepository productRepository;
    private final IEventPublisher eventPublisher;

    public OrderId execute(CreateOrderCmd cmd) {
        // 1. 验证客户
        Customer customer = customerRepository.findById(cmd.getCustomerId())
            .orElseThrow(() -> new CustomerNotFoundException(cmd.getCustomerId()));

        // 2. 创建订单
        Order order = Order.create(
            customer.getId(),
            cmd.getItems(),
            cmd.getShippingAddress()
        );

        // 3. 保存订单
        orderRepository.save(order);

        // 4. 发布事件
        eventPublisher.publish(new OrderCreatedEvent(
            order.getId(),
            customer.getId(),
            order.getTotalAmount()
        ));

        return order.getId();
    }
}

4. 依赖注入配置

// infrastructure/config/BeanConfig.java
@Configuration
public class BeanConfig {

    // 出站适配器Bean
    @Bean
    public IOrderRepository orderRepository(OrderMapper orderMapper) {
        return new OrderRepositoryImpl(orderMapper);
    }

    @Bean
    public IPaymentProvider paymentProvider(AlipayClient alipayClient) {
        return new PaymentProviderAdapter(alipayClient);
    }

    @Bean
    public IEventPublisher eventPublisher(KafkaTemplate<String, String> kafkaTemplate) {
        return new KafkaEventPublisherAdapter(kafkaTemplate);
    }

    // 应用服务Bean
    @Bean
    public IOrderService orderService(
        IOrderRepository orderRepository,
        IPaymentProvider paymentProvider,
        IEventPublisher eventPublisher
    ) {
        return new OrderServiceImpl(
            orderRepository,
            paymentProvider,
            eventPublisher
        );
    }
}

📚 权威参考

六边形架构创始人

  • Alistair Cockburn - 六边形架构(端口和适配器)创始人

核心理念

  1. 隔离领域逻辑:领域层完全独立,不依赖任何技术实现
  2. 端口隔离:通过端口接口解耦应用与外部世界
  3. 适配器可替换:适配器可以轻松替换而不影响应用核心
  4. 测试友好:可以轻松mock端口进行测试

最佳实践

// 测试示例:使用Mock端口
class CreateOrderUseCaseTest {

    @Test
    void should_create_order_successfully() {
        // Given: Mock出站端口
        IOrderRepository mockRepo = mock(IOrderRepository.class);
        ICustomerRepository mockCustomerRepo = mock(ICustomerRepository.class);
        IEventPublisher mockPublisher = mock(IEventPublisher.class);

        // Setup mock behavior
        when(mockCustomerRepo.findById(any())).thenReturn(Optional.of(customer));

        // When: 执行用例
        CreateOrderUseCase useCase = new CreateOrderUseCase(
            mockRepo, mockCustomerRepo, mockPublisher
        );
        OrderId orderId = useCase.execute(cmd);

        // Then: 验证交互
        verify(mockRepo).save(any(Order.class));
        verify(mockPublisher).publish(any(OrderCreatedEvent.class));
    }
}

🔄 与其他架构的关系

六边形架构 vs DDD 分层架构

方面 六边形架构 DDD 分层架构
核心理念 端口和适配器 领域驱动设计
依赖方向 适配器 → 端口 ← 应用 接口 → 应用 → 领域 ← 基础设施
关注点 技术隔离 业务领域建模
适用场景 需要技术替换的场景 复杂业务领域

六边形架构 vs 整洁架构

  • 六边形架构是整洁架构的前身
  • 整洁架构更强调同心圆层次结构
  • 两者都遵循依赖倒置原则

💡 选择建议

选择六边形架构的场景:

  1. 需要频繁更换技术实现(如数据库、消息队列)
  2. 多种驱动方式(Web、CLI、消息)
  3. 高度可测试性要求
  4. 清晰的技术边界需求

不选择六边形架构的场景:

  1. 简单CRUD应用
  2. 固定技术栈,不需要替换
  3. 小型团队,快速迭代

🚀 快速开始

# 创建六边形架构项目
mvn archetype:generate \
  -DarchetypeGroupId=io.ddd4j.boot \
  -DarchetypeArtifactId=hexagonal-archetype \
  -DarchetypeVersion=3.3.x