• Stars
    star
    383
  • Rank 111,995 (Top 3 %)
  • Language
    Java
  • License
    Apache License 2.0
  • Created about 5 years ago
  • Updated over 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

ddd demo of eas

Build Status codecov

项目介绍

EAS-DDD是我为GitChat课程《领域驱动设计实战(战略篇)》与《领域驱动设计实战(战术篇)》提供的实战项目案例。该案例取材自我参与过的真实项目,整个案例的代码完全按照领域驱动设计的过程进行建模、设计与编码。

通过访问本Repository对应的Wiki,可以了解EAS项目的需求、建模过程与建模产出物;更为详细的分析设计内容,请订阅我在GitChat上发布的课程。每个领域场景对应的用户故事、拆分的任务,请访问本Repository的Issue

环境

本项目的开发基于Java语言进行开发,具体环境包括:

Java: Java 8+
Maven: 3
Spring: 5.1.10+
Spring Boot:2.1.9
MyBatis:3.5.3
Druid:1.1.20
MySQL: 8.0 Community

我个人认为JPA ORM更加符合DDD的设计,在另外一个采用DDD开发的项目Payroll-DDD,我选择的持久化框架就是Spring Data JPA。本项目之所以采用MyBatis,是考虑到MyBatis在国内企业软件开发领域中更为常见。同时,我也希望通过本项目说明使用MyBatis作为持久化框架,同样可以做DDD。

数据库环境准备

项目默认的数据库用户名为sa,密码为123456,数据库主机为localhost,数据库为eas-db。在安装了MySQL 8.0后,若数据库服务器信息与默认信息不同,请修改如下文件。在使用flywaydb执行数据库脚本时,需要确保数据库配置正确,并已经创建了eas-db数据库。

flywaydb的数据库配置

pom.xml文件的<plugins>中配置了如下内容:

<plugin>
   <groupId>org.flywaydb</groupId>
   <artifactId>flyway-maven-plugin</artifactId>
   <version>${flyway.version}</version>
   <configuration>
        <driver>${db.driver}</driver>
        <url>${db.url}</url>
        <user>${db.username}</user>
        <password>${db.password}</password>
   </configuration>
</plugin>

在同一个pom文件的属性配置部分,配置了数据库的相关属性:

<properties>
    <db.driver>com.mysql.jdbc.Driver</db.driver>
    <db.url>jdbc:mysql://localhost:3306/eas-db?serverTimezone=UTC</db.url>
    <db.username>sa</db.username>
    <db.password>123456</db.password>
</properties>

一旦准备好flywaydb的环境,就可以运行命令执行DB的清理:

mvn package flyway:clean

或执行命令执行DB的迁移:

mvn package flyway:migrate

若要忽略运行单元测试,可以在Maven命令后面加上参数:

-DskipTests

测试环境准备

本项目采用测试驱动开发对领域层的类与方法进行了编码实现,因而领域层的相关方法基本皆为单元测试所覆盖。

应用服务则通过集成测试保障其正确性。若要运行集成测试,需通过flywaydb执行SQL脚本,以准备集成测试所必须的数据库环境。如果数据库配置与我的配置不同,除了要修改pom.xml文件中的flywaydb的配置之外,还需要各个限界上下文模块test/resources/spring-mybatis.xml文件的相关配置,如:

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
    <context:component-scan base-package="xyz.zhangyi.ddd.eas.trainingcontext" />

    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
          init-method="init" destroy-method="close">
        <property name="url" value="jdbc:mysql://localhost:3306/eas-db?serverTimezone=UTC"/>
        <property name="username" value="sa"/>
        <property name="password" value="123456"/>
        <property name="connectionProperties" value="com.mysql.jdbc.Driver"/>
    </bean>
</beans>    

运行测试

默认情况下,如果运行mvn test则只会运行单元测试。如果确保数据库已经准备好,且通过flywaydb确保了数据库的表结构与测试数据已经准备好,可以运行mvn integration-test。该命令会运行所有测试,包括单元测试和集成测试。

**注意:**项目中所有的单元测试以Test为测试类后缀,所有集成测试以IT为测试类后缀。

运行Spring Boot服务

整个项目采用了单体架构,故而所有限界上下文的远程服务都通过一个统一的主程序入口,即eas-entry模块下的EasApplication。Spring Boot的应用配置在该模块的resources文件夹下,文件名为application.yml,内容为:

mybatis:
  mapperLocations: classpath:mapper/*.xml
  type-aliases-package: xyz.zhangyi.ddd.eas.trainingcontext.domain
  type-handlers-package: xyz.zhangyi.ddd.eas.trainingcontext.gateway.acl.impl.persistence.typehandlers

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/eas-db?serverTimezone=UTC
    username: sa
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver
    # 使用druid数据源
    type: com.alibaba.druid.pool.DruidDataSource

若要启动Spring Boot服务,需确保数据库的配置正确。在没有配置端口的情况下,默认端口号为8080。你也可以在application.yml中指定端口。

可以直接在IDE下运行EasApplication启动Spring Boot服务。

如你所见,当前项目采用了单体架构,但是可以非常容易迁移到微服务架构。若采用Spring Boot公开服务,需要在每个模块的pom.xml文件中,加入spring-boot-starter的依赖。可以参考eas-entry模块的依赖配置。