第 9 章:数据管理

本章系统梳理了云原生应用中的数据建模、Spring Data 多种数据源集成、微服务数据隔离与缓存等关键实践,帮助开发者构建高可扩展性和高可维护性的分布式数据架构。

数据建模与领域驱动设计

良好的数据模型是软件业务需求的核心表达。领域驱动设计(DDD)强调通过领域模型(如图 9-1)明确业务概念、边界和关系,促进开发团队与业务专家的沟通,降低后期变更成本。

图 9-1 表示领域类之间关系的领域模型
图 9-1 表示领域类之间关系的领域模型

领域模型的清晰划分有助于微服务架构下的有界上下文设计,避免概念混淆和技术债务。

关系数据库与 NoSQL 简述

关系数据库(RDBMS)长期主导事务型数据存储,强调一致性和结构化查询。NoSQL 数据库则提供多样化的数据模型(文档、键值、图等),适合微服务的多样需求和异构持久化(Polyglot Persistence)场景。

Spring Data 生态与数据访问模式

Spring Data 提供统一的数据访问抽象,支持主流 RDBMS 和 NoSQL 数据库(JPA、MongoDB、Neo4j、Redis 等)。核心模式包括:

  • 领域类(Entity/Document/Node):映射业务对象
  • 存储库(Repository):定义数据访问接口,Spring Data 自动实现
  • 包结构:建议以有界上下文为单位组织领域类和存储库,便于微服务拆分和演进

Spring Data 基础用法

以 User 实体为例,定义领域类和存储库:

public class User {
    private Long id;
    private String firstName;
    private String lastName;
    private String email;
    // getter/setter
}

public interface UserRepository extends CrudRepository<User, Long> { }

Spring Data 自动实现接口,无需手写 SQL 或数据访问逻辑。

包结构与有界上下文

建议将领域类和存储库按有界上下文分包,便于后续微服务拆分。例如:

  • demo.customer:Customer 相关实体与仓库
  • demo.order:Order 相关实体与仓库
图 9-2 具有两个有界上下文的领域模型
图 9-2 具有两个有界上下文的领域模型

Spring Data 支持的存储库类型

下表展示了常见 Spring Data 存储库类型及其适用场景。

存储库类型项目说明
RepositoryData Commons核心抽象,基础接口
CrudRepositoryData Commons增删改查基础操作
PagingAndSortingRepositoryData Commons支持分页与排序
JpaRepositoryData JPAJPA/RDBMS 扩展,支持更多 JPA 特性
MongoRepositoryData MongoDBMongoDB 文档操作
CouchbaseRepositoryData CouchbaseCouchbase 文档操作
表 1: 常见 Spring Data 存储库类型

JDBC 与 JPA 数据访问

Spring Boot 自动配置 DataSource、JDBC、JPA,支持多种数据库。推荐将敏感信息外部化配置。JdbcTemplate 简化了 SQL 操作,JPA 提供 ORM 支持,开发者可专注于领域模型。

@Component
class JdbcCommandLineRunner implements CommandLineRunner {
    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Override
    public void run(String... args) {
        // 创建表、插入数据、查询映射为对象
    }
}

Spring Data JPA 实践:Account Service

以 Cloud Native Clothing 的 Account Service 为例,使用 JPA 实现 Account、Customer、Address、CreditCard 等实体及其关系,支持审计(@CreatedDate、@LastModifiedDate),并通过 Repository 管理数据访问。

  • 配置多环境数据源(MySQL/H2),通过 profile 切换
  • 使用 @Entity、@OneToMany、@OneToOne 等注解建模关系
  • 通过 @EnableJpaAuditing 启用审计

Spring Data MongoDB 实践:Order Service

Order Service 使用 MongoDB 存储订单、发票、产品等文档,适合聚合存储和灵活结构。

  • @Document 注解定义文档类
  • 支持嵌套对象、列表、状态枚举
  • 通过 Repository 实现自定义查询
  • 使用 AbstractMongoEventListener 实现审计

Spring Data Neo4j 实践:Inventory Service

Inventory Service 采用 Neo4j 图数据库,适合建模复杂关系(如仓库、产品、目录、发货等)。

  • @NodeEntity 注解定义节点
  • @Relationship 注解定义节点间关系
  • 使用 GraphRepository/PagingAndSortingRepository 管理节点
  • 支持 Cypher 查询和高效图遍历

Spring Data Redis 实践:缓存与高性能

Redis 作为高性能缓存,Spring Data Redis 支持注解驱动缓存(@Cacheable、@CachePut、@CacheEvict),提升微服务性能与可用性。

  • 配置 @EnableCaching,自动集成 RedisTemplate
  • 结合主数据源(如 MySQL)实现读写分离与缓存一致性
  • 注意缓存命名空间与 TTL 设置,避免数据冲突

典型微服务数据架构案例

以 Cloud Native Clothing 在线商店为例,Account Service(JPA-MySQL)、Order Service(MongoDB)、Inventory Service(Neo4j)分别管理不同有界上下文的数据,实现数据隔离与多样化持久化。

图 9-15 UserService 和 UserWeb 应用的服务架构图
图 9-15 UserService 和 UserWeb 应用的服务架构图

总结

本章系统梳理了云原生应用中的数据建模、Spring Data 多数据源集成、微服务数据隔离与缓存等关键实践。通过合理的数据架构设计与 Spring Data 生态集成,开发者可实现高可扩展性、高可维护性和高性能的分布式数据管理,为云原生微服务系统的持续演进奠定坚实基础。

文章导航

独立页面

这是书籍中的独立页面。

书籍首页

评论区