程序员必备的十大技能(进阶版)之设计模式与架构思维(五)

简介: 教程来源 https://xgmoi.cn/ DDD是应对复杂业务的架构方法论,含战略设计(限界上下文、上下文映射、子域划分)与战术设计(实体、值对象、聚合根、领域服务等),强调以领域模型驱动开发,实现业务与技术深度对齐。

六、领域驱动设计(DDD)核心概念

DDD是处理复杂业务逻辑的架构方法论。

6.1 战略设计

核心概念:
  限界上下文 (Bounded Context):
    定义: 特定模型的应用边界
    示例: 订单上下文、库存上下文、支付上下文

  上下文映射 (Context Map):
    定义: 不同限界上下文之间的关系
    关系类型: 合作关系、共享内核、客户-供应商、防腐层

  领域 (Domain):
    定义: 问题域和业务逻辑
    子域类型: 
      - 核心域: 核心竞争力
      - 支撑域: 支持核心域
      - 通用域: 通用功能
// 防腐层(Anti-Corruption Layer)示例
@Service
public class InventoryAntiCorruptionLayer {
    private final InventoryExternalService inventoryService;

    public InventoryResponse checkStock(String productId, int quantity) {
        // 调用外部系统的响应
        ExternalResponse externalResponse = inventoryService.query(productId);

        // 转换为领域模型
        InventoryResponse result = new InventoryResponse();
        result.setAvailable(externalResponse.getCode() == 200 && externalResponse.getStock() >= quantity);

        // 处理外部系统的异常响应
        if (externalResponse.getCode() == 500) {
            // 降级策略
            result.setAvailable(true);
            result.setFallback(true);
            log.warn("Inventory service degraded, using fallback");
        }

        return result;
    }
}

6.2 战术设计

// 实体(Entity)- 有唯一标识
public class Order implements AggregateRoot {
    private OrderId id;           // 值对象作为标识
    private OrderStatus status;
    private List<OrderItem> items;
    private Address shippingAddress;

    // 领域行为(不是贫血模型)
    public void changeShippingAddress(Address newAddress) {
        if (status != OrderStatus.PENDING) {
            throw new DomainException("Cannot change address after payment");
        }
        this.shippingAddress = newAddress;
        addDomainEvent(new AddressChangedEvent(id, newAddress));
    }
}

// 值对象(Value Object)- 不可变,无标识
@Embeddable
public class Address {
    private final String street;
    private final String city;
    private final String zipCode;

    public Address(String street, String city, String zipCode) {
        this.street = street;
        this.city = city;
        this.zipCode = zipCode;
    }

    @Override
    public boolean equals(Object o) {
        // 基于值的相等性判断
        if (!(o instanceof Address)) return false;
        Address other = (Address) o;
        return Objects.equals(street, other.street)
            && Objects.equals(city, other.city)
            && Objects.equals(zipCode, other.zipCode);
    }

    @Override
    public int hashCode() {
        return Objects.hash(street, city, zipCode);
    }
}

// 聚合根(Aggregate Root)- 领域一致性边界
public class Order implements AggregateRoot {
    // 聚合内的所有操作都通过聚合根
    private List<OrderItem> items;

    public void addItem(Product product, int quantity) {
        // 业务规则:订单金额不能超过10000
        if (calculateTotal().add(product.getPrice().multiply(BigDecimal.valueOf(quantity)))
                .compareTo(new BigDecimal("10000")) > 0) {
            throw new DomainException("Order amount exceeds limit");
        }
        items.add(new OrderItem(product, quantity));
    }
}

// 领域服务(Domain Service)- 跨聚合的业务逻辑
@Service
public class PricingService {
    public Price calculateOrderPrice(Order order, User user) {
        Price subtotal = order.calculateSubtotal();
        Price discount = calculateDiscount(user, subtotal);
        Price tax = calculateTax(subtotal.subtract(discount));
        return subtotal.subtract(discount).add(tax);
    }

    private Price calculateDiscount(User user, Price amount) {
        if (user.isVip()) {
            return amount.multiply(0.1);  // 10% discount
        }
        return Price.ZERO;
    }
}

// 领域事件(Domain Event)
public class OrderShippedEvent {
    private final OrderId orderId;
    private final TrackingNumber trackingNumber;
    private final LocalDateTime shippedAt;
}

// 仓库(Repository)- 聚合的持久化
public interface OrderRepository {
    Order findById(OrderId id);
    void save(Order order);
    void delete(Order order);
}

七、架构师的思考框架

7.1 架构决策矩阵
image.png
7.2 架构演进:从单体到微服务

演进路径:
┌─────────────┐    ┌─────────────┐    ┌─────────────┐    ┌─────────────┐
│   单体架构   │ -> │  垂直拆分   │ -> │  微服务架构  │ -> │ 服务网格    │
│   Monolith  │    │  分层服务   │    │  Microservices│   │ Service Mesh│
└─────────────┘    └─────────────┘    └─────────────┘    └─────────────┘
    2-3年            3-5年              5-10年             1-3年

何时拆分微服务?
✓ 团队规模超过20人
✓ 不同模块变更频率差异大
✓ 需要独立扩展特定功能
✓ 技术栈异构需求
✗ 业务逻辑简单,团队规模小
✗ 对延迟极其敏感
✗ 事务一致性要求极高

7.3 架构评审清单

架构评审问题清单:

  非功能性需求:
    - 系统预期的QPS/TPC是多少?
    - 高峰流量是平时的多少倍?
    - 允许的最大响应时间是多少?
    - 可接受的宕机时间(SLA)是多少?
    - 数据保留周期是多久?

  技术选型:
    - 为什么选择这个技术栈?
    - 有没有考虑过替代方案?
    - 技术栈的社区活跃度如何?
    - 团队的熟悉程度如何?
    - 是否有成熟的监控和运维工具?

  安全性:
    - 数据传输是否加密?
    - 敏感数据如何存储?
    - 防SQL注入、XSS、CSRF措施?
    - API限流和防刷机制?
    - 权限控制粒度?

  可扩展性:
    - 哪些模块需要水平扩展?
    - 数据库瓶颈如何解决?
    - 缓存策略是什么?
    - 消息队列处理削峰填谷?

  容错性:
    - 单点故障如何处理?
    - 降级和熔断策略?
    - 数据备份和恢复方案?
    - 有没有回滚计划?

来源:
https://amwtm.cn/

相关文章
|
2月前
|
运维 Java 测试技术
程序员必备的十大技能(进阶版)之性能调优与故障排查(四)
教程来源 https://aescc.cn/ 本节系统介绍Java应用性能分析与稳定性保障核心实践:涵盖Arthas诊断、火焰图性能剖析、全链路压测方法论及JMeter实战、混沌工程故障注入(ChaosBlade),并复盘Full GC与数据库死锁两大典型故障案例,助力高效定位与解决线上性能问题。
|
存储 缓存 Oracle
常识四堆外内存
常识系列,作为一名互联网门外汉的科普系列 堆外内存除了在像netty开源框架中,在平常项目中使用的比较少,在现前的项目中,QPS要求高的系统中,堆外内存作为其中一级缓存是相当有成效的。所以来学习一下,文中主要涉及到这三分部内容 1. 堆外内存是什么?与堆内内存的区别 2. 怎么分配,与GC的影响 3. 开源框架使用 这篇文章写到最后,发现还只是回答了开源框架OHC的Why not use ByteBuffer.allocateDirect()?
1909 1
常识四堆外内存
|
17天前
|
存储 人工智能 自然语言处理
阿里云盘企业版 CDE Agent 正式发布!企业网盘会思考、能办事,存储即智能
阿里云盘企业版推出CDE Agent,依托Qoder Cloud Agent实现网盘内文件智能处理与内容生成。文件存入即成“可对话、可执行”的智能资产,支持多模态检索、跨格式分析、自动总结与安全分享,全程数据不出域、权限原生继承、操作全程审计,让网盘升级为安全合规的AI智能工作空间。
218 0
|
2月前
|
程序员 开发工具 git
程序员进阶工程师必备技能之工程化与研发效率建设(二)
教程来源 https://qeext.cn/ 本节详述代码管理与规范化实践:采用简化Git Flow分支策略(main/develop/feature/bugfix等);强制Commit消息遵循`type(scope): subject`格式;通过pre-commit、Black、Ruff、isort、mypy等工具实现自动化格式化、静态检查与类型验证;并规范PR模板与CI质量门禁(含提交校验、测试覆盖≥80%)。
|
2月前
|
Linux KVM 虚拟化
虚拟机使用教程大全(二)
教程来源 https://oplhc.cn/ 虚拟机网络模式深度解析:NAT(共享上网)、桥接(独立局域网身份)、仅主机(宿主隔离通信)、内部网络(纯虚拟机互通)及VMware自定义模式,涵盖原理、配置、端口转发与高级应用,助你精准构建安全高效实验环境。
|
2月前
|
程序员 Windows
程序员必备的十大技能(进阶版)之网络与高并发原理(二)
教程来源 http://hllft.cn/ Reactor与Proactor是高性能I/O的两大核心模型:Reactor基于同步非阻塞+事件就绪通知(如epoll),由用户线程主动读写;Proactor基于异步I/O+操作完成通知(如IOCP/AIO),内核代为完成数据搬运。二者分别支撑Netty与Windows服务器等高并发架构。
|
2月前
|
存储 搜索推荐 JavaScript
Java+Vue+MySQL:高性能可扩展的产科数字化解决方案
数字化产科管理平台,覆盖孕产全周期,支持建档、检查、高危五色预警、分娩记录及产后随访。集成门诊住院病历,实现结构化电子病历与无纸化操作。采用Java+Vue+MySQL技术栈,已应用于多家三甲医院及妇幼保健院。
128 1
|
2月前
|
人工智能 搜索推荐 API
Hermes Agent的部署以及API集成教程
Hermes Agent 是 Nous Research 推出的开源自我进化型AI智能体,支持持久记忆、技能自动沉淀与多工具集成;需通过 WSL2 在 Windows 部署,兼容 OpenAI 标准 API。
353 2
|
2月前
|
运维 监控 程序员
程序员必备的十大技能(进阶版)之性能调优与故障排查(三)
教程来源 https://bgnno.cn/ 本节系统讲解网络与数据库性能问题排查:涵盖TCP连接状态分析、TIME_WAIT优化、延迟诊断、连接池配置;以及慢查询定位、索引失效识别、事务锁监控和连接池调优,助力高效定位并解决生产环境常见瓶颈。
|
2月前
|
设计模式 架构师 Java
程序员必备的十大技能(进阶版)之设计模式与架构思维(一)
教程来源 https://rvtst.cn/ 本文系统讲解设计模式与架构思维,涵盖SOLID原则、创建型/结构型/行为型模式实战、DDD、分层/六边形/微服务架构等十大维度,助你从写代码进阶到设计系统。