mcpField
J
java-architect

java-architect

github.com/404kidwiz开发148 次安装
代码仓库

关于 java-architect

面向 Java 开发者的架构设计技能,专注 Java 21、Spring Boot 3 和 Jakarta EE。内容涵盖微服务、现代 Java 特性、性能优化及企业集成模式。

主要功能

  1. 01设计微服务与单体架构
  2. 02应用 Java 21 语言特性
  3. 03提供 Spring 生态开发指导
  4. 04优化 JVM 与数据库性能
  5. 05涵盖事件驱动及领域设计模式

适用场景

  1. 01设计 Spring Boot 微服务
  2. 02评估 JPA 与 JDBC 的选型
  3. 03构建 Kafka 事件驱动系统
  4. 04排查 JVM 或数据库性能问题

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/404kidwiz/claude-supercode-skills --skill java-architect

安装后在 Claude Code 中输入/java-architect确认已加载。

详细介绍

Java 架构专家

目的

提供专业的 Java 架构知识,专注于 Java 21、Spring Boot 3 和 Jakarta EE 生态系统。使用现代 Java 特性(虚拟线程、模式匹配)、微服务架构和全面的企业集成模式,设计可扩展、易维护的企业级应用。

适用场景

  • 使用 Spring Boot 3 构建企业应用(微服务、REST API)
  • 实现 Java 21 特性(虚拟线程、模式匹配、记录类、密封类)
  • 使用 Spring Cloud 设计微服务架构(服务发现、熔断器)
  • 开发 Jakarta EE 应用(CDI、JPA、JAX-RS)
  • 使用 Spring WebFlux 创建响应式应用
  • 构建事件驱动系统(Kafka、RabbitMQ)
  • 优化 JVM 性能(GC 调优、性能分析)

核心能力

企业架构
  • 设计微服务和单体架构
  • 实现领域驱动设计模式(聚合、限界上下文)
  • 配置 Spring Cloud 生态系统(Eureka、Config、Gateway)
  • 使用 OpenAPI/Swagger 构建 API 优先架构
现代 Java 开发
  • 使用 Java 21 虚拟线程实现高并发
  • 使用模式匹配和密封类保证类型安全
  • 使用记录类和数据类构建不可变模型
  • 使用流应用函数式编程模式
Spring 生态系统
  • Spring Boot 应用配置和部署
  • 使用 Spring Data JPA 进行数据库访问和优化
  • 使用 Spring Security 进行身份验证和授权
  • 使用 Spring WebFlux 构建响应式、非阻塞应用
性能优化
  • JVM 调优和垃圾回收配置
  • 内存分析和泄漏检测
  • 连接池和数据库优化
  • 使用 GraalVM 优化应用启动


2. 决策框架

Spring 框架选择决策树
Application Requirements
│
├─ Need reactive, non-blocking I/O?
│  └─ Spring WebFlux ✓
│     - Netty/Reactor runtime
│     - Backpressure support
│     - High concurrency (100K+ connections)
│
├─ Traditional servlet-based web app?
│  └─ Spring MVC ✓
│     - Tomcat/Jetty runtime
│     - Familiar blocking model
│     - Easier debugging
│
├─ Microservices with service discovery?
│  └─ Spring Cloud ✓
│     - Eureka/Consul for discovery
│     - Config server
│     - API gateway (Spring Cloud Gateway)
│
├─ Batch processing?
│  └─ Spring Batch ✓
│     - Chunk-oriented processing
│     - Job scheduling
│     - Transaction management
│
└─ Need minimal footprint?
   └─ Spring Boot with GraalVM Native Image ✓
      - AOT compilation
      - Fast startup (<100ms)
      - Low memory (<50MB)
JPA 与 JDBC 决策矩阵
因素使用 JPA/Hibernate使用 JDBC(Spring JdbcTemplate)
复杂度带关联关系的复杂领域模型简单查询、报表
性能带缓存的 OLTP(二级缓存)OLAP、批量操作
类型安全Criteria API、类型安全查询使用 RowMapper 的纯 SQL
维护使用迁移管理模式演进直接控制 SQL
学习曲线较陡(延迟加载、级联)更简单、明确
N+1 查询有风险(需要 @EntityGraph、抓取连接)显式控制

决策示例:具有关联关系的电商订单系统 → JPA(Order → OrderItems → Products)
决策示例:带聚合计算的分析仪表板 → JDBC(复杂 SQL、性能关键)

虚拟线程(Project Loom)决策路径
Concurrency Requirements
│
├─ High thread count (>1000 threads)?
│  └─ Virtual Threads ✓
│     - Millions of threads possible
│     - No thread pool tuning
│     - Blocking code becomes cheap
│
├─ I/O-bound operations (DB, HTTP)?
│  └─ Virtual Threads ✓
│     - JDBC calls don't block platform threads
│     - HTTP client calls scale better
│
├─ CPU-bound operations?
│  └─ Platform Threads (ForkJoinPool) ✓
│     - Virtual threads don't help
│     - Use parallel streams
│
└─ Need compatibility with existing code?
   └─ Virtual Threads ✓
      - Drop-in replacement for Thread
      - No code changes required
升级至 Oracle 处理的危险信号
观察结果升级原因示例
JPA N+1 查询导致 1000+ 次数据库调用复杂的延迟加载问题“单次页面加载触发 500 条 SELECT 查询”
Spring Bean 存在循环依赖架构设计问题“启动时出现 BeanCurrentlyInCreationException”
尽管调整了 GC,仍发生内存泄漏对象保留问题复杂“Full GC 后堆仍增长至上限,堆转储显示异常对象保留”
分布式事务跨越多个微服务SAGA 模式或补偿事务“需要在 Order、Payment、Inventory 服务之间实现 ACID”
响应式流背压过载响应式流水线复杂“Flux 产出过快,下游无法跟上”


工作流 2:使用 Kafka 的事件驱动微服务

场景:为订单服务实现事件溯源

步骤 1:配置 Spring Kafka

// Configuration/KafkaConfig.java
@Configuration
@EnableKafka
public class KafkaConfig {
    
    @Value("${spring.kafka.bootstrap-servers}")
    private String bootstrapServers;
    
    @Bean
    public ProducerFactory<String, DomainEvent> producerFactory() {
        Map<String, Object> config = Map.of(
            ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers,
            ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class,
            ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, JsonSerializer.class,
            ProducerConfig.ACKS_CONFIG, "all",
            ProducerConfig.RETRIES_CONFIG, 3,
            ProducerConfig.ENABLE_IDEMPOTENCE_CONFIG, true
        );
        
        return new DefaultKafkaProducerFactory<>(config);
    }
    
    @Bean
    public KafkaTemplate<String, DomainEvent> kafkaTemplate() {
        return new KafkaTemplate<>(producerFactory());
    }
    
    @Bean
    public ConsumerFactory<String, DomainEvent> consumerFactory() {
        Map<String, Object> config = Map.of(
            ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers,
            ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class,
            ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, JsonDeserializer.class,
            ConsumerConfig.GROUP_ID_CONFIG, "order-service",
            ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest",
            ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, false,
            JsonDeserializer.TRUSTED_PACKAGES, "com.example.order.domain.events"
        );
        
        return new DefaultKafkaConsumerFactory<>(config);
    }
}

步骤 2:定义领域事件

// Domain/Events/DomainEvent.java
public sealed interface DomainEvent permits 
    OrderCreated, OrderItemAdded, OrderProcessingStarted, OrderCompleted, OrderCancelled {
    
    UUID aggregateId();
    LocalDateTime occurredAt();
    long version();
}

public record OrderCreated(
    UUID aggregateId,
    UUID customerId,
    LocalDateTime occurredAt,
    long version
) implements DomainEvent {}

public record OrderItemAdded(
    UUID aggregateId,
    UUID productId,
    int quantity,
    BigDecimal unitPrice,
    LocalDateTime occurredAt,
    long version
) implements DomainEvent {}

public record OrderCompleted(
    UUID aggregateId,
    BigDecimal totalAmount,
    LocalDateTime occurredAt,
    long version
) implements DomainEvent {}

步骤 3:事件发布者

// Infrastructure/EventPublisher.java
@Component
public class DomainEventPublisher {
    
    private final KafkaTemplate<String, DomainEvent> kafkaTemplate;
    private static final String TOPIC = "order-events";
    
    public DomainEventPublisher(KafkaTemplate<String, DomainEvent> kafkaTemplate) {
        this.kafkaTemplate = kafkaTemplate;
    }
    
    @Async
    public CompletableFuture<Void> publish(DomainEvent event) {
        return kafkaTemplate.send(TOPIC, event.aggregateId().toString(), event)
            .thenAccept(result -> {
                var metadata = result.getRecordMetadata();
                log.info("Published event: {} to partition {} offset {}",
                    event.getClass().getSimpleName(),
                    metadata.partition(),
                    metadata.offset());
            })
            .exceptionally(ex -> {
                log.error("Failed to publish event: {}", event, ex);
                return null;
            });
    }
}

步骤 4:事件消费者

// Infrastructure/OrderEventConsumer.java
@Component
public class OrderEventConsumer {
    
    private final OrderProjectionService projectionService;
    
    @KafkaListener(
        topics = "order-events",
        groupId = "order-read-model",
        containerFactory = "kafkaListenerContainerFactory"
    )
    public void handleEvent(
        @Payload DomainEvent event,
        @Header(KafkaHeaders.RECEIVED_PARTITION) int partition,
        @Header(KafkaHeaders.OFFSET) long offset
    ) {
        log.info("Received event: {} from partition {} offset {}", 
            event.getClass().getSimpleName(), partition, offset);
        
        switch (event) {
            case OrderCreated e -> projectionService.handleOrderCreated(e);
            case OrderItemAdded e -> projectionService.handleOrderItemAdded(e);
            case OrderCompleted e -> projectionService.handleOrderCompleted(e);
            case OrderCancelled e -> projectionService.handleOrderCancelled(e);
            default -> log.warn("Unknown event type: {}", event);
        }
    }
}

预期结果:

  • 使用 Kafka 的事件驱动架构
  • 类型安全的事件处理(密封接口、模式匹配)
  • 使用 CompletableFuture 异步发布事件
  • 幂等事件处理


4. 模式与模板

模式 1:使用 Specifications 的仓储模式

用例:类型安全的动态查询

// Specification for dynamic filtering
public class OrderSpecifications {
    
    public static Specification<Order> hasCustomerId(CustomerId customerId) {
        return (root, query, cb) -> 
            cb.equal(root.get("customerId"), customerId);
    }
    
    public static Specification<Order> hasStatus(OrderStatus status) {
        return (root, query, cb) -> 
            cb.equal(root.get("status"), status);
    }
    
    public static Specification<Order> createdBetween(LocalDateTime start, LocalDateTime end) {
        return (root, query, cb) -> 
            cb.between(root.get("createdAt"), start, end);
    }
    
    public static Specification<Order> totalGreaterThan(BigDecimal amount) {
        return (root, query, cb) -> 
            cb.greaterThan(root.get("totalAmount"), amount);
    }
}

// Usage: Combine specifications
Specification<Order> spec = Specification
    .where(hasCustomerId(customerId))
    .and(hasStatus(new OrderStatus.Pending()))
    .and(createdBetween(startDate, endDate));

List<Order> orders = orderRepository.findAll(spec);


模式 3:读写模型分离的 CQRS

用例:独立优化读取和写入

// Write model (domain entity)
@Entity
public class Order {
    // Rich behavior, complex relationships
    public void addItem(Product product, int quantity) { ... }
    public void complete() { ... }
}

// Read model (denormalized projection)
@Entity
@Table(name = "order_summary")
@Immutable
public class OrderSummary {
    
    @Id
    private UUID orderId;
    private UUID customerId;
    private String customerName;
    private int itemCount;
    private BigDecimal totalAmount;
    private String status;
    private LocalDateTime createdAt;
    
    // Getters only (no setters, immutable)
}

// Read repository (optimized queries)
public interface OrderSummaryRepository extends JpaRepository<OrderSummary, UUID> {
    
    @Query("""
        SELECT os FROM OrderSummary os
        WHERE os.customerId = :customerId
        ORDER BY os.createdAt DESC
        """)
    List<OrderSummary> findByCustomerId(@Param("customerId") UUID customerId);
}


❌ 反模式:LazyInitializationException

表现形式:

@Service
@Transactional
public class OrderService {
    
    public Order findById(OrderId id) {
        return orderRepository.findById(id).orElseThrow();
    }
}

@RestController
public class OrderController {
    
    @GetMapping("/orders/{id}")
    public OrderDto getOrder(@PathVariable UUID id) {
        Order order = orderService.findById(new OrderId(id));
        
        // Transaction already closed!
        var items = order.getItems(); // LazyInitializationException!
        
        return new OrderDto(order, items);
    }
}

失败原因:

  • 事务外延迟加载:Hibernate 代理无法加载数据
  • N+1 查询:即使事务处于打开状态,延迟加载也会触发多次查询

正确做法:

// Option 1: Eager fetch with @EntityGraph
@Repository
public interface OrderRepository extends JpaRepository<Order, OrderId> {
    
    @EntityGraph(attributePaths = {"items", "items.product"})
    Optional<Order> findById(OrderId id);
}

// Option 2: DTO projection (no lazy loading)
@Query("""
    SELECT new com.example.dto.OrderDto(
        o.id, o.customerId, o.totalAmount,
        COUNT(i.id), o.status, o.createdAt
    )
    FROM Order o
    LEFT JOIN o.items i
    WHERE o.id = :id
    GROUP BY o.id, o.customerId, o.totalAmount, o.status, o.createdAt
    """)
Optional<OrderDto> findOrderDtoById(@Param("id") OrderId id);

// Option 3: Open Session in View (not recommended for APIs)
spring.jpa.open-in-view: false  // Disable to catch lazy loading issues early


6. 集成模式

backend-developer:
  • 交接:Backend-developer 定义业务逻辑 → java-architect 使用 Spring Boot 模式实现
  • 协作:REST API 设计、数据库架构、身份验证/授权
  • 工具:Spring Boot、Spring Security、Spring Data JPA、Jackson
  • 示例:Backend 定义订单工作流 → java-architect 使用 DDD 聚合和领域事件实现
database-optimizer:
  • 交接:Java-architect 发现运行缓慢的 JPA 查询 → database-optimizer 创建索引
  • 协作:查询优化、连接池、事务调优
  • 工具:Hibernate 统计信息、JPA Criteria API、原生查询
  • 示例:N+1 查询问题 → database-optimizer 为外键添加复合索引
devops-engineer:
  • 交接:Java-architect 构建 Spring Boot 应用 → devops-engineer 使用 Docker 将其容器化
  • 协作:健康检查、指标(Actuator)、优雅关闭
  • 工具:Spring Boot Actuator、Micrometer、Docker 多阶段构建
  • 示例:Java-architect 暴露 /actuator/health → devops-engineer 配置 Kubernetes 存活探针
kubernetes-specialist:
  • 交接:Java-architect 构建微服务 → kubernetes-specialist 将其部署到 K8s
  • 协作:就绪探针、资源限制、滚动更新
  • 工具:Spring Cloud Kubernetes、ConfigMaps、Secrets
  • 示例:Java-architect 使用 @ConfigurationProperties → kubernetes-specialist 提供 ConfigMap
graphql-architect:
  • 交接:Java-architect 提供领域模型 → graphql-architect 将其公开为 GraphQL API
  • 协作:Schema 设计、使用 DataLoader 防止 N+1 问题
  • 工具:Spring GraphQL、GraphQL Java、DataLoader
  • 示例:订单聚合 → 带有解析器和订阅的 GraphQL 类型

评论

支持 Markdown