随笔-第一次接触DDD与微服务

jonathan
2016-12-13 / 0 评论

随笔-第一次接触DDD与微服务

首先,感谢公司提供这次学习DDD(领域驱动设计)的机会。

经过上次雷老师的讲解,这两个月来,我对微服务架构有了整体的了解,并持续关注了雷老师的项目。结合这次培训和个人理解,我总结了以下几点:

微服务架构的核心要素

微服务架构主要包括:

  • 基础设施(原中间件):Redis(缓存管理)、Kafka(消息队列)、Consul/Eureka(服务注册)、Elasticsearch(搜索引擎)等。
  • DDD(领域驱动设计):重点在于领域建模和界限上下文的划分。
  • 数据库:微服务架构下的数据管理策略,包括分库分表、分布式事务等。
  • Docker:环境容器化,让环境像代码一样可定义、可声明,提升部署效率。

其中,对我来说最陌生但最重要的部分是基础设施,这次培训重点讲解了如何将基础设施与DDD整合,并提供了基本的DEMO示例。

领域驱动设计(DDD)理解

传统软件设计通常围绕数据库进行架构,而DDD则是围绕领域界限上下文进行业务扩展。

领域及子域
以我们公司所处的服装行业为例,面料平台就是一个领域,而它可以进一步拆分为多个子域

  • 交易中心(核心域)
  • 运营中心
  • 商家管理
  • 扫描仪

不同子域之间存在层级关系,例如:交易中心与商家管理之间是上下级关系。

界限上下文
以交易平台为例,它的界限上下文包括:

  • 面料管理(面料列表、搜索、详情)
  • 面料对比(加入对比、对比分析、取消对比)
  • 用户管理(个人用户)

实体、值对象、聚合

  • 实体:具有唯一标识,例如“用户”。
  • 值对象:数据不可变、无唯一标识,例如“用户地址”。
  • 聚合:封装了实体、值对象和仓储,并通过服务暴露出去。

工厂模式
工厂用于创建和管理复杂对象,确保领域对象的一致性。

DDD 与微服务的整合

在微服务架构中,Spring Cloud 通过封装 Redis、Kafka、Consul 等基础设施,使其能够以注解和配置的方式无缝集成项目。这些组件如同武器,而DDD是一个武林高手,关键在于如何合理运用。

此外,Spring Boot 通过注解取代 XML 配置,实现“约定优于配置”,简化开发流程,符合当前行业趋势。

微服务架构落地的关键问题

1. 服务化后的管理

  • JAR 包如何管理?是每个包一个 Docker 镜像,还是一个界限上下文一个镜像?
  • 端口、日志等规范化管理。

2. Docker 仓库管理

如何高效存储和管理微服务镜像,减少重复构建和拉取。

3. 安全性

可以采用 OAuth + Shiro 结合 Zuul 路由 来控制权限。

4. CI/CD(持续集成 & 持续部署)

如何使用 Jenkins 实现自动化部署,减少人工干预,提高效率。

5. 版本号管理

  • 采用 Maven + Git 进行版本控制,避免人工打版本号。
  • JAR 包管理策略,避免版本混乱。

6. 单体架构向微服务迁移的思考

  • 为什么要迁移?微服务是否适合当前企业需求?
  • 迁移前的技术债偿还、新架构设计原则、团队变革等准备工作。
  • 迁移过程中需要遵循的设计规范。
  • 分布式事务一致性:虽然雷老师建议使用 TSDB 而非传统事务,但目前对其原理仍有疑问,需要进一步研究。
  • 中间件选型:如何选择合适的消息队列、数据库、缓存方案等。
  • 如何让其他职能团队平滑切入?(UI、产品、运维、测试、前端等)

结语

微服务架构的落地涉及众多技术和管理挑战,这次培训让我对DDD有了更深入的理解,同时也意识到微服务架构实施过程中仍有许多待解决的问题,需要进一步探索和实践。

雷老师的github地址:https://github.com/linux-china

DDD

评论

博主关闭了当前页面的评论