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

简介: 教程来源 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/

相关文章
|
3月前
|
运维 Java 测试技术
程序员必备的十大技能(进阶版)之性能调优与故障排查(四)
教程来源 https://aescc.cn/ 本节系统介绍Java应用性能分析与稳定性保障核心实践:涵盖Arthas诊断、火焰图性能剖析、全链路压测方法论及JMeter实战、混沌工程故障注入(ChaosBlade),并复盘Full GC与数据库死锁两大典型故障案例,助力高效定位与解决线上性能问题。
|
3月前
|
程序员 开发工具 git
程序员进阶工程师必备技能之工程化与研发效率建设(二)
教程来源 https://qeext.cn/ 本节详述代码管理与规范化实践:采用简化Git Flow分支策略(main/develop/feature/bugfix等);强制Commit消息遵循`type(scope): subject`格式;通过pre-commit、Black、Ruff、isort、mypy等工具实现自动化格式化、静态检查与类型验证;并规范PR模板与CI质量门禁(含提交校验、测试覆盖≥80%)。
|
3月前
|
Linux KVM 虚拟化
虚拟机使用教程大全(二)
教程来源 https://oplhc.cn/ 虚拟机网络模式深度解析:NAT(共享上网)、桥接(独立局域网身份)、仅主机(宿主隔离通信)、内部网络(纯虚拟机互通)及VMware自定义模式,涵盖原理、配置、端口转发与高级应用,助你精准构建安全高效实验环境。
|
3月前
|
存储 搜索推荐 JavaScript
Java+Vue+MySQL:高性能可扩展的产科数字化解决方案
数字化产科管理平台,覆盖孕产全周期,支持建档、检查、高危五色预警、分娩记录及产后随访。集成门诊住院病历,实现结构化电子病历与无纸化操作。采用Java+Vue+MySQL技术栈,已应用于多家三甲医院及妇幼保健院。
152 1
|
3月前
|
人工智能 程序员
我写了 17 年代码,然后 AI 来了
写了17年代码的程序员,在AI从GPT到Agent的四次关键变化中,逐渐意识到写代码这件事不再是自己的核心竞争力。
|
3月前
|
人工智能 安全 机器人
企业 AI 落地,第一件事不是买模型,而是建好企业知识库
很多企业现在谈 AI,第一反应还是买模型、接接口、做一个内部聊天机器人。 可以这么开始,但别把它当成落地的核心。真正的问题通常不是模型不会回答,而是模型不知道你这家公司到底怎么运转。
|
3月前
|
人工智能 搜索推荐 API
Hermes Agent的部署以及API集成教程
Hermes Agent 是 Nous Research 推出的开源自我进化型AI智能体,支持持久记忆、技能自动沉淀与多工具集成;需通过 WSL2 在 Windows 部署,兼容 OpenAI 标准 API。
407 2
|
3月前
|
缓存 安全 Windows
电脑开关机、运行卡顿! 科学清理 C 盘释放存储空间实用妙招!
电脑C盘爆红、卡顿、软件闪退?本文提供一套安全、高效、可长期维护的C盘清理流程,从基础清理到系统优化,再到专业工具深度处理,新手也能轻松上手,一次性释放大量空间,让电脑重回流畅状态
|
3月前
|
人工智能 调度
# AI时代为什么会出现OPC一人公司?
AI时代催生OPC一人公司,核心在于AI放大个体能力:大模型与智能体使单人可高效完成调研、内容、设计、销售、交付等全流程。OPC非孤军奋战,而是以CEO角色调度AI工具与资源,实现商业闭环。本质是个人具备公司级组织力与交付力。
182 0
|
3月前
|
存储 人工智能 监控
Java+UniApp 架构|数字孪生智慧工地整套源码
SaaS智慧工地管理系统源码,基于微服务架构,融合云计算、IoT与大数据技术。支持数字孪生大屏、人员/视频/危大工程/绿色施工/物料/隐患等全维度管理,前后端分离(Java+Spring Cloud+UniApp),适配多端,助力工地可视化、智能化、精细化管控。
203 0