淺談Java開(kāi)發(fā)架構(gòu)之領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)DDD落地
整個(gè)過(guò)程大概是這樣的,開(kāi)發(fā)團(tuán)隊(duì)和領(lǐng)域?qū)<乙黄鹜ㄟ^(guò) 通用語(yǔ)言(Ubiquitous Language)去理解和消化領(lǐng)域知識(shí),從領(lǐng)域知識(shí)中提取和劃分為一個(gè)一個(gè)的子領(lǐng)域(核心子域,通用子域,支撐子域),并在子領(lǐng)域上建立模型,再重復(fù)以上步驟,這樣周而復(fù)始,構(gòu)建出一套符合當(dāng)前領(lǐng)域的模型。
依靠領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)的設(shè)計(jì)思想,通過(guò)事件風(fēng)暴建立領(lǐng)域模型,合理劃分領(lǐng)域邏輯和物理邊界,建立領(lǐng)域?qū)ο蠹胺?wù)矩陣和服務(wù)架構(gòu)圖,定義符合DDD分層架構(gòu)思想的代碼結(jié)構(gòu)模型,保證業(yè)務(wù)模型與代碼模型的一致性。通過(guò)上述設(shè)計(jì)思想、方法和過(guò)程,指導(dǎo)團(tuán)隊(duì)按照DDD設(shè)計(jì)思想完成微服務(wù)設(shè)計(jì)和開(kāi)發(fā)。
1、拒絕泥球小單體、拒絕污染功能與服務(wù)、拒絕一加功能排期一個(gè)月
2、架構(gòu)出高可用極易符合互聯(lián)網(wǎng)高速迭代的應(yīng)用服務(wù)
3、物料化、組裝化、可編排的服務(wù),提高人效
三、服務(wù)架構(gòu)接口服務(wù)位于用戶接口層,用于處理用戶發(fā)送的Restful請(qǐng)求和解析用戶輸入的配置文件等,并將信息傳遞給應(yīng)用層。
四、開(kāi)發(fā)環(huán)境jdk1.8【jdk1.7以下只能部分支持netty】
springboot 2.0.6.RELEASE
idea + maven
五、代碼示例itstack-demo-ddd-01
└── src
├── main
│ ├── java
│ │ └── org.itstack.demo
│ │ ├── application
│ │ │├── event
│ │ ││ └── ApplicationRunner.java
│ │ │└── service
│ │ │ └── UserService.java
│ │ ├── domain
│ │ │├── model
│ │ ││ ├── aggregates
│ │ ││ │ └── UserRichInfo.java
│ │ ││ └── vo
│ │ ││ ├── UserInfo.java
│ │ ││ └── UserSchool.java
│ │ │├── repository
│ │ ││ └── IuserRepository.java
│ │ │└── service
│ │ │ └── UserServiceImpl.java
│ │ ├── infrastructure
│ │ │├── dao
│ │ ││ ├── impl
│ │ ││ │ └── UserDaoImpl.java
│ │ ││ └── UserDao.java
│ │ │├── po
│ │ ││ └── UserEntity.java
│ │ │├── repository
│ │ ││ ├── mysql
│ │ ││ │ └── UserMysqlRepository.java
│ │ ││ ├── redis
│ │ ││ │ └── UserRedisRepository.java
│ │ ││ └── UserRepository.java
│ │ │└── util
│ │ │ └── RdisUtil.java
│ │ ├── interfaces
│ │ │├── dto
│ │ ││└── UserInfoDto.java
│ │ │└── facade
│ │ │└── DDDController.java
│ │ └── DDDApplication.java
│ ├── resources
│ │ └── application.yml
│ └── webapp
│ └── WEB-INF
│ └── index.jsp
└── test
└── java
└── org.itstack.demo.test
└── ApiTest.java
application/UserService.java | 應(yīng)用層用戶服務(wù),領(lǐng)域?qū)臃?wù)做具體實(shí)現(xiàn)
public interface UserService { UserRichInfo queryUserInfoById(Long id);}
domain/repository/IuserRepository.java | 領(lǐng)域?qū)淤Y源庫(kù),由基礎(chǔ)層實(shí)現(xiàn)
public interface IUserRepository { void save(UserEntity userEntity); UserEntity query(Long id);}
domain/service/UserServiceImpl.java | 應(yīng)用層實(shí)現(xiàn)類(lèi),應(yīng)用層是很薄的一層可以只做服務(wù)編排
@Service('userService')public class UserServiceImpl implements UserService { @Resource(name = 'userRepository') private IUserRepository userRepository; @Override public UserRichInfo queryUserInfoById(Long id) {// 查詢資源庫(kù)UserEntity userEntity = userRepository.query(id);UserInfo userInfo = new UserInfo();userInfo.setName(userEntity.getName());// TODO 查詢學(xué)校信息,外部接口UserSchool userSchool_01 = new UserSchool();userSchool_01.setSchoolName('振華高級(jí)實(shí)驗(yàn)中學(xué)');UserSchool userSchool_02 = new UserSchool();userSchool_02.setSchoolName('東北電力大學(xué)');List<UserSchool> userSchoolList = new ArrayList<>();userSchoolList.add(userSchool_01);userSchoolList.add(userSchool_02);UserRichInfo userRichInfo = new UserRichInfo();userRichInfo.setUserInfo(userInfo);userRichInfo.setUserSchoolList(userSchoolList);return userRichInfo; }}
infrastructure/po/UserEntity.java | 數(shù)據(jù)庫(kù)對(duì)象類(lèi)
public class UserEntity { private Long id; private String name; get/set ...}
infrastructrue/repository/UserRepository.java | 領(lǐng)域?qū)佣x接口,基礎(chǔ)層資源庫(kù)實(shí)現(xiàn)
@Repository('userRepository')public class UserRepository implements IUserRepository { @Resource(name = 'userMysqlRepository') private IUserRepository userMysqlRepository; @Resource(name = 'userRedisRepository') private IUserRepository userRedisRepository; @Override public void save(UserEntity userEntity) {//保存到DBuserMysqlRepository.save(userEntity);//保存到RedisuserRedisRepository.save(userEntity); } @Override public UserEntity query(Long id) {UserEntity userEntityRedis = userRedisRepository.query(id);if (null != userEntityRedis) return userEntityRedis;UserEntity userEntityMysql = userMysqlRepository.query(id);if (null != userEntityMysql){ //保存到Redis userRedisRepository.save(userEntityMysql); return userEntityMysql;}// 查詢?yōu)镹ULLreturn null; }}
interfaces/dto/UserInfoDto.java | DTO對(duì)象類(lèi),隔離數(shù)據(jù)庫(kù)類(lèi)
public class UserInfoDto { private Long id;// ID public Long getId() {return id; } public void setId(Long id) {this.id = id; }}
interfaces/facade/DDDController.java | 門(mén)面接口
@Controllerpublic class DDDController { @Resource(name = 'userService') private UserService userService; @RequestMapping('/index') public String index(Model model) {return 'index'; } @RequestMapping('/api/user/queryUserInfo') @ResponseBody public ResponseEntity queryUserInfo(@RequestBody UserInfoDto request) {return new ResponseEntity<>(userService.queryUserInfoById(request.getId()), HttpStatus.OK); }}六、綜上總結(jié)
以上基于DDD一個(gè)基本入門(mén)的結(jié)構(gòu)演示完成,實(shí)際開(kāi)發(fā)可以按照此模式進(jìn)行調(diào)整。目前這個(gè)架構(gòu)分層還不能很好的進(jìn)行分離,以及層級(jí)關(guān)系的引用還不利于擴(kuò)展。
以上就是淺談Java開(kāi)發(fā)架構(gòu)之領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)DDD落地的詳細(xì)內(nèi)容,更多關(guān)于Java開(kāi)發(fā)架構(gòu) 領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)DDD落地的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!
相關(guān)文章:
1. CSS hack用法案例詳解2. css進(jìn)階學(xué)習(xí) 選擇符3. CSS Hack大全-教你如何區(qū)分出IE6-IE10、FireFox、Chrome、Opera4. 使用css實(shí)現(xiàn)全兼容tooltip提示框5. 低版本IE正常運(yùn)行HTML5+CSS3網(wǎng)站的3種解決方案6. 使用純HTML的通用數(shù)據(jù)管理和服務(wù)7. css代碼優(yōu)化的12個(gè)技巧8. 告別AJAX實(shí)現(xiàn)無(wú)刷新提交表單9. HTML DOM setInterval和clearInterval方法案例詳解10. CSS3實(shí)例分享之多重背景的實(shí)現(xiàn)(Multiple backgrounds)
