Ddd4j Boot æ¯äžäžªåºäº é¢å驱åšè®Ÿè®¡ïŒDDDïŒ ææ³ç Java 埮æå¡åŒåèææ¶ãéçš Spring Boot 3.4.13 æå»ºïŒåºäºèªç ddd4jïŒfeature/2.0.xïŒæ¡æ¶å®ç°é¢å驱åšè®Ÿè®¡ã åœä»€æ¥è¯¢è莣å犻ïŒCQRSïŒåäºä»¶é©±åšæ¶æã
çæ¬åºçº¿ïŒSpring Boot
3.4.13· Spring Framework6.2.19· Java 17ïŒåŒºå¶åºçº¿ïŒ21 å Œå®¹ïŒÂ· ddd4j2.0.x.20260630-SNAPSHOT· ddd4j-boot3.4.x.20260630-SNAPSHOTð 仿§çæ¬è¿ç§»è¯·é 读 è¿ç§»æåïŒ3.4.x â 2.0.xïŒ
æ¬é¡¹ç®éµåŸª Eric Evans å Vaughn Vernon ç DDD ç»å žç论ïŒäžäŸèµç¹æ®æ¡æ¶ïŒä» äœ¿çšæ åç JEE/Spring è§èïŒåž®å©åŒåè æå»ºå¯ç»Žæ€ã坿©å±ç倿äžå¡ç³»ç»ã
- æç¥è®Ÿè®¡ïŒéè¿éçäžäžæïŒBounded ContextïŒååäžå¡èŸ¹çïŒå»ºç«ç»äžè¯èšïŒUbiquitous LanguageïŒïŒè¯å«æ žå¿åãæ¯æååéçšå
- ææ¯è®Ÿè®¡ïŒéçšå®äœïŒEntityïŒãåŒå¯¹è±¡ïŒValue ObjectïŒãèåïŒAggregateïŒãèåæ ¹ïŒAggregate RootïŒãé¢åæå¡ïŒDomain ServiceïŒãä»åšïŒRepositoryïŒãé¢åäºä»¶ïŒDomain EventïŒçæš¡åŒç»ç»é¢åæš¡å
- å è¡æš¡åïŒäžå¡é»èŸå°è£ åšé¢å对象å éšïŒèé莫è¡çæå¡å±ïŒç¡®ä¿é¢åæš¡åç宿޿§åäžå¡è§åçå èæ§
- 读åå犻ïŒåœä»€äŸ§ïŒåæš¡åïŒäžæ³šäºäžå¡è§ååç¶æåæŽïŒæ¥è¯¢äŸ§ïŒè¯»æš¡åïŒäŒåæ°æ®æ£çŽ¢åè§åŸæå»º
- ç¬ç«äŒåïŒåœä»€åæ¥è¯¢å¯ä»¥ç¬ç«æ©å±ãäŒåïŒéåºäžåçæ§èœéæ±
- äºä»¶é©±åšïŒéè¿é¢åäºä»¶å®ç°è·šèåãè·šäžäžæçè§£èŠéä¿¡
- äºä»¶ååšïŒå°ç¶æåæŽè®°åœäžºäºä»¶åºåïŒæ¯æå®æŽçåå²è¿œæº¯åç¶æé建
- æ¶éŽæ è¡ïŒå¯ä»¥åæŸäºä»¶éå»ºä»»ææ¶éŽç¹çç³»ç»ç¶æ
- 审计èœåïŒå€©ç¶æ¯æå®æŽçäžå¡æäœå®¡è®¡
- è±åœ¢æ¶æïŒCOLAïŒïŒéçš Adapter â Application â Domain â Infrastructure å屿¶æïŒæž æ°çåå±èŸ¹çåäŸèµæ¹å
- å èŸ¹åœ¢æ¶æææ³ïŒéè¿ç«¯å£ïŒPortïŒåéé åšïŒAdapterïŒé犻é¢åæ žå¿äžå€é𿿝å®ç°
- äŸèµå眮ïŒé¢åå±äžäŸèµåºç¡è®Ÿæœå±ïŒéè¿æ¥å£æœè±¡å®ç°ææ¯æ å ³æ§
-
1. 宿Žç DDD å屿¶æïŒæäŸæ åçé¢åå±ãåºçšå±ãæ¥å£å±ååºç¡è®Ÿæœå±ç»æïŒæ¯æ COLA V5 æ¶ææš¡åŒ
-
2. 蜻é级 DDD å®ç°ïŒåºäºèªç ddd4j æ¡æ¶ïŒçº¯å¥çºŠ/æ žå¿æš¡å â èœå SPI â ææ¯éé åš â runtime å®¹åšæ¡¥ïŒïŒæ éåŒå ¥ééçº§æ¡æ¶ïŒä¿æä»£ç ç®æŽ
-
3. ææ¯æ éæïŒåºäº Spring Boot 3.4.13ïŒè¯Šè§ Spring Boot 宿¹ææ¡£ ïŒïŒéæ MyBatis PlusãJacksonãGuavaãSwaggerãSaToken çåžžçšç»ä»¶ïŒç»äžçæ¬ç®¡ç
-
4. åæ æ¯æïŒåæ¶æ¯æ WebMVCïŒäŒ ç» ServletïŒå WebFluxïŒååºåŒïŒäž€ç§çŒçšæš¡å
-
5. é¢åæš¡ååºç¡èœåïŒæäŸ BaseEntityãBaseRepositoryãBaseService çåºç¡æœè±¡ïŒæ¯æå页ãæåºãç»è®¡çéçšèœå
-
6. é¢åäºä»¶æ¯æïŒå 眮é¢åäºä»¶ååžæºå¶ïŒæ¯æäºä»¶é©±åšçäžå¡çŒæ
-
7. é²è å±ïŒACLïŒïŒæäŸå€éšæå¡éæçé²è 屿œè±¡ïŒé犻å€éšç³»ç»åå对é¢åæš¡åç圱å
-
8. ç»äžåŒåžžå€çïŒå šå±åŒåžžå€çæºå¶ïŒæ¯æäžå¡åŒåžžåç³»ç»åŒåžžçæ ååååº
åŠææšæ¯ DDD/CQRS é¢åçæ°æïŒå»ºè®®å äºè§£ä»¥äžæ žå¿æŠå¿µïŒ
- DDD æç»Žå¯ŒåŸïŒæ¶µçæç¥è®Ÿè®¡ïŒéçäžäžæãååååãç»äžè¯èšïŒåææ¯è®Ÿè®¡ïŒå®äœãåŒå¯¹è±¡ãèåãé¢åæå¡ãä»åšãé¢åäºä»¶ïŒç宿Žç¥è¯äœç³»
- CQRS æç»Žå¯ŒåŸïŒæ·±å ¥çè§£åœä»€æ¥è¯¢è莣å犻ãäºä»¶å€çãäžèŽæ§æš¡åçæ žå¿æŠå¿µ
- åè瀺äŸïŒæ¬ä»åº
ddd4j-boot-samples/ddd4j-boot-sample-orderïŒè®¢å + Outbox + KafkaïŒäžddd4j-boot-sample-cqrs-person-*ïŒCQRS 读åå犻ïŒ
CQRS æ¶ææŠè§åŸïŒ
该åŸå±ç€ºäºåºäº CQRS ç埮æå¡æ¶æïŒå æ¬åœä»€äŸ§ïŒåæš¡åïŒåæ¥è¯¢äŸ§ïŒè¯»æš¡åïŒçå犻ïŒä»¥åäºä»¶é©±åšçç³»ç»éææ¹åŒã
Ddd4j Boot æ¯äžäžªé¢å倿äžå¡é¢åç埮æå¡åŒåèææ¶ïŒæšåšåž®å©å¢éïŒ
- 建ç«é¢åæš¡åïŒéè¿ DDD ææ¯è®Ÿè®¡æš¡åŒïŒå°äžå¡ç¥è¯æŸåŒå°è¡šèŸŸåšä»£ç äž
- ååäžå¡èŸ¹çïŒéè¿éçäžäžæè¯å«åååäžå¡é¢åïŒéäœç³»ç»å€æåºŠ
- æå代ç 莚éïŒéè¿å屿¶æåäŸèµå眮ïŒå®ç°é«å èãäœèŠåç代ç ç»æ
- æ¯æäžå¡æŒè¿ïŒé¢åæš¡åäžææ¯å®ç°å犻ïŒäžå¡ååäžåœ±åææ¯æ¶æ
æ¬é¡¹ç®æäŸéçšç Maven é 眮ãç¬¬äžæ¹äŸèµç®¡çãæå è§å以å DDD å屿¶æçåºç¡è®Ÿæœæ¯æã
Ddd4j Boot æŽäœæ¶æåŸïŒ
该åŸå±ç€ºäº Ddd4j Boot çæŽäœæš¡åæ¶æïŒå æ¬ BOM 管çãæ žå¿æš¡åãç»ä»¶æš¡ååç€ºäŸæš¡åçç»ç»å ³ç³»ïŒä»¥ååæš¡åä¹éŽçäŸèµå ³ç³»ã
Maven æš¡åæ¶æïŒ
| æš¡å | 诎æ |
|---|---|
| ddd4j-boot-bom | BOM äŸèµç®¡çæš¡åïŒç»äžç®¡çææåæš¡åçæ¬ïŒå€éšé¡¹ç®éè¿ BOM åŒçšå®ç°çæ¬å¯¹éœ |
| ddd4j-boot-dependencies | å ¬å ±äŸèµå£°ææš¡åïŒéäžç®¡çç¬¬äžæ¹ç»ä»¶çæ¬ïŒå« Lombok annotation processor é çœ®ïŒ |
| ddd4j-boot-core | æ žå¿èªåšé 眮ïŒSPI çåœåšææ¡¥æ¥ïŒDomainEventPublisher/Subject/I18n/CommandBus 泚åïŒãRepository èªåšæ³šåãCommandBus è£ é |
| ddd4j-boot-web | Web è£ é ïŒwebmvc / webflux 䞀䞪èéé æš¡åïŒæ¡ä»¶äºæ¥ïŒ |
| ddd4j-boot-mq | MQ è£ é ïŒmq-core + 13 䞪 broker èéé åšïŒæ¶èŽ¹äžæžž MQClient ç»äžæš¡åïŒ |
| ddd4j-boot-data | æ°æ®è£ é ïŒmybatis / crypto / datascope / external / logsïŒ |
| ddd4j-boot-auth | 讀è¯è£ é ïŒsatoken / security / shiro / licenseïŒ |
| ddd4j-boot-cache | çŒå屿§ç»å®ïŒCacheKit éæå·¥å ·ïŒæ³šåå€éšçŒåå®äŸïŒ |
| ddd4j-boot-extensions | æ©å±è£ é ïŒakka / cola / dubbo / excel / jackson / monitor / qlexpress / qrcode çïŒ |
| ddd4j-boot-samples | ç€ºäŸæå¡æš¡åéåïŒæ¶µçäžåææ¯æ ç»åïŒæ°æ®æºãæ¶æ¯éåãCQRSã坿š¡åçïŒ |
䜿çšå»ºè®®ïŒ
-
1. 项ç®ç»æè§åïŒæ°å»ºäžå¡æå¡æ¶ïŒå»ºè®®æéçäžäžæïŒBounded ContextïŒååæš¡åãæ¯äžªéçäžäžæå¯¹åºäžäžªç¬ç«çæå¡ææš¡åïŒä¿æäžå¡èŸ¹ççæž æ°
-
2. é¢åæš¡å讟计ïŒäŒå è¯å«èåïŒAggregateïŒåèåæ ¹ïŒå°äžå¡è§åå°è£ åšé¢å对象å éšïŒé¿å èŽ«è¡æš¡åãåºçšå±ä» èŽèŽ£çšäŸçŒæåäºå¡ç®¡ç
-
3. æš¡åæåçç¥ïŒå¯¹äºå€æçäžå¡åïŒåºèèæååïŒæ žå¿åãæ¯æåãéçšåïŒæåæå¡ãåå»ºæš¡åæ¶é¢çæå空éŽïŒäŸ¿äºåç»åŸ®æå¡åæŒè¿
-
4. äŸèµç®¡çïŒå€éšé¡¹ç®åŒçš ddd4j-boot æš¡åæ¶ïŒåŒºç建议䜿çš
ddd4j-boot-bomè¿è¡çæ¬ç®¡çïŒç¡®ä¿äŸèµçæ¬äžèŽæ§ -
5. ææ¯éåïŒæ ¹æ®äžå¡å€æåºŠéæ©åéçæ¶ææš¡åŒãç®å CRUD åºæ¯å¯äœ¿çšèœ»é级 DDDïŒå€æäžå¡å建议éçšå®æŽç DDD + CQRS æš¡åŒ
æš¡åç»ææ ïŒ
|--ddd4j-boot
|----ddd4j-boot-bom #BOMäŸèµç®¡çïŒçšäºå€éšé¡¹ç®åŒçš ddd4j-boot æš¡åçæ¬ç®¡ç
|----ddd4j-boot-dependencies #å
Œ
±äŸèµïŒäŸ¿äºäŸèµç»ä»¶çæ¬æ§å¶ïŒå« Lombok å€çåšé
眮ïŒ
|----ddd4j-boot-core #æ žå¿èªåšé
眮ïŒSPI çåœåšæ / Repository 泚å / CommandBus
|----ddd4j-boot-web #Web è£
é
ç¶æš¡å
|------ddd4j-boot-web-webmvc #WebMVC è£
é
ïŒServletïŒ
|------ddd4j-boot-web-webflux #WebFlux è£
é
ïŒReactiveïŒ
|----ddd4j-boot-mq #MQ è£
é
ç¶æš¡å
|------ddd4j-boot-mq-core #MQ ç»äžåŒå
³äžå±æ§ç»å®
|------ddd4j-boot-mq-{activemq,disruptor,kafka,mqtt,mqtt-mica,nats,ons,pulsar,rabbitmq,redis-stream,rocketmq,sqs,tdmq} #13 䞪 broker èéé
åš
|----ddd4j-boot-data #æ°æ®è£
é
ç¶æš¡å
|------ddd4j-boot-data-{mybatis,crypto,datascope,external,logs}
|----ddd4j-boot-auth #讀è¯è£
é
ç¶æš¡å
|------ddd4j-boot-auth-{satoken,security,shiro,license}
|----ddd4j-boot-cache #çŒå屿§ç»å®
|----ddd4j-boot-extensions #æ©å±è£
é
ç¶æš¡å
|------ddd4j-boot-extension-{akka,cola,dubbo,excel,jackson,monitor,qlexpress,qrcode,pf4j}
|----ddd4j-boot-samples #ç€ºäŸæå¡
|--------ddd4j-boot-sample-order #Spring Boot + Postgres + Kafka + Outbox 绌å瀺äŸ
|--------ddd4j-boot-sample-rich-model #å
è¡æš¡å + MyBatis-Plus 瀺äŸ
|--------ddd4j-boot-sample-layered #å屿¶æç€ºäŸ
|--------ddd4j-boot-sample-cqrs-person-* #CQRS 读åå犻瀺äŸ
|--------ddd4j-boot-sample-starter-* #æ°æ®æºïŒDruid/HikariCPïŒ+ MQïŒAMQ/Kafka/MQTT/RocketMQïŒç»å瀺äŸ
åšå€éšé¡¹ç®ç pom.xml äžåŒå
¥ BOMïŒ
<dependencyManagement>
<dependencies>
<dependency>
<groupId>io.ddd4j.boot</groupId>
<artifactId>ddd4j-boot-bom</artifactId>
<version>${ddd4j-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>ç¶åçŽæ¥åŒå ¥éèŠçæš¡åïŒæ éæå®çæ¬ïŒ
<dependencies>
<dependency>
<groupId>io.ddd4j.boot</groupId>
<artifactId>ddd4j-boot-core</artifactId>
</dependency>
<dependency>
<groupId>io.ddd4j.boot</groupId>
<artifactId>ddd4j-boot-web-webmvc</artifactId>
</dependency>
<dependency>
<groupId>io.ddd4j.boot</groupId>
<artifactId>ddd4j-boot-mq-kafka</artifactId>
</dependency>
</dependencies>å
éšé¡¹ç®ç»§æ¿ ddd4j-boot-parentïŒ
<parent>
<groupId>io.ddd4j.boot</groupId>
<artifactId>ddd4j-boot-parent</artifactId>
<version>${revision}</version>
<relativePath>../ddd4j-boot-parent/pom.xml</relativePath>
</parent>| ç»ä»¶æš¡å | 诎æ |
|---|---|
| ddd4j-boot-core | æ žå¿èªåšé 眮ïŒSPI çåœåšæïŒDomainEventPublisher/Subject/I18n/CommandBus 泚åäžå ³éæž çïŒãRepository èªåšæ³šåãCommandBus è£ é |
| ddd4j-boot-web-webmvc | WebMVC è£ é ïŒServlet æ¡ä»¶äºæ¥ïŒïŒç»äžåŒåžž/请æ±äžäžæ/å¹ç鲿€ |
| ddd4j-boot-web-webflux | WebFlux è£ é ïŒReactive æ¡ä»¶äºæ¥ïŒïŒç»äžé误å€çäžè¯·æ±äžäžæ |
| ddd4j-boot-mq-core | MQ ç»äžåŒå
³ïŒddd4j.mq.enabledïŒäžå±æ§ç»å® |
| ddd4j-boot-mq-{activemq,disruptor,kafka,mqtt,mqtt-mica,nats,ons,pulsar,rabbitmq,redis-stream,rocketmq,sqs,tdmq} | 13 䞪 broker èéé
åšïŒæ¶èŽ¹äžæžž MQClient ç»äžæš¡å |
| ddd4j-boot-data-mybatis | MyBatis-Plus æŠæªåšè£ é ïŒå页/ä¹è§é/é²å šè¡šæ»å»ïŒ |
| ddd4j-boot-data-crypto | å è§£å¯çç¥è£
é
ïŒAES/SM çïŒcrypto.enabled åŒå
³ïŒ |
| ddd4j-boot-data-datascope | æ°æ®æéè£ é ïŒDataScopeProvider + æ³šè§£æ ¡éªåšïŒ |
| ddd4j-boot-data-external | å€éšæå¡ïŒå°çäœçœ®/倩æ°/è¡æ¿åºåïŒäžå šå±åºåå· |
| ddd4j-boot-data-logs | API æäœæ¥å¿åé¢è£ é |
| ddd4j-boot-auth-{satoken,security,shiro} | äžç§è®€è¯æ¡æ¶ç SubjectProvider éé ïŒäºæ¥è£ é ïŒ |
| ddd4j-boot-auth-license | TrueLicense 讞å¯è¯è£
é
ïŒlicense.* é
çœ®ïŒ |
| ddd4j-boot-cache | CacheKit 屿§ç»å®ïŒäžå¡éè¿ CacheKit.register(biz, cache) 泚åçŒåïŒ |
| ddd4j-boot-extension-{akka,cola,dubbo,excel,jackson,monitor,qlexpress,qrcode} | æ©å±ç»ä»¶è£ é ïŒActor ç³»ç»/COLA æ¶æ/Dubbo æ«æ/Excel å·¥å ·/Jackson é»è®€é 眮/çæ§/è§ååŒæ/äºç»Žç ïŒ |
éµåŸª DDD ç»å žå屿¶æïŒäœç°æž æ°çè莣å犻åäŸèµæ¹åïŒ
ddd4j/
âââ src/main/java/io/ddd4j/boot/core
â â
â âââ domain/ # é¢åå±ïŒæ žå¿ïŒæ å€éšäŸèµïŒ
â â âââ model/ # é¢åæš¡å
â â â âââ entity/ # å®äœïŒEntityïŒ- æå¯äžæ è¯çäžå¡å¯¹è±¡
â â â âââ vo/ # åŒå¯¹è±¡ïŒValue ObjectïŒ- äžå¯åçæè¿°æ§å¯¹è±¡
â â â âââ aggregate/ # èåæ ¹ïŒAggregate RootïŒ- äžèŽæ§èŸ¹ç
â â âââ event/ # é¢åäºä»¶ïŒDomain EventïŒ- äžå¡äºå®ç衚蟟
â â âââ repository/ # ä»åšæ¥å£ïŒRepositoryïŒ- æä¹
åæœè±¡
â â âââ service/ # é¢åæå¡ïŒDomain ServiceïŒ- è·šèåçäžå¡é»èŸ
â â
â âââ application/ # åºçšå±ïŒçšäŸçŒæå±ïŒ
â â âââ command/ # åœä»€å¯¹è±¡ïŒCommandïŒ- CQRS åæäœèŸå
¥
â â âââ query/ # æ¥è¯¢å¯¹è±¡ïŒQueryïŒ- CQRS 读æäœèŸå
¥
â â âââ dto/ # æ°æ®äŒ èŸå¯¹è±¡ïŒDTOïŒ- è·šå±æ°æ®äŒ èŸ
â â âââ service/ # åºçšæå¡ïŒApplication ServiceïŒ- çšäŸçŒæãäºå¡èŸ¹ç
â â âââ mapper/ # 对象æ å°åš - DTO äžé¢å对象蜬æ¢
â â
â âââ interfaces/ # æ¥å£å±ïŒçšæ·æ¥å£å±/éé
åšå±ïŒ
â â âââ web/ # Web æ¥å£éé
åšïŒREST APIãGraphQL çïŒ
â â âââ facade/ # å€éšæå¡æ¥å£ïŒRPCãæ¶æ¯çå¬çïŒ
â â
â âââ infrastructure/ # åºç¡è®Ÿæœå±ïŒææ¯å®ç°å±ïŒ
â âââ persistence/ # æä¹
åå®ç°ïŒMyBatisãJPA çïŒ
â âââ messaging/ # æ¶æ¯äžéŽä»¶å®ç°ïŒKafkaãRabbitMQ çïŒ
â âââ acl/ # é²è
å±å®ç°ïŒAnti-Corruption LayerïŒ- å€éšç³»ç»éé
â âââ config/ # ææ¯é
眮类
â
âââ src/main/resources/
äŸèµæ¹åïŒinterfaces â application â domain â infrastructure
- é¢åå±ïŒå®å šç¬ç«ïŒäžäŸèµä»»äœå ¶ä»å±ïŒå å«çº¯äžå¡é»èŸ
- åºçšå±ïŒäŸèµé¢åå±ïŒèŽèŽ£çšäŸçŒæåäºå¡ç®¡ç
- æ¥å£å±ïŒäŸèµåºçšå±ïŒèŽèŽ£å议蜬æ¢åæ°æ®éªè¯
- åºç¡è®Ÿæœå±ïŒäŸèµé¢åå±ïŒéè¿æ¥å£ïŒïŒå®ç°ææ¯ç»è
ddd4j-boot-{æš¡å}/
âââ src/main/java/io/ddd4j/boot/{æš¡å}
â âââ application/ # åºçšå±
â â âââ command/ # åœä»€å¯¹è±¡
â â âââ dto/ # æ°æ®äŒ èŸå¯¹è±¡
â â âââ service/ # åºçšæå¡
â â âââ mapper/ # DTOäžé¢å对象æ å°
â âââ domain/ # é¢åå±
â â âââ model/ # é¢åæš¡å
â â â âââ entity/ # å®äœ
â â â âââ vo/ # åŒå¯¹è±¡
â â â âââ aggregate/ # èåæ ¹
â â âââ event/ # é¢åäºä»¶
â â âââ repository/ # ä»åšæ¥å£
â â âââ service/ # é¢åæå¡
â âââ infrastructure/ # åºç¡è®Ÿæœå±
â â âââ persistence/ # æä¹
åå®ç°
â â âââ messaging/ # æ¶æ¯ç»ä»¶
â â âââ acl/ # é²è
å±
â â âââ config/ # é
眮类
â âââ interfaces/ # çšæ·æ¥å£å±
â âââ web/ # RESTæ¥å£
â âââ facade/ # å€éšæå¡æ¥å£
âââ src/main/resources/
ç€ºäŸæš¡åéçš COLA V5 æ¶æïŒè±åœ¢æ¶æïŒïŒå®æŽå±ç€º DDD åšäžå¡æå¡äžçå®è·µãéçšäºå€§å€æ°å€æäžå¡åºæ¯ïŒåŠè®¢åäžå¿ãæ¯ä»ç³»ç»çïŒã
æ¶æç¹ç¹ïŒ
- é¢åå±ç¬ç«ïŒdomain å å®å šç¬ç«ïŒäžäŸèµä»»äœææ¯æ¡æ¶
- äŸèµå眮ïŒéè¿æ¥å£æœè±¡å®ç°é¢åå±äžææ¯å®ç°çè§£èŠ
- æž æ°èŸ¹çïŒæ¯å±è莣æç¡®ïŒäŸ¿äºæµè¯å绎æ€
äžé¢æ¯äž€ç§äžååºæ¯äžè¯Šç»çCOLAç®åœç»æïŒ
è¿æ¯äžç§å žåå åå±ç»æïŒéçšäºå€§å€æ°äžå¡åºçšïŒåŠè®¢åäžå¿ïŒãç»æçŽ§åïŒéåå¿«éåŒåïŒ
order-service/ (Mavené¡¹ç®æ ¹ç®åœ)
ââ src/
â ââ main/
â ââ java/
â â ââ com/
â â ââ example/
â â ââ order/
â â ââ adapter/ # éé
å±
â â â ââ web/
â â â â ââ OrderController.java # REST APIæ§å¶åš
â â â â ââ OrderDetailController.java
â â â ââ mq/ # æ¶æ¯çå¬åš
â â â ââ OrderEventListener.java
â â â
â â ââ client/ # æ¥å£å±ïŒå¯¹å€APIïŒ
â â â ââ api/ # æå¡æ¥å£å®ä¹
â â â â ââ OrderServiceI.java # æ¥å£å£°æ
â â â â ââ OrderQueryServiceI.java
â â â ââ dto/ # æ°æ®äŒ èŸå¯¹è±¡
â â â ââ command/
â â â â ââ CreateOrderCmd.java
â â â â ââ CancelOrderCmd.java
â â â ââ query/
â â â â ââ OrderQry.java
â â â ââ data/
â â â ââ OrderDTO.java # è¿åç»åç«¯çæ°æ®
â â â ââ OrderDetailDTO.java
â â â
â â ââ app/ # åºçšå±ïŒçšäŸçŒæïŒ
â â â ââ executor/ # çšäŸæ§è¡åšïŒäºå¡èŸ¹çïŒ
â â â â ââ CreateOrderCmdExe.java
â â â â ââ CancelOrderCmdExe.java
â â â â ââ OrderQryExe.java
â â â ââ service/ # æå¡å®ç°ïŒéå¿
é¡»ïŒ
â â â ââ OrderServiceImpl.java # å®ç°Clientå±çæ¥å£
â â â
â â ââ domain/ # é¢åå±ïŒæ žå¿äžå¡ïŒ
â â â ââ model/ # é¢åæš¡åïŒå
è¡æš¡åïŒ
â â â â ââ entity/
â â â â â ââ Order.java # 订åå®äœïŒå«äžå¡é»èŸïŒ
â â â â â ââ OrderItem.java # 订å项åŒå¯¹è±¡
â â â â â ââ OrderStatus.java # æäžŸ
â â â â ââ aggregate/ # èåæ ¹ïŒè¥å€æé¢åïŒ
â â â â ââ OrderAggregate.java
â â â ââ service/ # é¢åæå¡
â â â â ââ OrderDomainService.java # è·šå®äœçäžå¡é»èŸ
â â â ââ gateway/ # é¢åçœå
³æ¥å£
â â â â ââ OrderGateway.java # ä»åšæ¥å£
â â â â ââ InventoryGateway.java # é²è
屿¥å£
â â â ââ event/ # é¢åäºä»¶å®ä¹
â â â ââ OrderCreatedEvent.java
â â â
â â ââ infrastructure/ # åºç¡è®Ÿæœå±
â â ââ config/ # é
眮类
â â â ââ WebConfig.java
â â â ââ MybatisConfig.java
â â ââ persistence/ # æä¹
åå®ç°
â â â ââ mapper/ # MyBatis Mapper
â â â â ââ OrderMapper.java
â â â ââ dataobject/ # æ°æ®åºå®äœDO
â â â â ââ OrderDO.java
â â â ââ converter/ # 蜬æ¢åš
â â â ââ OrderConverter.java # DO<->Entity蜬æ¢
â â ââ gatewayimpl/ # çœå
³å®ç°
â â â ââ OrderGatewayImpl.java
â â â ââ InventoryGatewayImpl.java
â â ââ mq/ # æ¶æ¯äžéŽä»¶å®ç°
â â â ââ RocketMQProducer.java
â â ââ external/ # å€éšæå¡è°çš
â â ââ InventoryClient.java # è°çšåºåæå¡
â â
â ââ resources/
â ââ mapper/ # MyBatis XML
â â ââ OrderMapper.xml
â ââ application.yml
â ââ logback-spring.xml
â
ââ pom.xml
ââ README.md
ââ .gitignore
DDD å®è·µèŠç¹ïŒ
- äŸèµå眮ååïŒä» adapter â app â domain â infrastructureïŒäž¥æ ŒéµåŸªäŸèµæ¹åïŒé¢åå±äžäŸèµä»»äœå€é𿿝
- é¢åæš¡åç¬ç«ïŒdomain å å®å šç¬ç«ïŒå å«çº¯äžå¡é»èŸïŒå¯ç¬ç«è¿è¡åå æµè¯
- ææ¯éçŠ»ïŒææææ¯ç»èïŒæ°æ®åºãæ¶æ¯éåãå€éšæå¡è°çšïŒå°è£ åš infrastructure å±ïŒéè¿æ¥å£äžé¢åå±äº€äº
- èåèŸ¹çæž æ°ïŒOrder äœäžºèåæ ¹ïŒç»Žæ€ OrderItem çäžèŽæ§ïŒææäžå¡æäœéè¿èåæ ¹è¿è¡
- é¢åäºä»¶é©±åšïŒéè¿é¢åäºä»¶å®ç°è·šèåãè·šäžäžæçè§£èŠéä¿¡
éçšäºè¶ 倧åå€æç³»ç»ïŒåŠé¶è¡æ žå¿ç³»ç»ïŒïŒéèŠäž¥æ Œçç©çé犻åç¬ç«éšçœ²èœåïŒ
cola-platform/ (Mavenç¶å·¥çš)
ââ start/ # å¯åšæš¡åïŒSpring Bootå
¥å£ïŒ
â ââ src/main/java/
â â ââ com/example/platform/
â â ââ PlatformApplication.java # äž»å¯åšç±»
â ââ src/main/resources/
â â ââ application.yml # äž»é
眮æä»¶
â ââ pom.xml # äŸèµå
¶ä»æææš¡å
â
ââ adapter/ # éé
屿š¡å
â ââ src/main/java/
â â ââ com/example/platform/adapter/
â â ââ web/ # Webéé
åš
â â ââ mq/ # æ¶æ¯éé
åš
â â ââ rpc/ # RPCéé
åš
â ââ pom.xml # äŸèµclientãappæš¡å
â
ââ client/ # æ¥å£å±æš¡åïŒç¬ç«JARïŒ
â ââ src/main/java/
â â ââ com/example/platform/client/
â â ââ api/ # æå¡æ¥å£
â â ââ dto/ # æ°æ®äŒ èŸå¯¹è±¡
â ââ pom.xml # 纯æ¥å£ïŒæ å€éšäŸèµ
â
ââ app/ # åºçšå±æš¡å
â ââ src/main/java/
â â ââ com/example/platform/app/
â â ââ executor/ # çšäŸæ§è¡åš
â â ââ service/ # æå¡å®ç°
â ââ pom.xml # äŸèµdomainæš¡å
â
ââ domain/ # é¢å屿š¡åïŒæ žå¿ïŒ
â ââ src/main/java/
â â ââ com/example/platform/domain/
â â ââ model/ # é¢åæš¡å
â â ââ service/ # é¢åæå¡
â â ââ gateway/ # çœå
³æ¥å£
â ââ pom.xml # 纯äžå¡ïŒæ å€éšäŸèµ
â
ââ infrastructure/ # åºç¡è®Ÿæœå±æš¡å
â ââ src/main/java/
â â ââ com/example/platform/infrastructure/
â â ââ persistence/ # æä¹
å
â â ââ gatewayimpl/ # çœå
³å®ç°
â â ââ external/ # å€éšè°çš
â â ââ config/ # é
眮
â ââ pom.xml # äŸèµdomainïŒå¯äŸèµå€éšSDK
â
ââ common/ # éçšå·¥å
·æš¡åïŒå¯éïŒ
â ââ src/main/java/
â â ââ com/example/platform/common/
â â ââ util/ # å·¥å
·ç±»
â â ââ constant/ # åžžé
â â ââ exception/ # åŒåžžå®ä¹
â ââ pom.xml
â
ââ pom.xml # ç¶POMïŒç®¡çææåæš¡å

